Von Unity zur Godot Engine

Dieses Handbuch bietet einen Überblick über die Godot Engine aus der Sicht eines Unity-Benutzers und soll Ihnen helfen, Ihre vorhandene Unity-Erfahrung in die Welt von Godot zu migrieren.

Bemerkung

Dieser Artikel geht auf ältere Versionen von Unity ein. Verschachtelte Vorlagen ('Nested Prefabs') wurden in Unity 2018.3 hinzugefügt und sind vergleichbar mit Szenen in Godot, sie erlauben somit eine Godot-ähnliche Herangehensweise der Szenen-Organisation.

Unterschiede

  Unity Godot
Lizenz Proprietäre, geschlossene, kostenlose Lizenz mit Umsatzobergrenzen und Nutzungsbeschränkungen MIT-Lizenz, kostenlos und gänzlich Open-Source ohne jegliche Beschränkungen
Betriebsystem (Editor) Windows, MacOS, Linux Windows, MacOS, X11 (Linux, *BSD)
OS (export)
  • Desktop: Windows, MacOS, Linux
  • Mobile: Android, iOS, Windows Phone, Tizen
  • Web: WebAssembly oder asm.js
  • Konsolen: PS4, PS Vita, Xbox One, Xbox 360, Wii U, Nintendo 3DS
  • VR: Oculus Rift, SteamVR, Google Cardboard, Playstation VR, Gear VR, HoloLens
  • TV: Android TV, Samsung SMART TV, tvOS
Szenensystem
  • Komponente/Szene (SpielObjekt > Komponente)
  • Vorgefertigtes
Mittels:ref:`Szenenbaum und Nodes <doc_scenes_and_nodes>`können Szenen in andere Szenen eingebettet und/oder vererbt werden
Third-Party Werkzeuge Visual Studio oder VS Code
Bemerkenswerte Vorteile
  • Gigantische Gemeinschaft
  • Großer Assets-Laden

Der Editor

Die Godot-Engine stellt Ihnen einen funktionsreichen Editor zur Verfügung um die Spiele von morgen zu schaffen. Die Bilder unten zeigen das Standard-Layout beider Editoren mit farbigen Blöcken um die verbreiteten Funktionalitäten anzuzeigen.

../../_images/unity-gui-overlay.png ../../_images/godot-gui-overlay.png

Während beide Editoren sich ziemlich ähneln, stecken unter der Oberfläche viele Unterschiedlichkeiten. Beide ermöglichen es dir, Ihr Projekt geschickt durch das Dateisystem geordnet und aufgeräumt halten zu können. Doch Godot's Ansatz ist wesentlich einfacher gestaltet mit einer einzigen Konfigurationsdatei, minimalem Textformat, keine Metadaten. Dadurch ist Godot handlicher zu VCS Systemen, wie zum Beispiel Git, Subversion, oder Mercurial.

Godot's Szenenpanel ist ähnlich zu dem Hierarchie-System Unitys. Doch jedes Node verfügt über eine ganz bestimmte Funktion, dieser Ansatz seitens Godot ist visuell mehr darstellend. Es ist einfacher gestaltet, den Überblick über alles behalten zu können.

Der Inspektor Godots ist minimalistisch aufgebaut, er zeigt lediglich Eigenschaften an. Dank dieser Funktionsweise können Objekte dem Endbenutzer mehr nützliche Parameter preisgeben, ohne Funktionalitäten in Sprach-APIs zu verbergen. Zusätzlich erlaubt Godot es einem, jegliche jener Eigenschaften visuell zu animieren. Sei es das Ändern der Farben, Texturen, Enumerationen, oder selbst Links zu Ressourcen in Echtzeit sind möglich, ohne den Zwang Code dafür schreiben zu müssen.

Die Toolbar oberhalb des Bildschirms ist ähnlich in beiden Editoren vertreten, bieten die volle Kontrolle über die Projekt-Wiedergabe. Projekte in Godot dagegen laufen in seperaten Fenstern, anstelle innerhalb des Editors (der Tree und die Objekte können jedoch immer noch erkundigt werden im Debugger-Fenster).

