Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Instanzen erstellen
Bemerkung
This tutorial refers to instancing scenes in the editor. To learn how to instance scenes from code, see Nodes und Szeneninstanzen.
Godot's approach to instancing described below should not be confused with hardware instancing that can be used to render large amounts of similar objects quickly. See Optimierungen durch MultiMeshes instead.
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.
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.
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.
Extract the archive on your computer. To import it, you need the Project Manager. The Project Manager is accessed by opening Godot, or if you already have Godot opened, click on (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q on macOS)
In the Project Manager, click the button to import the project.
In dem erscheinenden Pop-up-Fenster navigieren Sie zu dem Ordner, den Sie entpackt haben. Doppelklicken Sie auf die Datei project.godot, um sie zu öffnen.
Finally, click the button.
A window notifying you that the project was last opened in an older Godot version may appear. That's not an issue. Click to open the project.
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.
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.
Doppelklicken Sie auf die Ball-Szene, um sie zu instanziieren.
Der Ball erscheint in der oberen linken Ecke des Viewports.
Klicken Sie darauf und ziehen Sie es in die Mitte der Ansicht.
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.
Sie können diesen Vorgang wiederholen, bis Sie mehrere Bälle in der Szene haben.
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:
Change the properties of one ball without affecting the others using the Inspector.
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.
Let's try this. Double-click ball.tscn in the FileSystem to open it.
In the Scene dock on the left, select the Ball node. Then, in the Inspector on the right, click on the PhysicsMaterial property to expand it.
Setzen Sie die Property Abprall auf 0.5, indem Sie auf das Zahlenfeld klicken, 0.5 eingeben und Enter drücken.
Spielen Sie das Spiel, indem Sie F5 (Cmd + B unter macOS) drücken und beachten Sie, wie alle Bälle jetzt viel mehr abprallen. Da die Ball-Szene 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 Tabs oberhalb des Viewport klicken.
Select one of the instanced Ball nodes and, in the Inspector, set its
Gravity Scale value to 10.
Neben der angepassten Eigenschaft erscheint ein grauer "Zurücksetzen"-Button.
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 the Physics Material property in the Inspector and click in the context 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:
You can come up with a diagram like this for almost any type of game. Each rectangle represents an entity that's visible in the game from the player's perspective. The arrows point towards the instantiator of each scene.
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:
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.