Instanzen erstellen

Im vorherigen Teil haben wir gesehen, dass eine Szene eine Sammlung von Nodes ist, die in einer Baumstruktur organisiert sind, mit einem einzelnen Node als Wurzel. Sie können Ihr Projekt in eine beliebige Anzahl von Szenen aufteilen. Diese Funktion hilft Ihnen, die verschiedenen Komponenten Ihres Spiels aufzuschlüsseln und zu organisieren.

Sie können so viele Szenen erstellen, wie Sie möchten, und sie mit der Erweiterung .tscn auf der Festplatte speichern, was für "text scene" steht. Die Datei Label.tscn aus der vorherigen Lektion war ein Beispiel. Wir nennen diese Dateien "Packed Scenes", da sie zusammengefasste Informationen über den Inhalt Ihrer Szene enthalten.

Hier das Beispiel eines Balls. Er besteht aus einem RigidBody2D Node als Wurzel namens Ball, der es dem Ball erlaubt, zu fallen und an Wänden abzuprallen, einem Sprite Node und einem CollisionShape2D.

../../_images/instancing_ball_scene.png

Sobald Sie eine Szene gespeichert haben, funktioniert sie als Blaupause: Sie können sie in anderen Szenen so oft reproduzieren, wie Sie möchten. Das Reproduzieren eines Objekts aus einer Vorlage wird Instancing genannt.

../../_images/instancing_ball_instances_example.png

Wie im vorherigen Teil erwähnt, verhalten sich instanzierte Szenen wie ein Node: Der Editor blendet ihren Inhalt standardmäßig aus. Wenn Sie den Ball instanzieren, sehen Sie nur das Ball-Node. Beachten Sie auch, dass jedes Duplikat einen eindeutigen Namen hat.

Jede Instanz der Ballszene beginnt mit der gleichen Struktur und den gleichen Eigenschaften wie Ball.tscn. Sie können jedoch jeden Ball unabhängig voneinander verändern, z.B. wie er abprallt, wie schwer er ist, oder jede andere Eigenschaft, die von der Ausgangsszene vorgegeben wird.

In der Praxis

Um zu lernen, wie die Instantiierung funktioniert, laden wir zunächst ein Beispielprojekt herunter: instancing.zip.

Entpacken Sie dieses Projekt in ein beliebiges Verzeichnis. Öffnen Sie dann Godot und fügen dieses Projekt über die Schaltfläche 'Importieren' dem Projektmanager hinzu.

../../_images/instancing_import_button.png

Klicken Sie in dem daraufhin angezeigten Popup-Fenster auf die Schaltfläche Durchsuchen und navigieren Sie zu dem von Ihnen extrahierten Ordner.

../../_images/instancing_import_browse.png

Doppelklicken Sie auf die Datei project.godot, um sie zu öffnen.

../../_images/instancing_import_project_file.png

Klicken Sie abschließend auf die Schaltfläche Importieren & Bearbeiten.

../../_images/instancing_import_and_edit_button.png

Das Projekt enthält zwei gepackte Szenen: Main.tscn, die Wände enthält, gegen die der Ball prallt, und Ball.tscn. Die Hauptszene sollte sich automatisch öffnen.

../../_images/instancing_main_scene.png

Fügen wir einen Ball als Kind des Nodes Main hinzu. Wählen Sie im Scene-Dock das Main-Node aus. Klicken Sie dann auf das Link-Symbol am oberen Rand des Szenendocks. Diese Schaltfläche ermöglicht es Ihnen, eine Instanz einer Szene als Kind des aktuell ausgewählten Nodes hinzuzufügen.

../../_images/instancing_scene_link_button.png

Doppelklicken Sie auf die Ballszene, um sie zu instantiieren.

../../_images/instancing_instance_child_window.png

Der Ball erscheint in der oberen linken Ecke des Ansichtsfensters.

../../_images/instancing_ball_instanced.png

Klicken Sie darauf und ziehen Sie es in die Mitte der Ansicht.

../../_images/instancing_ball_moved.png

