Właśnie zmieniamy silnik gry oparty na hierarchii na silnik gry oparty na komponentach. Mój problem polega na tym, że kiedy ładuję model, który ma hierarchię siatek, i rozumiem, że jednostka w systemie opartym na komponentach nie może mieć wielu komponentów tego samego typu, ale potrzebuję „meshComponent” dla każdego siatka w modelu. Jak więc mogę rozwiązać ten problem?
Na tej stronie wdrożyli silnik gry oparty na komponentach: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
architecture
component-based
Mathias Hölzl
źródło
źródło
SkeletalMeshActor
ma tylko jedenSkeletalMeshComponent
. Jest to powszechny problem, który można rozwiązać na wiele różnych sposobów.Odpowiedzi:
Komponent Pozycja może mieć logikę „rodzic / potomek”, w której jakakolwiek Istota z Pozycją może mieć rodzica, a ich pozycja jest względem ich rodzica. Zamiast mieć kilka siatek na tej samej encji, możesz utworzyć więcej niż jedną encję, każda z własną siatką i połączyć je ze sobą. Możesz nawet zmusić dzieci-byty do słuchania ich wydarzeń nadrzędnych (lub dowolnego innego systemu komunikacji między jednostkami) i odpowiednio zareagować.
źródło
ModelComponent
która zawiera hierarchię siatek? Podział bytu tylko na to brzmi jak złe rozwiązanie problemu. Zobacz odpowiedzi Asakerona i Byte56.Twój meshComponent może zawierać listę oczek. Nie jestem pewien, jak wdrażasz silnik, ale system może łatwo iterować wszystkie siatki i po prostu je rysować.
źródło
Utworzyłbym mój komponent siatki z listą obiektów siatki. Każdy obiekt siatki ma dane siatki wraz z odsunięciem. Podczas rysowania system rysowania przyjmuje pozycję z komponentu pozycji, a następnie rysuje każdą siatkę w komponencie siatki w pozycji + przesunięcie.
Możesz mieć wiele siatek wewnątrz komponentu siatki, jednocześnie mówiąc z jednym komponentem siatki na jednostkę.
źródło
TLDR: Na początek komponent składa się z wielu siatek.
Zgadzam się z Asakeron / Byte56 / Laurent, że potrzebny jest inny poziom pośrednictwa między parami siatka / materiał a samą istotą. Zamiast patrzeć na GraphicsComponent jako wierzchołki i materiały, pomyśl o nim jak o kropli pikseli na końcowym rastrze - to, jak się tam dostanie, jest szczegółem implementacji i niczym więcej.
Dużo o tym myślałem w moim projekcie i myślę, że optymalnym rozwiązaniem jest uczynienie GraphicsComponent składnikiem o wiele wyższym, obejmującym większość funkcjonalności tradycyjnego obiektu „Model” - ponieważ ta funkcja nie jest opcjonalna! Aby renderować te wielokąty o wiele więcej niż tylko dane buforowe, potrzebny jest moduł cieniujący, taki jak:
Dotyczy to tylko zasobów 3D, bez uwzględnienia układów cząsteczkowych, billboardów itp. Ale wszystko to dotyczy tylko grafiki / kodu renderującego - nie wpływa na fizykę, dźwięk ani skrypty, więc ma sens komponent Grafika / Rendering.
Skończyło się na:
W tym:
Model to dowolny zasób gry, który ma komponent graficzny.
ModelComponent jest analogiczny do tradycyjnego modelu i tak naprawdę jest w przypadku zasobów 3D. Kontroler GraphicsComponent (jeśli używasz wzorca Model-Widok-Kontroler) jest odpowiedzialny za ustalenie rodzaju zasobu graficznego i prawidłowe rysowanie (zwróć uwagę, że ModelComponent jest podklasą GraphicsComponent).
W moim przypadku było też kilka kompromisów dotyczących prostoty i wstecznej kompatybilności, ponieważ każdy GraphicsComponent jest również Entity, a Entity przechowuje dane pozycji bezpośrednio, więc są obliczane tylko w jednym miejscu, ale idea jest taka sama: GraphicsComponent obsługuje to, co jest potrzebne do narysowania przedmiotu - wszystkiego, co jest potrzebne - nie tylko tego, co pochodzi od modelarza.
źródło