Dieser Ansatz hat diverse Vorteile:

  • Das Projekt abzuspielen und es zu schließen geht schnell (Unity muss dagegen z.B. das Projekt abspeichern, abspielen, schließen, und dann den vorherigen Stand neuladen).
  • Live-Bearbeitung ist um einiges nützlicher da Modifizierungen, getätigt im Editor, im Spiel sofort Wirkung zeigen, und gehen dann nicht verloren (und müssen nicht synchronisiert werden) sobald das Spiel geschlossen wird. Dies erlaubt effiziente Arbeitsweisen, so in etwa wie Levels zu erstellen während Sie sie spielen.
  • Der Editor ist stabiler da das Spiel als separater Prozess ausgeführt wird.
  • Das Rennspiel kann von verschiedenen Blickwinkeln aus beobachtet werden durch das Umschalten des "Camera Override"-Knopfes im Editor-Viewport, welcher zwischen der Ansicht der Editoransicht und der Spielkamera umschaltet.

Godot's oberste Toolbar enthält ein Menü für fernes Debugging. Diese Optionen erlauben die Ausführung auf einem anderen Gerät (ein verbundenes Handy, ein Tablet, aber auch via Browser - HTML5), wie auch das Live-Debugging nachdem das Spiel exportiert wurde.

Das Szenensystem

Hierbei handelt es sich um den wichtigsten Unterschied zwischen der Unity- und Godotengine als auch um die meistgemochtesten Features der meisten Godot-Benutzer.

An einem 'Level' in Unity zu arbeiten bedeutet normalerweise all die benötigten Assets in eine Szene einzubinden und sie mit Komponenten und Skripten zu verbinden.

Godot's Szenensystem ist von der Oberfläche her Unity sehr ähnlich. Ein 'Level' besteht aus einer Sammlung von Nodes, jedes mit seinem eigenen Nutzen: Sprites, Meshes, Lights, usw. Wie dem auch sei, in Godot sind Nodes in einer Baumstruktur aufgebaut. Jedes Node kann mehrere Unter-Nodes haben, die dann eine Subszene aus der Hauptszene heraus bilden. Dies hat zur Folge dass es durchaus möglich ist, eine ganze Szene mit verschiedenen Szenen zusammenzusetzen, dabei können nämlich Szenen auch in einzelne Dateien gespeichert werden.

Stellen Sie sich zum Beispiel ein Plattformer-Level vor. Sie würden es mithilfe diverser Elemente zusammenstellen:

  • Bauklötze
  • Münzen
  • Der Spieler
  • Die Gegner

In Unity würden Sie alle SpielObjekte in eine Szene packen: Den Spieler, mehrere Instanzen der Feinde, Bauklötze überfall um den Boden zu definieren, und schlussendlich mehrere Instanzen der Münzen, verteilt auf das gesamte Level. Danach würde man diverse Komponenten zu jedem Element verlinken und Logik in das Level einbauen: Zum Beispiel könnten Sie eine 'BoxCollider2D' zu allen Elementen der Szene hinzufügen, damit diese miteinander kollidieren könnten. Dieses Prinzip ist so in dieser Form nicht in Godot vertreten.

In Godot würden Sie Ihre gesamte Szene in drei kleineren, separaten Szenen unterbringen, und sie in der Hauptszene instanziieren.

  1. Nur schon für den Spieler an sich eine eigene Szene