Spielen Sie das Spiel, indem Sie F5 drücken. Sie sollten ihn fallen sehen.

Nun wollen wir weitere Instanzen des Ball-Nodes erstellen. Während der Ball noch ausgewählt ist, drücken Sie Ctrl-D (Cmd-D auf macOS), um den Duplikat-Befehl aufzurufen. Klicken und ziehen Sie, um den neuen Ball an eine andere Stelle zu verschieben.

../../_images/instancing_ball_duplicated.png

Sie können diesen Vorgang wiederholen, bis Sie mehrere in der Szene haben.

../../_images/instancing_main_scene_with_balls.png

Spielen Sie das Spiel erneut. Sie sollten nun sehen, dass jeder Ball unabhängig von den anderen fällt. Das ist die Funktion von Instanzen. Jede ist eine unabhängige Reproduktion einer Vorlagenszene.

Bearbeiten von Szenen und Instanzen

Es gibt noch mehr zu Instanzen. Mit dieser Eigenschaft können Sie:

  1. Ändern Sie die Eigenschaften eines Balls, ohne die anderen zu beeinflussen mit dem Inspektor.

  2. Ändern Sie die Standardeigenschaften jedes Balls, indem Sie die Szene Ball.tscn öffnen und dort eine Änderung am Ball-Node vornehmen. Nach dem Speichern werden die Werte für alle Instanzen des Balls im Projekt aktualisiert.

Bemerkung

Die Änderung einer Eigenschaft einer Instanz setzt immer die Werte der entsprechenden gepackten Szene außer Kraft.

Versuchen wir es. Öffnen Sie Ball.tscn und wählen Sie das Ball-Node. Klicken Sie im Inspektor auf der rechten Seite auf die Eigenschaft PhysicsMaterial, um sie zu erweitern.

../../_images/instancing_physics_material_expand.png

Setzen Sie die Eigenschaft Bounce auf 2, indem Sie auf das Zahlenfeld klicken, 2 eingeben und Enter drücken.

../../_images/instancing_property_bounce_updated.png

Spielen Sie das Spiel, indem Sie F5 drücken und beachten Sie, wie alle Bälle jetzt viel mehr hüpfen. Da die Ballszene eine Vorlage für alle Instanzen ist, führt das Ändern und Speichern dazu, dass alle Instanzen entsprechend aktualisiert werden.

Lassen Sie uns nun eine einzelne Instanz anpassen. Kehren Sie zur Hauptszene zurück, indem Sie auf die entsprechende Registerkarte oberhalb des Ansichtsfensters klicken.

../../_images/instancing_scene_tabs.png

Wählen Sie eines der instanzierten Ball-Nodes aus und setzen Sie im Inspektor seinen Schwerkraftmaßstab auf 10.

../../_images/instancing_property_gravity_scale.png

Neben der angepassten Eigenschaft erscheint eine graue Schaltfläche "Zurücksetzen".

../../_images/instancing_property_revert_icon.png

Dieses Symbol zeigt an, dass Sie einen Wert aus der gepackten Ausgangsszene überschreiben. Selbst wenn Sie die Eigenschaft in der Originalszene ändern, bleibt der überschriebene Wert in der Instanz erhalten. Wenn Sie auf das Symbol "Zurücksetzen" klicken, wird die Eigenschaft auf den Wert in der gespeicherten Szene zurückgesetzt.

Starten Sie das Spiel erneut und achten Sie darauf, dass dieser Ball jetzt viel schneller fällt als die anderen.

Bemerkung

Wenn Sie einen Wert im PhysicsMaterial einer Instanz ändern, wirkt sich das auf alle anderen aus. Das liegt daran, dass PhysicsMaterial eine Ressource ist, und Ressourcen werden von Instanzen gemeinsam genutzt. Um eine Ressource für eine Instanz eindeutig zu machen, klicken Sie mit der rechten Maustaste auf die Ressource im Inspektor und klicken Sie im Kontextmenü auf Einzigartig machen.

