Criação de Componentes
Para criar novos componentes, precisamos fazer algumas coisas antes de começar a codificá-los no renderer. Há um guia passo a passo que você precisa seguir. Vou listar todos os passos e, em seguida, você pode seguir cada passo com uma explicação mais longa.
Crie a definição proto em @dcl/protocol
Gere o novo código proto TypeScript no js-sdk-toolchain
Crie um teste para
js-sdk-toolchainGere o novo código proto C# no projeto
Codifique o novo componente
Garanta que o componente siga a convenção
Crie a definição proto em @dcl/protocol
Para criar uma definição, você deve ir para este repositório: https://github.com/decentraland/protocol
Crie a definição proto nesta pasta: https://github.com/decentraland/protocol/tree/main/ecs/components
Crie um PR com as novas alterações
NOTA: Após criar o PR, um Bot do GitHub comentará com o link do pacote para testar o PR. Você pode usar esse link para testar nas etapas seguintes
Coisas a ter em conta
Estamos usando proto 3, então toda a definição do proto deve compilar com sua syntax
Temos alguns tipos comuns que não podem ser recriados
O proto deve ter a definição básica
Você deve adicionar o seguinte código para enumerar o componente
Exemplo de .proto
Gere o novo código proto TypeScript no js-sdk-toolchain
Baixe o seguinte repositório: https://github.com/decentraland/js-sdk-toolchain
Dentro dele, navegue para packages/dcl/ecs (https://github.com/decentraland/js-sdk-toolchain/tree/main/packages/%40dcl/ecs)
E lá, você pode executar
Ou o comando gerado pelo Bot do GitHub no seu PR do @dcl/protocol (isso deve ser temporário para testar os PRs).
Então execute os seguintes comandos na raiz do js-sdk-toolchain project:
E envie (push) o código gerado.
Gere o novo código proto C# no projeto
Para gerar o código C#, precisamos ir para o protocol-gen caminho na raiz do @decentraland/unity-renderer repositório. E executar os seguintes comandos:
Para atualizar para a versão mais recente do @dcl/protocol (main branch), devemos atualizar usando
Para testar um PR, podemos usar uma URL gerada pelo Bot do GitHub no @dcl/protocol PR: Exemplo:
Após mesclar o PR do @dcl/protocol, devemos usar o @dcl/protocol@next e gerar o código.
Codifique o novo componente
Agora é hora de implementar a funcionalidade do novo componente.
Os componentes têm cinco partes essenciais.
ComponentID O ID que o componente usará. Deve ser único e gerado a partir da definição proto
Model Este é o modelo do componente. Esses são os dados que usaremos para manipular o componente. Ele foi gerado automaticamente com a geração do proto e tem o mesmo nome do arquivo proto com um PB na frente. Por exemplo, se você tiver um
BoxShape.protodefinition a classe gerada do modelo seráPBBoxShapeComponent Handler O component handler gerenciará toda a funcionalidade do componente. Nesta classe você deve implementar o
IECSComponentHandler<ModelClass>(ModelClass é o modelo. É uma classe gerada a partir do proto, o nome será PB + nome do arquivo .proto). Esta interface tem 3 métodos que são importantes implementar para criar um componente
Serializer Cada componente é responsável por implementar sua serialização e desserialização do componente. Este serializer deve ser capaz de serializar/desserializar para um array de bytes
Register Isto registrará o componente no sistema, conectando-o ao sistema. Este registro irá registrar o componente na factory e no component writer
O design dos componentes evita herança, então incentivamos o uso de funções puras tanto quanto possível
Para criá-los, devemos seguir os próximos passos
Crie a pasta do componente e a assembly. Temos todos os componentes sob a seguinte pasta
DCLPlugins/ECS7/ECSComponents. Você precisa criar uma pasta e uma nova assembly que conterá o componenteNa nova assembly, você deve referenciar a seguinte
DCL.ECSComponents.Data. Isso referenciará o novo modelo do componente que você acabou de atualizarVocê deve criar o component handler com toda a lógica (Dê uma olhada em
ECSBoxShapeComponentHandler.cscomo exemplo)Você deve criar a classe serializer (provavelmente você pode copiá-la de outra classe e adaptar ao seu)
Você deve criar a classe register
Adicione o novo register ao
ECS7ComponentsComposerclass com seu ID correspondente
E agora você tem seu componente adicionado e funcionando!
Garanta que o componente siga a convenção
Há uma lista de verificação que precisamos ter em conta ao desenvolver novos componentes; esta parte tenta resumi-las.
Unit test Todos os componentes devem incluir unit tests que cubram sua funcionalidade, dispose e a serialização/desserialização pelo menos para garantir que o componente funcionará
Leve em conta o que acontece quando o componente não está dentro da cena (Verifique
SceneBoundariesCheckerclasse para mais informações)Se o componente renderiza algo no world, ele deve adicionar a informação renderizável ao data store, dessa forma adicionamos a informação do renderer à cena para que conte para o limite
Se o componente renderiza algo no world, ele deve adicionar o
MeshesInfoà entidadeDeve ser o mais performático possível. Este código será executado muitas vezes, então precisamos garantir que tudo funcione o mais suavemente possível
Deve funcionar com
Hot reloadno modo preview. Se você codificou oOnComponentRemovedcorretamente, isso funcionará automaticamente, mas o hot reload é uma forma de testar que tudo funciona bem com o dispose do componenteSe o componente usa um recurso, você deve implementar o gerenciamento de recursos com um
AssetPromiseKeeper. O componente deve notificar oAssetPromiseKeeperquando o recurso é usado e quando não é mais usado
Atualizado