Im Gegensatz zum traditionellen Actor-System der Unreal Engine verwendet Scene Graph ein System von Entitäten und Komponenten, um Objekte in der Welt zu definieren. Entitäten fungieren als Container für Komponenten und andere Entitäten, und Komponenten bieten Beziehungen zu den Entitäten, mit denen sie angehängt sind. Zum Erstellen eines Spielobjekts mit Scene Graph musst du von einer Basisentität ausgehen und mithilfe von Komponenten Daten und Verhaltensweisen hinzufügen. Jede Komponente bringt ein neues Verhalten mit sich, und durch die Kombination kannst du komplexe Objekte erstellen, die du wiederverwenden und iterieren kannst.
Grundlagen des Bauens
Wirf einen Blick auf die Reihe von Lichtposten im ersten Abschnitt der Vorlagenhalle, um diesen Punkt zu verdeutlichen. Jeder Lichtmast ist ein Prefab oder eine Sammlung von Entitäten und Komponenten, die als einzelnes Objekt gespeichert sind. Das Prefab-Objekt gibt die Merkmale, Verhaltensweisen, Eigenschaften und Attribute der Entitäten und Komponenten frei. Weitere Informationen zu Entitäten und Komponenten findest du in Working with Entities and Components.
Iterieren durch die Instanziierung
Prefabs sind Assets, und das erlaubt es dir, sie in deinen Levels während der Bearbeitung oder während des Gameplays zu instantiieren. Jedes Mal, wenn du ein Prefab aus dem Inhaltsbrowser oder eine Kopie mit Verse-Code erstellst, instanziierst du eine neue Instanz dieses Scene Graph-Prefabs in der Welt.
Während jede Instanz des Prefabs über ihren eigenen Speicher- und Verarbeitungs-Overhead verfügt, verdoppelt das Instanziieren neuer Prefabs den Speicher nicht, da die in einem Prefab verwendeten Asset-Ressourcen zwischen den Instanzen geteilt werden.
Während die Instanziierung mehrerer Instanzen desselben Objekts leistungsstark ist, bieten Prefabs auch eine nützliche Möglichkeit, ein Design schnell zu iterieren. Öffne im Inhaltsbrowser die Datei LightPost. In diesem Ordner werden die Assets gespeichert, mit denen das endgültige P_LightPost-Prefab-Design erstellt wird
Jeder Lichtmast im Flur repräsentiert einen Teil dieses Prefabs. Wenn du dich den Flur entlang bewegst, wird bei jedem Schritt eine neue Komponente hinzugefügt, bis du beim endgültigen Prefab-Design landest.
Der erste Lichtmast ist eine einfache Einrichtung, die aus drei Entitäten besteht: einem Lichtmast, einem Drehpunkt und einer Laterne. Jede dieser drei Entitäten hat eine transform_component, die bestimmt, wo sie sich im Level befinden. Sowohl die Parent- als auch die Lanterne-Entität verfügen über eine mesh_component, damit sie sichtbar werden und Modelle für den Lichtpfahl bzw. die Laterne anzeigen. Sie sind durch eine Pivot-Entität verbunden, die die Verbindung zwischen dem Laternenpfahl und der Laterne darstellt.
Der zweite Lichtposten iteriert über das ursprüngliche Design, indem eine neue Entität mit einer sphere_light_component als Child der Laterne hinzugefügt wird, sodass sie leuchten kann.
Nur das Leuchten ist aber nicht besonders interessant, also fügt der dritte Lichtposten eine particle_system_component hinzu, um Motten zu simulieren, die um die SphereLight-Entität fliegen, um für etwas visuelles Flair zu sorgen.
Als nächstes fügt die vierte Lichtpfahl-Instanz sowohl eine benutzerdefinierte simple_movement_component als auch eine keyframe_movement_component zur Pivot-Entität hinzu. Diese Komponenten arbeiten zusammen, um Bewegungen auf der Entität und ihren Nachkommen zu simulieren und die Laterne vor und zurück schwingen zu lassen.
Diese Komponenten verwenden Verse, um den Weg der Laterne zu bestimmen, wie weit die Laterne auf diesem Weg zurücklegt und die Drehung der Laterne, um den Wind zu simulieren, der das Licht weht. Die keyframe movement component erzeugt nahtlose, kontinuierliche Bewegung basierend auf den Koordinaten in der simple_movement_component.
Schließlich fügt die letzte Lichtpfahl-Instanz eine benutzerdefinierte Verse anchor_interaction_component zum Lichtpfahl sowie eine interactable_component zur Laterne hinzu. Wenn sich der Spieler der Laterne nähert und mit ihr interagiert, schaltet die lantern_interaction_component die Laterne ein und aus, indem sie jede light_component und particle_system_component auf dem gesamten Lightposten aktiviert und deaktiviert.
Overrides
Wenn du ein Prefab instantiierst, beginnt es mit denselben Standardwerten wie die Prefab-Definition, aus der du es instantiiert hast. Aber was ist, wenn du einen bestimmten Aspekt einer deiner Prefab-Instanzen ändern möchtest? Vielleicht möchtest du ein anderes farbiges Licht oder einen Metallpfahl anstelle eines Holzlichtmastes. Und hier kommen Overrides ins Spiel.
Overrides erlauben es dir, Werte an Instanzen einer Prefab-Klasse zu überschreiben, um jede Instanz zu personalisieren, ohne das Parent-Prefab zu ändern. Wenn du Änderungen an den Optionen einer Komponente vornimmst, die in einer Prefab-Instanz verschachtelt ist, setzen diese Änderungen die Optionen am Parent-Prefab außer Kraft und ändern, wie die Entität auf der Komponentenebene nur für diese Instanz reagiert.
An einzelnen Prefab-Instanzen können Overrides und Änderungen vorgenommen werden, um Abwechslung in der Szene zu schaffen. Wenn du stattdessen Änderungen an allen Instanzen des Prefab propagieren möchtest, kannst du den Prefab Editor verwenden, um diese Änderungen an jedem Prefab in der Szene zu übernehmen.
Verse-Funktionalität im Szenengraphen
Scene Graph ist ein in Verse natives System, und so kannst du beide zusammen auf viele leistungsstarke Arten nutzen. Prefabs, die du in deinem Projekt erstellst, werden als Asset-Klassen in Verse über deine Vermögenswerte.digest.verse enthüllt. Datei, und du kannst sie im Code sowohl für Verse-Komponenten als auch für Verse-Geräte referenzieren.
Du kannst mit Verse auch einzelne Entitäten und Komponenten in deiner Szene abfragen. Der Funktion GetComponents() kannst du bestimmte Komponenten basierend auf ihrem Typ abrufen, und mit GetEntities() kannst du alle Child-Entitäten unter einem bestimmten Parent zurückgeben. Du kannst auch die Scene Graph Hierarchie auf und abwärts suchen, um Descendant und ancestor entities zu finden. Das in dieser Vorlage verwendete Prefab P_LightPost verwendet Verse, um die schwankende Bewegung und Interaktivität der Laterne zu erstellen.
Um mehr über die Erstellung von funktionalen Spielobjekten zu erfahren, fahre mit dem nächsten Abschnitt, Bewegung und Interaktion, fort.
Bewegung und Interaktion
Lerne, wie das Hinzufügen von Bewegungen zu Entitäten funktionale Spielobjekte mit einer Verse-Komponente und der Keyframe-Bewegungskomponente erstellt.