Wie kann ich mehrere Netze pro Entität verwenden, ohne eine Komponente eines einzelnen Typs pro Entität zu beschädigen?

11

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/

Mathias Hölzl
quelle
Ich denke, das ist zu lokalisiert.
JCora
4
Ich denke, es ist eine allgemeine Frage. Kann ein Spielobjekt mehrere Instanzen derselben Komponente haben?
Mathias Hölzl
Ja, es hätte sein können, wenn es so gefragt worden wäre. Mir scheint, er suchte nach einer Antwort auf ein ganz bestimmtes Problem.
JCora
4
"... Entität in einem komponentenbasierten System kann nicht mehrere Komponenten desselben Typs haben ..." - warum nicht?
Den
Ich denke nicht, dass es zu lokalisiert ist. Zum Beispiel in UE3 hat SkeletalMeshActornur eine SkeletalMeshComponent. Es ist ein häufiges Problem, das auf viele verschiedene Arten angegangen werden kann.
Sam Hocevar

Antworten:

13

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.

Luke B.
quelle
Ich habe also eine Hierarchie von Entitäten, und diese Entitäten haben Komponenten und sind miteinander verknüpft. Ist es dann noch eine komponentenbasierte Spiel-Engine =)
Mathias Hölzl
@ MathiasHölzl ist das eine frage? Diese Art von Hierarchie ist nicht mit der problematischen Hierarchie in OOP identisch. Dies ist nur eine grafische Hierarchie. Untergeordnete Entitäten erben keine Funktionen von ihren übergeordneten Elementen und bereiten Ihnen Probleme. Dies geschieht normalerweise trotzdem (mit einem Baum von Dingen, die gerendert werden müssen). Sie können auch mit Asakeron Antwort auf Ihr Problem gehen, mit einer Liste von Meshs, ich sehe nicht, wie das problematisch ist. Vielleicht verstehe ich deine Frage nicht?
Luke B.
-1 Ich bin mir nicht sicher, ob das wirklich der richtige Weg ist. Wenn Sie eine Komponente benötigen, die eine Hierarchie von Netzen verarbeitet, warum nicht eine 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.
Laurent Couvidou
@LaurentCouvidou Ich verstehe nicht, warum die Verwendung von mehr als einer Entität falsch wäre. Es scheint eine gute Lösung für mich zu sein. Ich wollte nur eine andere Alternative zu einer Liste von Netzen geben, obwohl ich damit einverstanden bin, dass eine Liste von Netzen auch eine gute Lösung wäre.
Luke B.
@ LukeB. Da diese Gruppe von Maschen einer Entität als Ganzes entsprechen kann, mit Komponenten, die davon abhängen, z. B. KI, Klang, Physik ... Auf diese Weise erhalten Sie ein Szenendiagramm und alle seine Macken.
Laurent Couvidou
8

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.

Asakeron
quelle
1
Ein Netz hat auch Komponenten wie Transformation, Physik, Grafik ...
Mathias Hölzl
1
Ein Netz ist also eine Einheit? Oder ist alles eine Komponente? So wie ich es sehe, sollten Transformation, Physik und Grafik Komponenten in der Entität sein, nicht im Netz. Ein Netz ist nur eine Beschreibung von Eckpunkten.
Luke B.
1
Ja, es sollte eine Komponente sein, aber Komponenten können keine Komponenten haben, daher ist es schwierig, die Hierarchie des Modells zu implementieren.
Mathias Hölzl
1
Ich glaube, Sie sollten mehr Informationen darüber bereitstellen, wie Sie Ihren Motor bauen möchten, um bessere Antworten zu erhalten. Entity Component Systems können auf viele Arten implementiert werden. Weitere Informationen hierzu finden Sie in dieser Antwort von Kylotan.
Asakeron
4

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.

MichaelHouse
quelle
1

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:

  • Position, die Sie erwähnt haben
  • Skinning- / Animationsdaten
  • Der aktuelle Pass (z. B. bei Verwendung von Alpha mit zwei Passes)
  • Informationen zum Schattenwerfen (wenn Sie dies tun)
  • Informationen darüber, wie und wann das Material aktualisiert werden muss
  • Culling-Funktionalität

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:

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

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.

sebf
quelle