Projektując układ encji-komponentu dla mojego silnika, natknąłem się na małą przeszkodę w sposobie przechowywania i wyszukiwania określonego typu komponentu.
Po pierwsze, pozwól mi wyjaśnić trochę terminologii, której zamierzam użyć w tym pytaniu:
- Nazywam „ Component ” strukturą danych, która przechowuje odpowiednie dane dla konkretnego systemu.
- Nazywam „ System ” agregacją metod i struktur danych, która wykorzystuje Składniki do aktualizacji stanu / interfejsu gry z użytkownikiem.
- „ Entity ” to w zasadzie tylko identyfikator służący do pobierania określonych składników i modyfikowania ich danych w logice gry.
Każdy system posiada tablicę (odwzorowaną na ID) swojego typu Component (np. Physics-> PhysicsComponent, AI-> AIComponent, Rendering-> RenderingComponent), aby mógł efektywnie iterować dane.
Jednak nie wszystkie komponenty są własnością systemu. Na przykład komponent Transform przechowuje pozycję, obrót i skalę obiektu. Jest to jedna z najważniejszych części bytu (Unity sprawia, że jest ona nawet obowiązkowa), ponieważ jest używana przez wiele systemów, np. Fizykę, sztuczną inteligencję, renderowanie itp.
To właściwie problem, z którym się zmagam. Ponieważ Transform jest używany przez wiele innych systemów, w jaki sposób powinienem zacząć pobierać jeden do użycia dla każdego komponentu? Jednym z możliwych rozwiązań, które widzę, jest skonfigurowanie każdego komponentu do przechowywania własnego identyfikatora jednostki. Łatwo byłoby odzyskać dowolny taki komponent, ale nie byłby tak wydajny, a także byłby sprzeczny z koncepcją komponentu jako izolowanego i niezależnego pakietu danych, który nie jest świadomy żadnego innego.
Czy istnieje właściwy sposób rozwiązania tego problemu? Czy transformacja powinna być nawet składnikiem?