Ressourcen sind ein weiterer wesentlicher Baustein der Godot-Spiele, den wir in einer späteren Lektion behandeln werden.

Szeneninstanzen als Designsprache

Instanzen und Szenen in Godot bieten eine hervorragende Designsprache, welche die Engine von anderen auf dem Markt abhebt. Wir haben Godot von Anfang an nach diesem Konzept entworfen.

Wir empfehlen, bei der Entwicklung von Spielen mit Godot auf architektonische Codemuster wie Model-View-Controller (MVC) oder Entity-Relationship-Diagramme zu verzichten. Stattdessen können Sie damit beginnen, sich die Elemente vorzustellen, welche die Spieler in Ihrem Spiel sehen werden, und Ihren Code um diese herum strukturieren.

So könnte man zum Beispiel ein Shooter-Spiel folgendermaßen aufschlüsseln:

../../_images/instancing_diagram_shooter.png

Sie können ein solches Diagramm für fast jede Art von Spiel entwerfen. Jedes Rechteck stellt eine Entität dar, die im Spiel aus der Perspektive des Spielers sichtbar ist. Die Pfeile zeigen an, welche Szene zu welcher gehört.

Sobald Sie solch ein Diagramm haben, empfiehlt es sich für jedes Element im Diagramm eine Szene zu erstellen. Um die Beziehungen zu verwirklichen werden Sie das Instanziieren (entweder im Code oder direkt im Editor) verwenden.

Bei der Programmierung von Spielen (oder Software im Allgemeinen) wird viel Zeit darauf verwendet, eine Architektur zu entwerfen und Spielekomponenten an diese Architektur anzupassen. Das auf Szenen basierende Design ersetzt diesen Ansatz und macht die Entwicklung viel schneller und einfacher, sodass Sie sich auf die Spielelogik selbst konzentrieren können. Da die meisten Spielekomponenten direkt einer Szene zugeordnet sind, erfordert die Verwendung eines solchen Designs, das auf Szenen-Instantiierung basiert, wenig anderen architektonischen Code.

Schauen wir uns ein etwas komplexeres Beispiel eines Open-World-Spiels mit vielen Nutzerinhalten (Assets) und verschachtelten Elementen an:

../../_images/instancing_diagram_open_world.png

Stellen Sie sich vor, wir begännen damit, den Raum zu gestalten. Wir könnten eine Reihe verschiedener Raumszenen erstellen, in denen wir die Möbel individuell anordnen. Später könnten wir eine Hausszene erstellen, die mehrere Rauminstanzen für das Innere verwendet. Wir würden eine Zitadelle aus vielen instanzierten Häusern und einem großen Terrain erstellen, auf dem wir die Zitadelle platzieren würden. Jedes dieser Häuser wäre eine Szene, die eine oder mehrere Unterszenen instanziert.

Später könnten wir Szenen anlegen, die Wachen repräsentieren (und andere NPCs) und diese der Festung hinzufügen. Das Resultat wäre, dass sie indirekt der kompletten Spielwelt hinzugefügt werden.

Mit Godot ist es einfach Ihr Spiel auf diese Weise zu erweitern, da Sie lediglich weitere Szenen erstellen und instanziieren müssen. Darüber hinaus ist die Benutzeroberfläche des Editors so gestaltet, dass sie sowohl für Programmierer als auch für Nichtprogrammierer anwenderfreundlich ist. Ein typisches Entwicklerteam kann 2D- oder 3D-Künstler, Leveldesigner, Spieldesigner und Animatoren umfassen, die alle mit der Editorschnittstelle arbeiten.

Zusammenfassung

Die Instanzierung, d.h. die Erzeugung eines Objekts aus einer Blaupause, hat viele praktische Funktionen. Bei Szenen bietet es Ihnen:

  • Die Möglichkeit, Ihr Spiel in wiederverwendbare Komponenten zu unterteilen.

  • Ein Werkzeug, um komplexe Systeme zu strukturieren und zu kapseln.

  • Eine Sprache, mit der Sie auf natürliche Weise über die Struktur Ihres Spielprojekts nachdenken können.