Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

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 Root. Sie können Ihr Projekt in eine beliebige Anzahl von Szenen aufteilen. Dieses Feature 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 als Dateien mit der Erweiterung .tscn speichern, was für "text scene" steht. Die Datei label.tscn aus der vorherigen Lektion war ein Beispiel dafür. Wir nennen diese Dateien "gepackte Szenen", da sie Informationen über den Inhalt Ihrer Szene zusammenpacken.

Hier ist ein Beispiel für einen Ball. Er besteht aus einem RigidBody2D-Node als Root namens „Ball“, der es dem Ball ermöglicht, zu fallen und an Wänden abzuprallen, einem Sprite2D-Node und einem CollisionShape2D.

../../_images/instancing_ball_scene.png

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

../../_images/instancing_ball_instances_example.png

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

Jede Instanz der Ball-Szene beginnt mit der gleichen Struktur und den gleichen Eigenschaften wie ball.tscn. Sie können jedoch jede Instanz unabhängig voneinander verändern, z.B. wie sie abprallt, wie schwer sie ist, oder jede andere Eigenschaft, die von der Ausgangsszene nach außen sichtbar gemacht wird.

In der Praxis

Lassen Sie uns die Instanziierung in der Praxis anwenden, um zu sehen, wie sie in Godot funktioniert. Wir laden Sie ein, das Beispielprojekt herunterzuladen, das wir für Sie vorbereitet haben: instancing_starter.zip.

Entpacken Sie das Archiv auf Ihrem Computer. Um es zu importieren, benötigen Sie den Projektmanager. Den Projektmanager erreichen Sie, indem Sie Godot öffnen, oder wenn Sie Godot bereits geöffnet haben, klicken Sie auf Projekt -> Zum Projektmanager zurückkehren (Strg + Umschalt + Q, Ctrl + Option + Cmd + B unter macOS)

Klicken Sie im Projektmanager auf den Importieren-Button, um das Projekt zu importieren.

../../_images/instancing_import_button.png

Klicken Sie in dem daraufhin angezeigten Popup-Fenster auf den Durchsuchen-Button 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 den Button 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 Main-Szene sollte sich automatisch öffnen. Wenn Sie statt der Hauptszene eine leere 3D-Szene sehen, klicken Sie auf den 2D-Button am oberen Rand des Bildschirms.

../../_images/instancing_2d_scene_select.webp ../../_images/instancing_main_scene.png

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

../../_images/instancing_scene_link_button.png

Doppelklicken Sie auf die Ball-Szene, um sie zu instanziieren.

../../_images/instancing_instance_child_window.png

Der Ball erscheint in der oberen linken Ecke des Viewports.

../../_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 (Cmd + B unter macOS) drücken. Sie sollten den Ball fallen sehen.

Nun wollen wir weitere Instanzen des Ball-Nodes erstellen. Während der Ball noch ausgewählt ist, drücken Sie Strg + D (Cmd + D unter macOS), um den Duplizierbefehl 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 Bälle 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 zum Thema Instanzen. Mit diesem Konzept können Sie:

  1. die Eigenschaften eines Balls ändern, ohne die anderen zu beeinflussen, indem Sie den Inspektor verwenden.

  2. die Default-Eigenschaften jedes Balls ändern, 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 den Node „Ball“ aus. Im Inspektor auf der rechten Seite klicken Sie auf die Eigenschaft Physik-Material, um sie zu erweitern.

../../_images/instancing_physics_material_expand.webp

Setzen Sie die Property Abprall auf 0.5, indem Sie auf das Zahlenfeld klicken, 0.5 eingeben und Enter drücken.

../../_images/instancing_property_bounce_updated.webp

Play the game by pressing F5 (Cmd + B on macOS) and notice how all balls now bounce a lot more. As the Ball scene is a template for all instances, modifying it and saving causes all instances to update accordingly.

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

../../_images/instancing_scene_tabs.png

Wählen Sie eines der instanziierten Ball-Nodes aus und setzen Sie im Inspektor seine Schwerkraft-Skalierung auf 10.

../../_images/instancing_property_gravity_scale.png

Neben der angepassten Eigenschaft erscheint ein grauer "Zurücksetzen"-Button.

../../_images/instancing_property_revert_icon.png

Dieses Icon 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 Icon "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

You may notice you are unable to change the values of the PhysicsMaterial of the ball. This is because PhysicsMaterial is a resource, and needs to be made unique before you can edit it in a scene that is linking to its original scene. To make a resource unique for one instance, right-click on it in the Inspector and click Make Unique in the contextual menu.

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, durch die sich 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 Code-Patterns wie Model-View-Controller (MVC) oder Entity-Relationship-Diagramme zu verzichten. Stattdessen können Sie damit beginnen, sich die Elemente vorzustellen, 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. Sie werden die Instanziierung verwenden, entweder per Code oder direkt im Editor, um Ihren Szenenbaum aufzubauen.

Programmierer neigen dazu, viel Zeit damit zu verbringen, abstrakte Architekturen zu entwerfen und zu versuchen, Komponenten in diese einzupassen. Das Entwerfen auf der Grundlage von Szenen macht die Entwicklung schneller und unkomplizierter und ermöglicht es Ihnen, sich auf die eigentliche Spiellogik zu konzentrieren. Da die meisten Spielkomponenten direkt auf eine Szene abgebildet werden, bedeutet die Verwendung eines Designs, das auf der Instanziierung von Szenen basiert, dass Sie nur wenig anderen Architekturcode benötigen.

Schauen wir uns ein etwas komplexeres Beispiel eines Open-World-Spiels mit vielen 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 Raum-Szenen erstellen, in denen wir die Möbel individuell anordnen. Später könnten wir eine Haus-Szene erstellen, die mehrere Rauminstanzen für das Innere verwendet. Wir würden eine Zitadelle aus vielen instanziierten 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 instanziiert.

Später könnten wir Szenen anlegen, die Wachen repräsentieren 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 Benutzeroberfläche des Editors arbeiten.

Zusammenfassung

Die Instanziierung, d.h. die Erzeugung eines Objekts aus einem Bauplan, 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.