Creación de componentes
Para crear nuevos componentes, necesitamos hacer un par de cosas antes de empezar a codificarlos en el renderer. Hay una guía paso a paso que debes seguir. Enumeraré todos los pasos y luego podrás seguir cada paso con una explicación más larga.
Crear la definición proto en @dcl/protocol
Generar el nuevo código proto TypeScript en el js-sdk-toolchain
Crear una prueba para
js-sdk-toolchainGenerar el nuevo código proto C# en el proyecto
Codificar el nuevo componente
Asegurarse de que el componente sigue la convención
Crear la definición proto en @dcl/protocol
Para crear una definición, debes ir a este repo: https://github.com/decentraland/protocol
Crea la definición proto en esta carpeta: https://github.com/decentraland/protocol/tree/main/ecs/components
Crear un PR con los cambios nuevos
NOTA: Después de crear el PR, un Bot de GitHub comentará con el enlace del paquete para probar el PR. Puedes usar ese enlace para las pruebas en los siguientes pasos
Cosas a tener en cuenta
Estamos usando proto 3, por lo que toda la definición del proto debe compilar con su syntax
Tenemos algunos tipos comunes que no se pueden recrear
El proto debe tener la definición básica
Debes añadir el siguiente código para enumerar el componente
Ejemplo de .proto
Generar el nuevo código proto TypeScript en el js-sdk-toolchain
Descarga el siguiente repo: https://github.com/decentraland/js-sdk-toolchain
Dentro de él, navega a packages/dcl/ecs (https://github.com/decentraland/js-sdk-toolchain/tree/main/packages/%40dcl/ecs)
Y allí, puedes ejecutar
O el comando generado por el Bot de GitHub en tu PR de @dcl/protocol (esto debe ser temporal para probar los PR).
Luego ejecuta los siguientes comandos en la raíz del js-sdk-toolchain project:
Y sube el código generado.
Generar el nuevo código proto C# en el proyecto
Para generar el código C#, necesitamos ir al protocol-gen path in the root of the @decentraland/unity-renderer repository. And execute the following commands:
Para actualizar a la última versión del @dcl/protocol (main branch), deberíamos actualizar usando
Para probar un PR, podemos usar una URL generada por el Bot de GitHub en el @dcl/protocol PR: Ejemplo:
Después de fusionar el PR de @dcl/protocol, debemos usar el @dcl/protocol@next y generar el código.
Codificar el nuevo componente
Ahora es momento de implementar la funcionalidad del nuevo componente.
Los componentes tienen cinco partes esenciales.
ComponentID El ID que usará el componente. Debe ser único y generado a partir de la definición proto
Model Este es el modelo del componente. Estos son los datos que usaremos para manejar el componente. Ha sido autogenerado con la generación proto y tiene el mismo nombre del archivo proto con un PB al frente. Por ejemplo, si tienes un
BoxShape.protodefinición la clase generada del modelo seráPBBoxShapeComponent Handler El manejador del componente administrará toda la funcionalidad del componente. En esta clase debes implementar el
IECSComponentHandler<ModelClass>(ModelClass es el modelo. Es una clase generada a partir del proto, el nombre será PB + nombre del archivo .proto). Esta interfaz tiene 3 métodos que son importantes de implementar para crear un componente
Serializer Cada componente es responsable de implementar su serialización y deserialización del componente. Este serializer debe ser capaz de serializar/deserializar a array de bytes
Register Esto registrará el componente en el sistema, conectándolo al sistema. Este registro añadirá el componente en la factory y el component writer
El diseño de los componentes busca evitar la herencia, por lo que recomendamos usar funciones puras tanto como sea posible
Para crearlos, debemos seguir los siguientes pasos
Crea la carpeta del componente y la assembly. Tenemos todos los componentes bajo la siguiente carpeta
DCLPlugins/ECS7/ECSComponents. Necesitas crear una carpeta y una nueva assembly que contendrá el componenteEn la nueva assembly, debes referenciar la siguiente
DCL.ECSComponents.Data. Esto referenciará el nuevo modelo del componente que acabas de actualizarDebes crear el component handler con toda la lógica (Mira
ECSBoxShapeComponentHandler.cscomo ejemplo)Debes crear la clase serializer (probablemente puedas copiarla de otra clase y adaptarla a la tuya)
Debes crear la clase register
Agrega el nuevo register al
ECS7ComponentsComposerclass con su correspondiente ID
¡Y ahora tienes tu componente añadido y funcionando!
Asegurarse de que el componente sigue la convención
Hay una lista de verificación que debemos tener en cuenta mientras desarrollamos nuevos componentes; esta parte intenta resumirla.
Unit test Todos los componentes deben incluir pruebas unitarias que cubran su funcionalidad, el dispose y la serialización/deserialización al menos para asegurar que el componente funcionará
Ten en cuenta lo que sucede cuando el componente no está dentro de la escena (Revisa
SceneBoundariesCheckerclase para más información)Si el componente renderiza algo en el world, debe añadir la información renderizable al data store, de esta manera añadimos la información del renderer a la escena para que cuente hacia el límite
Si el componente renderiza algo en el world, debe añadir el
MeshesInfoa la entidadDebe ser lo más eficiente posible. Este código se ejecutará muchas veces, por lo que debemos asegurar que todo funcione lo más fluido posible
Debe funcionar con
Hot reloaden el modo preview. Si has codificado elOnComponentRemovedcorrectamente, esto funcionará automáticamente, pero el hot reload es una forma de probar que todo funciona bien con el dispose del componenteSi el componente usa un recurso, debes implementar la gestión de recursos con un
AssetPromiseKeeper. El componente debe notificar alAssetPromiseKeepercuando el recurso se está usando y cuando ya no se usa
Última actualización