Verstehe den Spieler als ein Element dieses wir gerne in verschiedenen Eltern-Szenen (eigentlich 'Level'-Szenen) verwenden wollen. In unserem Fall benötigt das Spielerelement wenigstens ein 'AnimatedSprite'-Node. Dieser Node-Typ enthält die Sprite-Texturen die benötigt werden für diverse selbst erstelle Animationen (wie zum Beispiel eine "Stand-, "Renn-", "Attacken-" Animation).

  1. Eine Szene für den Gegner.

Ein Gegner ist ebenso ein Element welches wir gerne in verschiedenen Szenen verwenden wollen. Es ist fast exakt das selbe wie beim 'Spieler-Node'. Die einzig markanten Unterschiede sind Skripte und Sprite Texturen. Ein Gegner-Element benötigt nämlich Pfade (KI-Vorgabenbasiert) um das Feindverhalten abzubilden.

  1. Eine Level-Szene.

Eine Level-Szene kann etwa mithilfe von Bauklötzen (für z.B. Plattformen), Münzen (für den Spieler zum Einsammeln), und einer Anzahl von Instanzen einer Gegner-Szene zusammengestellt werden. Jede Instanz ist ein Node in dem Level-Szenenbaum. Diese Instanzen sind separate Gegner, welche ursprünglich ein selbes Verhaltensmuster als auch Aussehen teilen (Gegner-Szene). Sie können verschiedene Eigenschaften für jedes Feind-Node einstellen (um zum Beispiel die Farbe zu ändern).

4. A Main scene. The Main scene would be composed of one root node with 2 children: a Player instance node, and a Level instance node. The root node can be anything, generally a "root" type such as "Node" which is the most global type, or "Node2D" (root type of all 2D-related nodes), "Spatial" (root type of all 3D-related nodes) or "Control" (root type of all GUI-related nodes).

Wie Sie bereits sehen können ist jede Szene wie ein Baum organisiert. Dasselbe gilt für Node-Eigenschaften: Sie fügen nicht eine Kollisionskomponente zu einem Node hinzu, wie Sie es bei Unity tun würden. Anstelle dessen machen Sie jenen Node zum Unterobjekt. Godot stellt diverse Kollisionstypen bereit, abhängig von der Verwendung (siehe Einleitung Physik).

  • Welche Vorteile ergeben sich bei solch einem System? Würde dieses System nicht möglicherweise die Tiefe des Szenenbaumes negativ beeinflussen durch Erhöhung der Anzahl? Und erlaubt es Unity ohnehin nicht schon, SpielObjekte zu organisieren und zwar dadurch, diese in leere SpielObjekte zu packen?

    • Godot's system is closer to the well-known object-oriented paradigm: Godot provides a number of nodes which are not clearly "Game Objects", but they provide their children with their own capabilities: this is inheritance.
    • Godot gestattet die Extrahierung eines Subbaumes einer Szene um das Ganze zu einer eigenen Szene zu machen. Falls ein Szenenbaum zu tief gehen würde könnte er also in kleinere Subbäume geteilt werden. Das ist eindeutig besser und trägt zur Lesbarkeit bei, so kann man jeden Subbaum in ein Node einbinden. Mehrere SpielObjekte in ein SpielObjekt zu stecken wäre so in der Form in Unity nicht möglich.

Projekt Organisation

../../_images/unity-project-organization-example.png

Es gibt keine perfekte Projekt-Architektur. Jede Architektur kann zum laufen gebracht werden, sowohl in Unity als auch in Godot.

Wie auch immer, die gebräuchlichste Architektur für Unity Projekte ist es, ein Assets Verzeichnis im Hauptverzeichnis zu haben, in dem alle weiteren Verzeichnisse enthalten sind, jeweils getrennt nach Audio, Grafik, Modelle, Materialen, Scripte, Szenen, usw.

Da Godot das Aufteilen von Szenen in kleinere Szenen erlaubt, und jede Szene und Unterszene als eigene Datei innerhalb des Projektes existiert, empfehlen wir das Projekt etwas anders zu organisieren. Dieser Eintrag führt zu einer entsprechende Seite: Projekt Organisation.

Wo sind meine Vorlagen?

Als 'Prefrab' bezeichnet man, genau wie in Unity, eine Art 'Vorlage' der Szene. Es ist wiederverwendbar und jedes dieser Templates, dass sich in der Szene befindet, steht alleine, jedoch haben alle dieselben Eigenschaften wie das Original.

Godot bietet keine Vorlagen als solche, aber das Szenensystem bietet die gleiche funktionalität und ist in einer Baumstruktur aufgebaut. Godot erlaubt das speichern von einem Teil dieses Baums als Szenen-Datei. Diese neue Szene kann dann als neues Unterobjekt eines Nodes so oft man möchte eingefügt werden. Jede Änderung an dieser neuen, separaten Szenenvorlage wird an allen genutzten Objekten vorgenommen. Im Gegensatz dazu hat eine Änderung an solch einem Unterobjekt keine Auswirkung auf die VorlagenSzene.

../../_images/save-branch-as-scene.png

Um genau zu sein, können Sie die Parameter einer Instanz in der Inspektorleiste ändern. Die Nodes, aus denen diese Instanz besteht, sind zunächst gesperrt. Sie können sie bei Bedarf entsperren, indem Sie mit der rechten Maustaste auf die Instanz im Szenenbaum klicken und im Menü "Bearbeitbare untergeordnete Elemente" auswählen. Sie müssen dies nicht tun, um diesem Node neue untergeordnete Nodes hinzuzufügen. Denken Sie daran, dass alle neuen untergeordneten Elemente zur Instanz gehören und nicht zur "Vorlagenszene" auf der Festplatte. Wenn Sie jeder Instanz Ihrer "Vorlagenszene" neue untergeordnete Elemente hinzufügen möchten, sollten Sie diese in der "Vorlagenszene" hinzufügen.

../../_images/editable-children.png

Glossar Korrespondenz

  • SpielObject (GameObject) -> Node
  • Füge eine Komponente hinzu -> Vererbung
  • Prefab -> Wiederverwendbare Szenendatei

Skripting: GDScript, C# und VisualScript

Gestaltung

Unity unterstützt C#. C# profitiert von der Integration seitens Visual Studios und bietet begehrenswerte Features wie Static Typing.

Godot bietet eine eigene Skriptsprache, GDScript sowie auch Support für VisualScript und C#. GDScript hat einen ähnlichen Aufbau wie Python, beide sind aber nicht miteinander verwand.Falls Sie sich wundern wieso eine eigene Skriptsprache verwendet wird, siehe hier GDScript Grundlagen and Häufig gestellte Fragen. GDScript ist stark mit der Godot API verknüpft und ist einfach zu erlernen: etwa einen Abend für einen erfahrenen Programmierer und eine Woche für einen Anfänger.

Unity erlaubt es mehrere Skripte an ein GameObject anzufügen. Jedes Skript ist für ein bestimmtes Verhalten des GameObjects zuständig: Zum Beispiel kann ein Skript auf die Spielereingabe reagieren und ein anderes Skript steuert die spezielle Spiellogik.

In Godot kann nur ein Skript pro Node angehängt werden. Es kann entweder ein externes GDSkript genutzt werden, oder dies wird direkt im entsprechendem Node eingefügt. Falls es nötig sein sollte mehrere Skripte an einen einzigen Node zu hängen, hat man zwei Möglichkeiten, abhängig von der Szene und was man erreichen möchte:

  • füge ein neues Node zwischen Zielnode und aktuellem Parent-Node hinzu, dann hefte ein Skript an dieses neue Node an.
  • oder Sie teilen Ihr Ziel-Node in mehrere Unterobjekte und heften dann ein Skript an jedes davon an.

Wie Sie sehen können, kann es einfach sein, einen Szenenbaum in ein Chaos zu verwandeln. Teilen Sie eine komplizierte Szene in mehrere kleinere Zweige auf.

Verbindungen: Gruppen und Signale

Sie können Nodes handhaben durch den Zugriff auf sie durch ein angehängtes Skript, oder rufe die eingebauten benutzerdefinierten Funktionen in ihnen auf. Sie können also Nodes in eine Gruppe platzieren und dann Funktionen in allen Nodes dieser Gruppe aufrufen. Mehr dazu unter: scripting documentation.

Nodes können ein Signal senden falls bestimmte Aktionen ausgelöst werden. Ein Signal kann eingerichtet werden jede Funktion aufzurufen. Sie können auch eigene Signale definieren und spezifizieren wann diese ausgelöst werden sollen. Siehe mehr unter Signal-Dokumentation.

Skript-Serialisierung

Unity kann die Skript-Serialisierung auf zwei Wege leisten:

  • Implizit: Alle öffentlichen Felder einer Klasse werden automatisch serialisiert falls der Typ auch wirklich serialisierbar ist. (Ein Dictionary ist z.B. nicht serialisierbar).
  • Explizit: Nicht-öffentliche Felder können serialisiert werden durch der Benützung des [SerializeField] Attribute.

Godot liefert ebenfalls ein eingebautes Skript-Serialisations-System, aber das funktioniert nur explizit. Jeder serialisierbare Typ (built-in and various engine types, unter anderem Array und Dictionary) kann uter Benutzung des Keywords export serialisiert werden. Mehr Details stehen in der exports documentation.

Unity besitzt ebenfalls einen Datentyp namens ScriptableObject, welcher zur Serialisierung von benutzerdefinierten Asset-Objekten dient. Das Äquivalent in Godot ist die Basisklasse für alle Ressourcen: Resource. Das Erzeugen eines Skripts, dass von Resource erbt, erlaubt das Erstellen von benutzerdefinierten, serialisierbaren Objekte. Weitere Informationen über Ressourcen können hier gefunden werden.

Verwenden von Godot mit C++

Godot ermöglicht es Ihnen, Ihre Projekte direkt in C++ durch API zu entwickeln, was in Unity z.B. nicht möglich ist. Z.B. könnte man den Editor der Godot-Engine als ein "Spiel", geschrieben in C++ mithilfe der Nutzung der Godot API betrachten.

Falls Sie interessiert daran sind, C++ mit Godot zusammen zu verwenden, schauen Sie hier vorbei: Entwickeln in C++.