Wir wechseln gerade von einer hierarchiebasierten Spiel-Engine zu einer komponentenbasierten Spiel-Engine. Mein Problem ist, dass beim Laden eines Modells mit einer Netzhierarchie nach meinem Verständnis eine Entität in einem komponentenbasierten System nicht mehrere Komponenten desselben Typs haben kann, ich jedoch für jede eine "meshComponent" benötige in einem Modell vernetzen. Wie könnte ich dieses Problem lösen?
Auf dieser Seite haben sie eine komponentenbasierte Spiel-Engine implementiert: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
architecture
component-based
Mathias Hölzl
quelle
quelle
SkeletalMeshActor
nur eineSkeletalMeshComponent
. Es ist ein häufiges Problem, das auf viele verschiedene Arten angegangen werden kann.Antworten:
Ihre Positionskomponente kann eine "Eltern / Kinder" -Logik haben, bei der jede Entität mit einer Position ein Elternteil haben kann und ihre Position relativ zu ihrem Elternteil ist. Anstatt mehrere Netze in derselben Entität zu haben, können Sie mehr als eine Entität mit jeweils einem eigenen Netz erstellen und miteinander verknüpfen. Sie können die untergeordneten Entitäten sogar dazu bringen, ihre übergeordneten Ereignisse (oder ein anderes System für die Kommunikation zwischen Entitäten) abzuhören und entsprechend zu reagieren.
quelle
ModelComponent
, die eine Hierarchie von Netzen enthält? Das Aufteilen einer Entität nur dafür klingt nach einer falschen Lösung des Problems. Siehe die Antworten von Asakeron und Byte56.Ihre meshComponent kann eine Liste von Netzen enthalten. Ich bin nicht sicher, wie Sie Ihre Engine implementieren, aber ein System könnte leicht über alle Netze iterieren und sie einfach zeichnen.
quelle
Ich würde meine Netzkomponente mit einer Liste von Netzobjekten erstellen. Jedes Netzobjekt enthält die Netzdaten zusammen mit einem Versatz. Beim Zeichnen nimmt das Zeichnungssystem die Position von der Positionskomponente und zeichnet dann jedes Netz in der Netzkomponente an Position + Versatz.
Sie können mehrere Netze in Ihrer Netzkomponente haben, während Sie immer noch eine einzelne Netzkomponente pro Entität angeben.
quelle
TLDR: Indem die Komponente zunächst aus mehreren Maschen besteht.
Ich stimme Asakeron / Byte56 / Laurent darin zu, dass eine andere Indirektionsebene zwischen den Maschen / Material-Paaren und der Entität selbst erforderlich ist. Anstatt die GraphicsComponent als Scheitelpunkte und Materialien zu betrachten, stellen Sie sie sich als einen Pixelklecks im endgültigen Raster vor - wie sie dort ankommt, ist ein Implementierungsdetail und nichts weiter.
Ich habe viel über mein Projekt nachgedacht und ich denke, die optimale Lösung besteht darin, die GraphicsComponent zu einer viel übergeordneten Komponente zu machen, die einen Großteil der Funktionalität des traditionellen 'Model'-Objekts umfasst - da diese Funktionalität nicht optional ist! Um diese Polygone zu rendern, werden viel mehr als nur die Pufferdaten und der Shader benötigt, wie zum Beispiel:
Und das ist nur für 3D-Assets, ohne Partikelsysteme, Werbetafeln usw. zu berücksichtigen. Aber alles ist nur für den Grafik- / Rendering-Code relevant - es hat keinen Einfluss auf die Physik, den Sound oder das Scripting, daher ist es sinnvoll, darin zu sitzen die Grafik- / Rendering-Komponente.
Am Ende hatte ich:
In diesem:
Modell ist jedes Spielelement mit einer Grafikkomponente.
Die ModelComponent ist analog zum herkömmlichen Modell und gilt tatsächlich für 3D-Assets. Der GraphicsComponent-Controller (wenn Sie das Model-View-Controller-Muster verwenden) ist dafür verantwortlich, herauszufinden, um welche Art von Grafik-Asset es sich handelt, und es korrekt zu zeichnen (beachten Sie, dass ModelComponent eine Unterklasse von GraphicsComponent ist).
Aus Gründen der Einfachheit und Abwärtskompatibilität gab es bei mir auch einige Kompromisse, z. B. dass jede GraphicsComponent auch eine Entität ist und die Entität Positionsdaten direkt speichert, sodass sie nur an einer Stelle berechnet werden. Die Idee ist jedoch dieselbe: GraphicsComponent behandelt das, was ist benötigt, um den Gegenstand zu zeichnen - alles, was benötigt wird - nicht nur, was vom Modellbauer kommt.
quelle