Nel progettare un sistema di componenti entità per il mio motore, mi sono imbattuto in un piccolo ostacolo nel modo di memorizzare e recuperare un particolare tipo di componente.
Prima di tutto, lasciami chiarire un po 'di terminologia che userò in questa domanda:
- Chiamo " Component " una struttura di dati che memorizza i dati rilevanti per un determinato sistema.
- Chiamo " Sistema " un'aggregazione di metodi e strutture di dati che utilizza Componenti per aggiornare lo stato / l'interfaccia del gioco con l'utente.
- Un " Entity " è fondamentalmente solo un ID utilizzato per recuperare componenti specifici e modificare i loro dati nella logica di gioco.
Ogni sistema possiede un array (mappato ID) del suo tipo di Componente (es. Fisica-> PhysicsComponent, AI-> AIComponent, Rendering-> RenderingComponent), in modo che possa iterare efficacemente sui dati.
Tuttavia, non tutti i componenti sono specificamente di proprietà di un sistema. Ad esempio, un componente Trasforma memorizza la posizione, la rotazione e la scala di un oggetto. È una delle parti più importanti di un'entità (Unity lo rende obbligatorio, anche), poiché viene utilizzato da molti sistemi, ad esempio Fisica, AI, Rendering, ecc.
Questo è praticamente il problema che sto affrontando. Poiché Transform è utilizzato da molti altri sistemi, come devo fare per recuperarne uno da utilizzare per ciascun componente? Una possibile soluzione che vedo è quella di fare in modo che ciascun componente memorizzi il proprio ID entità. Sarebbe facile recuperare qualsiasi componente come questo, ma non sarebbe così efficiente e andrebbe anche contro il concetto di un Componente come un insieme isolato e indipendente di dati, che non è a conoscenza di nessun altro.
C'è un modo corretto per risolvere questo problema? Transform dovrebbe anche essere un componente?