Ao projetar um sistema de entidade-componente para o meu mecanismo, deparei-me com um pequeno obstáculo na maneira de armazenar e recuperar um tipo específico de componente.
Primeiro, deixe-me esclarecer um pouco da terminologia que vou usar nesta pergunta:
- Eu chamo de " Componente " uma estrutura de dados que armazena dados relevantes para um sistema específico.
- Eu chamo de " sistema " uma agregação de métodos e estruturas de dados que utiliza componentes para atualizar o estado / interface do jogo com o usuário.
- Uma " entidade " é basicamente apenas um ID usado para recuperar componentes específicos e modificar seus dados na lógica do jogo.
Cada sistema possui uma matriz (mapeada por ID) de seu tipo de componente (por exemplo, Física-> Componente físico, AI-> AIComponent, Renderização-> RenderingComponent), para que possa iterar eficientemente os dados.
Porém, nem todos os componentes pertencem especificamente a um sistema. Por exemplo, um componente Transform armazena a posição, rotação e escala de um objeto. É uma das partes mais importantes de uma entidade (o Unity o torna obrigatório, mesmo), pois é usado por muitos sistemas, por exemplo, Física, IA, Renderização etc.
Esse é praticamente o problema que estou enfrentando. Como o Transform é usado por muitos outros sistemas, como devo recuperar um para usar em cada componente? Uma solução possível que vejo é fazer com que cada componente armazene seu próprio ID de entidade. Seria fácil recuperar qualquer componente como esse, mas não seria tão eficiente e também iria contra o conceito de um componente como um pacote de dados isolado e independente, que não conhece nenhum outro.
Existe uma maneira adequada de resolver esse problema? O Transform deve mesmo ser um componente?