Al diseñar un sistema de componente de entidad para mi motor, me encontré con un pequeño inconveniente en la forma de almacenar y recuperar un tipo particular de componente.
Primero, permítanme aclarar un poco la terminología que usaré en esta pregunta:
- Llamo a " Componente " una estructura de datos que almacena datos relevantes para un sistema en particular.
- Llamo " Sistema " a una agregación de métodos y estructuras de datos que hace uso de Componentes para actualizar el estado / interfaz del juego con el usuario.
- Una " Entidad " es básicamente una identificación utilizada para recuperar componentes específicos y modificar sus datos en la lógica del juego.
Cada sistema posee una matriz (mapeada por ID) de su tipo de Componente (Ej. Física-> Componente Físico, AI-> Componente AIC, Representación-> Componente de Representación), para que pueda iterar eficientemente sobre los datos.
Sin embargo, no todos los componentes pertenecen específicamente a un sistema. Por ejemplo, un componente Transformar almacena la posición, rotación y escala de un objeto. Es una de las partes más importantes de una entidad (Unity la hace obligatoria, incluso), ya que es utilizada por muchos sistemas, por ejemplo, física, inteligencia artificial, renderización, etc.
Este es más o menos el problema que estoy enfrentando. Dado que muchos otros sistemas usan Transform, ¿cómo debo hacer para recuperar uno para cada Componente? Una posible solución que veo es hacer que cada componente almacene su propia ID de entidad. Sería fácil recuperar cualquier componente como este, pero no sería tan eficiente, y también iría en contra del concepto de un Componente como un paquete de datos aislado e independiente, que no conoce ningún otro.
¿Hay una manera adecuada de resolver este problema? ¿Transformar debería ser incluso un componente?