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.

  1. Crear la definición proto en @dcl/protocolarrow-up-right

  2. Generar el nuevo código proto TypeScript en el js-sdk-toolchainarrow-up-right

  3. Crear una prueba para js-sdk-toolchain

  4. Generar el nuevo código proto C# en el proyecto

  5. Codificar el nuevo componente

  6. Asegurarse de que el componente sigue la convención

Crear la definición proto en @dcl/protocolarrow-up-right

Para crear una definición, debes ir a este repo: https://github.com/decentraland/protocol

  1. Crea la definición proto en esta carpeta: https://github.com/decentraland/protocol/tree/main/ecs/components

  2. 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 syntaxarrow-up-right

  • 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-toolchainarrow-up-right

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.proto definición la clase generada del modelo será PBBoxShape

  • Component 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

  1. 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 componente

  2. En la nueva assembly, debes referenciar la siguiente DCL.ECSComponents.Data. Esto referenciará el nuevo modelo del componente que acabas de actualizar

  3. Debes crear el component handler con toda la lógica (Mira ECSBoxShapeComponentHandler.cs como ejemplo)

  4. Debes crear la clase serializer (probablemente puedas copiarla de otra clase y adaptarla a la tuya)

  5. Debes crear la clase register

  1. Agrega el nuevo register al ECS7ComponentsComposer class 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 SceneBoundariesChecker clase 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 MeshesInfo a la entidad

  • Debe 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 reload en el modo preview. Si has codificado el OnComponentRemoved correctamente, esto funcionará automáticamente, pero el hot reload es una forma de probar que todo funciona bien con el dispose del componente

  • Si el componente usa un recurso, debes implementar la gestión de recursos con un AssetPromiseKeeper. El componente debe notificar al AssetPromiseKeeper cuando el recurso se está usando y cuando ya no se usa

Última actualización