Systemy powinny przechowywać parę kluczowych wartości Entity to Component w jakimś rodzaju mapy, obiektu słownikowego lub tablicy asocjacyjnej (w zależności od używanego języka). Ponadto, kiedy tworzysz swój Obiekt Entity, nie martwię się o przechowywanie go w menedżerze, chyba że będziesz w stanie wyrejestrować go z dowolnego Systemu. Jednostka jest złożona ze składników, ale nie powinna obsługiwać żadnej z aktualizacji składników. Powinno to być obsługiwane przez systemy. Zamiast tego traktuj swoją jednostkę jako klucz, który jest mapowany na wszystkie komponenty zawarte w systemach, a także jako centrum komunikacyjne dla tych komponentów, aby ze sobą rozmawiać.
Wielką częścią modeli Entity-Component-System jest to, że można dość łatwo wdrożyć możliwość przekazywania komunikatów z jednego komponentu do reszty komponentów encji. Pozwala to komponentowi na rozmowę z innym komponentem bez faktycznej wiedzy o tym, kim jest ten komponent i jak obsługiwać komponent, który zmienia. Zamiast tego przekazuje komunikat i pozwala komponentowi się zmienić (jeśli istnieje)
Na przykład, System Pozycji nie miałby w nim dużo kodu, jedynie śledziłby Obiekty Istoty odwzorowane na ich Komponenty Pozycji. Ale gdy pozycja się zmienia, mogą wysłać wiadomość do zaangażowanej Jednostki, która z kolei jest przekazywana wszystkim komponentom tej jednostki. Z jakiejkolwiek przyczyny zmienia się pozycja? System pozycji wysyła Entity wiadomość z informacją, że pozycja uległa zmianie, a gdzieś element renderujący obraz tego podmiotu otrzymuje ten komunikat i aktualizuje, gdzie się następnie narysuje.
I odwrotnie, system fizyki musi wiedzieć, co robią wszystkie jego obiekty; Musi być w stanie zobaczyć wszystkie obiekty świata w celu przetestowania kolizji. Kiedy dochodzi do kolizji, aktualizuje komponent kierunku encji, wysyłając do encji coś w rodzaju „komunikatu zmiany kierunku” zamiast odwoływać się bezpośrednio do komponentu encji. To uniezależnia menedżera od konieczności zmiany kierunków za pomocą komunikatu zamiast polegania na określonym elemencie (którego może wcale nie być, w takim przypadku wiadomość po prostu głucha zamiast jakiegoś błędu) występujące, ponieważ oczekiwany obiekt był nieobecny).
Zauważysz ogromną przewagę, ponieważ wspomniałeś, że masz interfejs sieciowy. Komponent sieciowy nasłuchi wszystkich nadchodzących wiadomości, o których wszyscy inni powinni wiedzieć. Uwielbia plotki. Następnie, gdy system sieciowy się aktualizuje, komponenty sieciowe wysyłają te wiadomości do innych systemów sieciowych na innych komputerach klienckich, które następnie wysyłają te wiadomości do wszystkich innych komponentów w celu aktualizacji pozycji odtwarzacza itp. Może być potrzebna specjalna logika, aby tylko niektóre podmioty mogły wysyłać wiadomości przez sieć, ale to jest piękno Systemu, możesz po prostu kontrolować tę logikę, rejestrując odpowiednie rzeczy.
W skrócie:
Podmiot to kompozycja składników, które mogą odbierać wiadomości. Jednostka może odbierać wiadomości, delegując je do wszystkich swoich składników, aby je zaktualizować. (Wiadomość ze zmienioną pozycją, Kierunek zmiany prędkości itp.) To jak centralna skrzynka pocztowa, w której wszystkie elementy mogą słyszeć od siebie zamiast rozmawiać bezpośrednio ze sobą.
Komponent to niewielka część encji, która przechowuje pewien stan encji. Są one w stanie analizować niektóre wiadomości i wyrzucać inne. Na przykład „komponent kierunku” będzie dbał tylko o „komunikaty zmiany kierunku”, ale nie „komunikaty zmiany pozycji”. Składniki aktualizują swój stan na podstawie komunikatów, a następnie aktualizują stany innych składników, wysyłając wiadomości ze swojego systemu.
System zarządza wszystkimi komponentami określonego typu i jest odpowiedzialny za aktualizację wymienionych komponentów w każdej ramce, a także za wysyłanie wiadomości z zarządzanych przez nich komponentów do encji, do których należą komponenty
Systemy mogą być w stanie równolegle aktualizować wszystkie swoje komponenty i przechowywać wszystkie wiadomości w miarę ich przemieszczania. Następnie, po zakończeniu wykonywania wszystkich metod aktualizacji systemów, należy poprosić każdy system o wysłanie wiadomości w określonej kolejności. Najpierw kontrole, następnie fizyka, następnie kierunek, pozycja, rendering itp. To ma znaczenie, w jakiej kolejności są wysyłane, ponieważ zmiana kierunku fizyki zawsze powinna wyważyć zmianę kierunku opartą na kontroli.
Mam nadzieję że to pomoże. To piekielnie wzorzec projektowy, ale jest absurdalnie potężny, jeśli zostanie wykonany poprawnie.