17. Okt 2022
Lesedauer 16 Min.
Per Skript zum Spiel
Unity, Teil 2: Visuelles und codebasiertes Scripting
Die Game-Engine bietet zahlreiche Möglichkeiten, um 2D- und 3D-Welten zu erstellen und zum Leben zu erwecken – auch mit C#-Skripten.

Unity ist eine der besten plattformübergreifenden Spiele-Engines mit AR-/VR-Integrationsfähigkeit und einer leistungsstarken Rendering-Engine (HDRP, URP). Der dazugehörige Asset Store unterstützt den Erwerb von kostenlosen und kostenpflichtigen Assets. Zudem unterstützt Unity Scripting, um Spiele zu implementieren.Im ersten Teil dieser Serie lag der Fokus auf einer allgemeinen Einführung. In diesem zweiten Teil geht es ausschließlich um das Scripting, sowohl visuell als auch mit C#. Untersucht werden dabei unter anderem die Einrichtungen beider Varianten, die Umsetzung anhand von Beispielen, das Debugging und Schreiben von Unit-Tests beim C#-Scripting sowie die Vor- und Nachteile beider Systeme.Das Scripting in Unity ist ein sehr elementares Werkzeug. Ab einem gewissen Entwicklungsfortschritt der eigenen 2D- oder 3D-Welt gelangt man stets an einen Punkt, an dem das Projekt zum Leben erweckt werden soll. Eingaben von Nutzern sollen verarbeitet und auf Ereignisse soll reagiert werden. All das übernimmt in Unity das Scripting.Für die Realisierung gibt es grob gesagt zwei Wege: das visuelle Scripting und das Scripting basierend auf einer Programmiersprache. Letzteres bedeutet bei Unity C#. Für das visuelle Scripting stehen verschiedene Plug-ins und Implementierungen zur Verfügung. Beide Wege sind gänzlich unterschiedlich umgesetzt und vereinen somit sehr unterschiedliche Eigenschaften sowie Vor- und Nachteile.Grundsätzlich gilt aber, dass das Erstellen von Skripten für die Entwicklung von Spielen nicht notwendig, aber äußerst hilfreich ist. Zudem ist es nützlich, zumindest ein wenig über Programmierung zu wissen, selbst wenn es nicht das Ziel ist, selbst in die Softwareentwicklung einzusteigen. Auch visuelle Skripte geben einen Einblick in die Denkweise der Softwareentwicklung. Das hilft, effektiver in einem Team zu kommunizieren. Und wer grundsätzlich plant, in die Entwicklung von Software einzutauchen, findet mit dem C#-Scripting von Unity durchaus einen guten Einstieg.
Warum mehrere Varianten?
Eine zentrale Frage ist, warum es überhaupt zwei verschiedene Varianten gibt, um in Unity Skripte zu erstellen. Prinzipiell würde eine Variante sicherlich ausreichen. Das ist auf der einen Seite korrekt, auf der anderen Seite aber zu kurz gedacht.Unity gilt als guter Einstieg in die Welt der Spieleentwicklung. Diesen Ruf hat die Engine nicht zuletzt, weil das visuelle Scripting allen hilft, die überhaupt nicht programmieren können. Es ist dann zwar immer noch komplex, mit dem visuellen Scripting einzusteigen, weil auch dort Konzepte wie Bedingungen und Schleifen notwendig sind. Allerdings ist das immer noch eine ganze Ecke einfacher, als gleich eine Programmiersprache zu erlernen. Hier kommt direkt zu Beginn die Syntax als Hürde hinzu. Da es aber doch seine Zeit dauert, programmieren zu lernen, soll diese Syntax nicht im Weg stehen, wenn jemand enthusiastisch daran geht, ein eigenes Spiel zu erstellen.Zudem ist das Programmieren nichts für jeden. Bitte nicht falsch verstehen: Das ist kein Hexenwerk und Übung macht sehr viel aus, allerdings muss nicht jeder in die Softwareentwicklung einsteigen. Bei der Entwicklung eines Spiels lassen sich, wie in anderen Softwareprojekten auch, viele Aufgaben verteilen. Mit dem visuellen Scripting bleibt dieser Teil nicht ausschließlich den Softwareentwicklern vorbehalten und auch (Spiele-)Designer und andere Teammitglieder können produktiv mitwirken.Visuelles Scripting
Wie der Name schon sagt, können Sie mit visuellem Scripting Spielfunktionen auf verschiedene Weise visuell hinzufügen – in der Regel ohne die Notwendigkeit, überhaupt zu programmieren. Voraussetzung ist, dass das Wissen vorhanden ist, wie ein Algorithmus strukturiert wird, oder genauer, wie die Abläufe innerhalb eines Workflows sind. Das lässt sich allerdings auch alles anhand von Unity erlernen. Ist das gegeben beziehungsweise ist der Wunsch vorhanden, diese Fähigkeiten zu erlernen, lässt sich praktisch jede Art von Spiel erstellen. Viele visuelle Scripting-Tools bieten zudem den vollen Zugriff auf das API der Engine, sodass man sich keine Sorgen machen muss, nützliche Engine-Tools zu verpassen.Wie in der Einleitung kurz beschrieben, geht es beim visuellen Scripting darum, visuell zu programmieren. Im Fall von Unity wird dies in Form von verschiebbaren Blöcken oder Knoten dargestellt, die auf einem Canvas, also einer Zeichenfläche, zu einem Graphen hinzugefügt werden können. Jeder Knoten oder Block ist mit einer bestimmten Funktionalität verknüpft, wie zum Beispiel der Anpassung der Transformation eines Objekts, der Änderung von Variablenwerten und so weiter. Indem diese Funktionalitäten an ein Objekt angehängt werden, lassen sich diese Funktionen über den Block auf das Objekt anwenden, anstatt sie von Grund auf neu zu programmieren.Darüber hinaus können Sie Blöcke ganz einfach miteinander verbinden, was das visuelle Scripting recht leistungsstark macht. Angenommen, eine Figur „stirbt“ und Sie wollen ihr ein Leben abziehen und sie an eine bestimmte Startposition verschieben. In diesem Fall nimmt man einfach einen Block, der die Lebenspunkte abziehen soll, und verbindet ihn mit einem Block, der die Position der Figur verschiebt. Diese Sequenz wird dann einfach ausgelöst, wenn der Charakter stirbt – ganz ohne Programmieraufwand.Visuelle Skripte in Unity erstellen
Bei der beliebten Engine Unity gibt es zwei Möglichkeiten, visuelles Scripting zu nutzen. Zu beachten ist, dass sich der Zugriff auf das visuelle Scripting-Tool zwar unterscheidet, beide Arten jedoch mit einigen kleinen Unterschieden sehr ähnlich verwendet werden können.Unity Bolt ist ein von Unity entwickeltes Paket, das sich für jedes Unity-Projekt mit Version 2018.4.15 oder höher bis einschließlich Version 2021.1 herunterladen lässt. Mit diesem Asset steht ein einfaches Diagramm zur Verfügung, mit dem Sie arbeiten können und das über visuelle Scripting-Funktionen verfügt. Bis vor Kurzem war dies die primäre Methode, um diese Art Scripting in Unity zu verwenden, und sie hat sich über die Jahre bewährt.Bei Unity 2021.1 und später hat Unity das visuelle Scripting aufgrund des immensen Erfolgs standardmäßig mit dem Editor verpackt und ausgeliefert. Es wurden zwar einige kleinere Fehler behoben und Verbesserungen vorgenommen, die Funktionsweise ist jedoch weitgehend dieselbe wie bei Bolt. Da es jedoch mit dem Editor gebündelt ist, muss nichts extra heruntergeladen werden. Daher soll dies nun der neue Standard für in Unity entwickelte Spiele werden.Ein visuelles Skript lässt sich beispielsweise sehr einfach zu einem Objekt erstellen. Zunächst wird im Unity-Editor dazu ein Objekt angelegt, zum Beispiel ein Rechteck in 2D. Ist dieses Objekt markiert, lassen sich Komponenten hinzufügen, darunter auch die visuelle Scripting-Engine, „script machine“ genannt. Im Anschluss daran lässt sich ein neuer Graph anlegen, der mit Knoten und Kanten für den Ablauf des Workflows gefüllt wird. Bild 1 zeigt dazu ein kurzes Beispiel. Damit haben Sie sehr schnell Logik zu Elementen hinzugefügt, ohne eine Zeile Code geschrieben zu haben.
Die visuelle Scripting-Umgebungin Unity(Bild 1)
Autor
Scripting mit C#
Das Gegenstück zum visuellen Scripting ist das Erstellen von Skripten in einer Programmiersprache. Da Unity dabei auf C# setzt, soll es hier einfach C#-Scripting heißen. Unity verwendet C# als primäre Skriptsprache, die sich auf breiter Basis durchgesetzt hat. Sie können Code aber auch in JavaScript schreiben, allerdings scheint C# bevorzugt zu werden. Unity arbeitet nur mit objektorientierten Programmiersprachen. Variablen, Methoden und Klassen sind damit die primären Bausteine, die in den Skripten zum Einsatz kommen.Um das Scripting mit C# nutzen zu können, ist eine Entwicklungsumgebung zu installieren, bei einigen mit einem spezifischen Plug-in für Unity. Der erste Teil dieser Serie hat das bereits erwähnt und hat als Beispiel gezeigt, wie JetBrains Rider konfiguriert wird. Weitere Informationen dazu enthält die Dokumentation zu Unity im Abschnitt über das Aufsetzen und Konfigurieren der Entwicklungsumgebung [1].Architektur und Plug-ins
Die Unity-Engine ist intern in nativem C/C++ implementiert, verfügt jedoch über einen C#-Wrapper, der bei der Interaktion mit der Engine zum Einsatz kommen soll. Daher ist es sinnvoll, einige Schlüsselkonzepte zu kennen, die Unity für den C#-Wrapper nutzt.Unity verwendet als Beispiel zwei Scripting-Backends, nämlich Mono und IL2CPP (Intermediate Language To C++), von denen jedes eine andere Kompilierungstechnik nutzt: Mono verwendet die Just-in-Time-Kompilierung (JIT) und kompiliert den Code bei Bedarf zur Laufzeit. IL2CPP nutzt die AOT-Kompilierung (AOT: Ahead of Time) und kompiliert die gesamte Anwendung vor der Ausführung. Der Vorteil der Verwendung eines JIT-basierten Scripting-Backends ist, dass der Kompiliervorgang in der Regel viel weniger Zeit benötigt als bei AOT.Unity verwendet das Mono-Backend auf Plattformen, die Mono unterstützen. Wenn Sie einen Player für die Anwendung erstellen, können Sie auswählen, welches Scripting-Backend verwendet werden soll. Die Einstellung dazu befindet sich in den Projekteinstellungen eines geöffneten Projekts im Unity-Editor.Die Übersicht der C#-Integration in Unity innerhalb der Dokumentation gibt einen sehr detaillierten Einblick in die Konzepte und Implementierungen [2]. Daher sei ein Verweis darauf an dieser Stelle gestattet, um den Umfang des Artikels nicht gänzlich zu sprengen. Die Dokumentation zur Unity-Architektur erläutert zudem viele weitere Konzepte, beispielsweise für das erneute Laden von Code im Editor und die Skript-Serialisierung [3].Neben Skripten lässt sich auch außerhalb von Unity erstellter Code in Form von Plug-ins einbinden. Unity unterstützt zwei verschiedene Arten von Plug-ins:- Verwaltete (managed) Plug-ins sind verwaltete .NET-Assemblies, die mit Tools wie Visual Studio erstellt werden können. Diese enthalten nur .NET-Code, was bedeutet, dass sie nicht auf Funktionen zugreifen können, die von den .NET-Bibliotheken nicht unterstützt werden.
- Zusätzlich gibt es native Plug-ins, also plattformspezifische Bibliotheken mit nativem Code. Diese können auf Funktionen wie Betriebssystemaufrufe und Codebibliotheken von Drittanbietern zugreifen, die sonst für Unity nicht verfügbar wären.
Ein Skript erstellen
Unity verwendet C# als Skriptsprache, um die Logik zu implementieren. So lassen sich die Instanzierung und Manipulation von Objekten, Nutzerinteraktionen und die UI-Steuerung umsetzen. Das Highlight von Unity-Scripting ist der einfache Zugriff auf Objekte über den Inspektor und die Lebenszyklusmethoden der Klasse MonoBehaviour.Das Scripting steuert als Einheit Instanzen der GameObject-Objekte, die das Verhalten und die Interaktion der Spielobjekte in der Szene bestimmen. Die Stärke von Unity-Scripting sind die erwähnten Lebenszyklusmethoden und die APIs für GameObject-Manipulationen. Sie können in Skripten alles in der Unity-Szene als GameObject betrachten und im Skript über den Inspektor oder die GetComponent()-Methode darauf verweisen.Listing 1 zeigt den Rohbau eines ersten Skripts. Die Klasse erbt von MonoBehaviour und implementiert die Methoden Start() und Update(). Erstere wird vor dem ersten Frame-Update aufgerufen; Letztere wird immer pro Frame aufgerufen, um Aktualisierungen auszuführen.Listing 1: Der Standardaufbau eines C#-Skripts
<span class="hljs-keyword">using</span> System.Collections; <br/><span class="hljs-keyword">using</span> System.Collections.Generic; <br/><span class="hljs-keyword">using</span> UnityEngine; <br/><br/><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> : <span class="hljs-title">MonoBehaviour</span> <br/>{ <br/> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Start</span>(<span class="hljs-params"></span>) </span><br/><span class="hljs-function"> </span>{ <br/> Debug.Log(<span class="hljs-string">"Hello C# Scripting World!"</span>); <br/> } <br/> <br/> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Update</span>(<span class="hljs-params"></span>) </span><br/><span class="hljs-function"> </span>{ <br/><br/> } <br/>}
GameObject ist die Kernkomponente eines Unity-Projekts. Alle Objekte wie Licht, UI und 3D-Modelle sind von GameObject abgeleitet. Damit ist dies die übergeordnete Klasse für alle Objekte, die in einer Unity-Szene verwendet werden.In Unity können wir mit GameObject auf zwei Arten interagieren: über den Inspektor und über ein Skript. Wenn Sie beispielsweise die Position des Objekts ändern möchten, lässt sich das sehr einfach über das Inspektor-Fenster bewerkstelligen. Außerdem lassen sich die Render-Eigenschaften ändern und zusätzliche Komponenten wie Rigidbodies und nutzerdefinierte Skripte hinzufügen. Bei Bedarf lässt sich das ebenfalls über ein nutzerdefiniertes Skript erledigen.Ausgehend von dem ersten Beispielskript können Sie jetzt als Test eine Klasse erstellen, um ein Spielerobjekt zu bewegen. Zuerst benennen Sie die Klasse und die Datei dementsprechend um. PlayerMovement scheint ein sinnvoller Name zu sein:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PlayerMovement</span> : <span class="hljs-type">MonoBehaviour {</span></span>
Die Klasse ist von der Basisklasse MonoBehaviour abgeleitet, die dafür sorgt, dass dieses Skript im Game-Loop läuft und zusätzliche Funktionen hat, um auf bestimmte Ereignisse zu reagieren. Auf die iOS-Welt bezogen ist dieses Objekt das Äquivalent zu UIViewController. Unity ruft während der Ausführung des Skripts mehrere Methoden in einer bestimmten Reihenfolge auf. Einige der häufigsten sind die folgenden:
- Start(): Diese Methode wird einmal aufgerufen, kurz bevor das Skript sein erstes Update erhält.
- Update(): Während das Spiel läuft und das Skript aktiviert ist, wird diese Methode bei jedem Frame ausgelöst.
- OnDestroy(): Diese Methode wird aufgerufen, bevor das GameObject, an welches das Skript angehängt ist, zerstört wird.
- OnCollisionEnter(): Wenn der Collider oder Rigidbody, an den das Skript angehängt ist, einen anderen Collider oder Rigidbody berührt, wird diese Methode aufgerufen.
Listing 2: Eigenschaften und Startmethode
<span class="hljs-keyword">private</span> Rigidbody rigidBody; <br/><span class="hljs-keyword">private</span> KeyCode[] inputKeys; <br/><span class="hljs-keyword">private</span> Vector3[] directionsForKeys; <br/><br/><span class="hljs-comment">// ... </span><br/><br/><span class="hljs-comment">void Start () { </span><br/><span class="hljs-comment"> inputKeys = new KeyCode[]</span><br/><span class="hljs-comment"> { KeyCode.W, KeyCode.A, KeyCode.S, KeyCode.D }; </span><br/><br/><span class="hljs-comment"> directionsForKeys = new Vector3[] {</span><br/><span class="hljs-comment"> Vector3.forward, Vector3.left, Vector3.back,</span><br/><span class="hljs-comment"> Vector3.right }; </span><br/><br/><span class="hljs-comment"> rigidBody = GetComponent&lt;Rigidbody&gt;(); </span><br/><span class="hljs-comment">}</span>
Um die Spielfigur tatsächlich zu bewegen, müssen Sie Eingaben über die Tastatur verarbeiten. Dazu benennen Sie die Methode Update() in FixedUpdate() um und fügen dieser den Code aus Listing 3 hinzu. Dieser Code setzt einige wichtige Elemente um. FixedUpdate() ist unabhängig von der Framerate und sollte bei der Arbeit mit Rigidbody-Objekten verwendet werden. Anstatt so schnell wie möglich abzulaufen, wird diese Methode in einem konstanten Intervall ausgeführt. Die implementierte Schleife prüft, ob eine der Eingabetasten gedrückt wurde. Der Code ermittelt die Richtung der gedrückten Taste und multipliziert sie mit der Beschleunigung und der Anzahl der Sekunden, die für das letzte Bild benötigt wurden. Daraus ergibt sich ein Richtungsvektor (Geschwindigkeit auf der x-, y- und z-Achse), mit dem das Player-Objekt bewegt wird.
Listing 3: Die Methode für die Eingabesteuerung
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">FixedUpdate</span> (<span class="hljs-params"></span>) </span>{ <br/> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; inputKeys.Length; i++){ <br/> <span class="hljs-keyword">var</span> key = inputKeys[i]; <br/><br/> <span class="hljs-keyword">if</span>(Input.GetKey(key)) { <br/> Vector3 movement = directionsForKeys[i] *<br/> acceleration * Time.deltaTime; <br/> movePlayer(movement); <br/> } <br/> } <br/>}
Während das Spiel läuft, variiert die Framerate (oder Bilder pro Sekunde) je nach Hardware und Belastung. Dies kann dazu führen, dass manche Dinge auf leistungsstarken Rechnern zu schnell, auf schwächeren zu langsam ablaufen, was unerwünscht sein kann. Eine allgemeine Regel ist, dass Aktionen, die in jedem (festen) Frame durchgeführt werden sollen, mit Time.deltaTime multipliziert werden müssen.Anschließend erstellen Sie die in Listing 4 gezeigte weitere Methode. Mit movePlayer() wird das Objekt tatsächlich bewegt. Der Methodenaufruf ist bereits in Listing 3 enthalten. Die obige Methode übt eine Kraft auf den Körper aus, die ihn in Bewegung versetzt. Wenn die aktuelle Geschwindigkeit maxSpeed übersteigt, geht die Kraft in die entgegengesetzte Richtung, um den Spieler zu verlangsamen und die Höchstgeschwindigkeit effektiv zu begrenzen.Das ist nur ein Beispiel aus vielen Möglichkeiten. Sie können beispielsweise Code nutzen, um jetzt ein Skript für die Kamera zu erstellen, für weitere Objekte als Gegner oder für besondere Mechaniken, wie Bereiche in der Spielwelt, die tödlich für den Spielercharakter sind, für Bewegungspfade für Gegner und viele, viele mehr.
Wichtige Klassen im Überblick
Einige wichtige Klassen haben die vorherigen Beispiele bereits angesprochen. Zum Beispiel GameObject, welche die Art von Objekten repräsentiert, die in einer Szene existieren können. Daneben gibt es zahlreiche weitere Klassen. Es ist nicht verkehrt, von diesen schon einmal gehört zu haben, um Konzepte und Implementierungen im Bereich Unity-Scripting besser einordnen zu können.- Transform: Bietet eine Vielzahl von Möglichkeiten, um die Position, die Rotation und die Skalierung eines GameObject-Objekts sowie seine hierarchische Beziehung zu über- und untergeordneten GameObject-Objekten per Skript zu bearbeiten.
- Vektoren: Klassen zum Ausdrücken und Manipulieren von 2D-, 3D- und 4D-Punkten, Linien und Richtungen.
- Quaternion: Eine Klasse, die eine absolute oder relative Drehung darstellt und Methoden zum Erstellen und Bearbeiten des Quaternions bietet.
- ScriptableObject: Ein Datencontainer, in dem sich große Datenmengen speichern lassen.
- Time (mit Framerate-Management): Mit dieser Klasse können Sie die Zeit messen und steuern sowie die Framerate im Projekt verwalten.
- Mathf: Eine Sammlung allgemeiner mathematischer Funktionen, einschließlich trigonometrischer, logarithmischer und anderer Funktionen, die häufig in Spielen und bei der App-Entwicklung benötigt werden.
- Random: Bietet einfache Möglichkeiten, um verschiedene häufig benötigte Arten von Zufallswerten zu erzeugen.
- Debug: Diese Klasse ermöglicht es, Informationen im Editor zu visualisieren, die helfen sollen, zu verstehen oder zu untersuchen, was im Projekt vor sich geht, während es ausgeführt wird.
- Gizmos und Handler: Ermöglichen das Zeichnen von Linien und Formen in der Szenenansicht und Spielansicht sowie interaktive Handler und Steuerelemente.
Debugging und Unit-Tests mit C#-Skripten
Schon bei kleineren Skripten wird schnell das Thema Debugging wichtig. Unity ermöglicht es, einen Debugger zu nutzen, um den Quellcode zu prüfen, während die Anwendung ausgeführt wird. Es unterstützt die folgenden Code-Editoren zum Debuggen von C#-Code: Visual Studio (mit dem Plug-in Visual Studio Tools for Unity), Visual Studio für Mac, JetBrains Rider und Visual Studio Code (experimentell). Den Einsatz von JetBrains Rider hat der erste Teil dieser Unity-Serie bereits gezeigt und kurz erläutert; dort funktioniert das Debugging problemlos.Obwohl sich diese Code-Editoren hinsichtlich der unterstützten Debugging-Funktionen leicht unterscheiden, bieten sie grundlegende Funktionen wie Haltepunkte, Einzelschritte und Variablenprüfung an. Die Wahl einer Entwicklungsumgebung hängt somit eher damit zusammen, welche IDE bereits im Einsatz ist oder welche einem Entwickler persönlich besser gefällt. Welche Einstellungen vorgenommen werden müssen, damit das Debugging mit der IDE der Wahl funktioniert, zeigt die Dokumentation von Unity zum Thema „Debug C# code in Unity“ sehr ausführlich [6].Wenn das Projekt umfangreicher wird und die Anzahl der Skripte, Klassen und Methoden zunehmen, kommt fast unweigerlich das Thema Unit-Tests auf den Plan. Diese automatisierten Tests prüfen die C#-Skripte, ob alles wie gewünscht funktioniert. Das Unity-Test-Framework-Paket (ehemals Unity Test Runner) ist ein Tool, mit dem Sie Code sowohl im Editier- als auch im Spielmodus und auch auf Zielplattformen wie Standalone, Android oder iOS testen können [7]. Das Test-Framework bietet somit einen großen Funktionsumfang, damit der Code nicht nur während der Entwicklungsphase stabiler und fehlerfreier wird.Vor- und Nachteile der Scripting-Varianten
Über die Vor- und Nachteile des visuellen und des codebasierten Scripting lässt sich lang und breit diskutieren. Wenn das visuelle Scripting so einsteigerfreundlich, übersichtlich und gut ist, stellt sich die berechtigte Frage, warum Anwendungen dann überhaupt mit Code programmiert werden.Eine Antwort ist die Skalierbarkeit. Mithilfe des Visual Scripting erstellte Anwendungen lassen sich schwer(er) skalieren. Auch für geübte Personen dauert es wesentlich länger, Code visuell zu erstellen. Zudem ist es oft schwieriger, den Code zu verändern, da zahlreiche Blöcke und Verbindungen verändert werden müssen, anstatt nur ein paar Zeichen zu schreiben.Das ist aber nur die halbe Wahrheit, denn bei dieser Art von Einschätzungen wird immer davon ausgegangen, dass der Code optimal geschrieben ist. Auch in C# kann es durchaus lange dauern, überhaupt die entsprechende Stelle in zahlreichen Dateien und Codezeilen zu finden. Was gedanklich oft unter den Tisch fällt, ist zudem die Möglichkeit, beide Varianten miteinander zu mischen; das wird ebenfalls unterstützt. Ob das sinnvoll ist, muss von Projekt zu Projekt entschieden werden, eine generelle Empfehlung ist hier schwierig.Ein weiterer Diskussionspunkt ist die Performance. Oft ist von einer schlechteren Leistung die Rede, wenn das visuelle Scripting zum Einsatz kommt. Ganz unbegründet ist dieser Einwand nicht, denn das beste Laufzeitverhalten gibt es prinzipiell erst dann, wenn alles nativ in Code implementiert wurde. Allerdings gilt auch das nur, wenn der Code hochgradig optimiert ist. Schlecht geschriebener Code ist selten besser als der Code, der durch das visuelle Scripting im Hintergrund erzeugt wird. Denn auch dafür sind Optimierungen möglich, die automatisiert beim Generieren des Codes erfolgen.In den meisten Fällen arbeiten Sie allerdings selten am nächsten AAA-Blockbuster. Daher ist es sinnvoll, das Thema Laufzeitverhalten nicht von Beginn an zu hoch aufzuhängen. Damit ist nicht gemeint, es vollkommen zu ignorieren, aber es sollte nicht der ständige Dreh- und Angelpunkt sein. Das Videospiel ARK: Survival Evolved [8] ist beispielsweise mit der Unreal Engine zu 99 Prozent in Blueprint erstellt. Erst später wurde es beim Optimierungsprozess angepasst und in C++ umgewandelt. Das zeigt eindrucksvoll, dass man mit einer visuellen Sprache beginnen kann, um auch im Nachgang noch den Weg in Richtung Code zu nehmen. Für Indy-Titel ist das mittlerweile ein sehr wichtiger Weg geworden, um die Spieleentwicklung zu ermöglichen.Wer gerne mal live dabei zusehen möchte, wie so ein Spiel entwickelt wird, kann beim Twitch-Kanal des Unternehmens Bonjwa reinschauen [9]. Dort wird in regelmäßigen Abständen die Entwicklung eines Spiels mit der Unreal Engine gestreamt, dass fast vollständig mit Blueprint erstellt wird.Visual Scripting in Spiele-Engines
Der Einsatz von Visual Scripting in der Softwareentwicklung ist allgemein betrachtet keine Neuheit. Beim Programmierenlernen gibt es Systeme wie Scratch schon sehr lange [10]. Diese Plattformen bieten visuelle Elemente an, damit die Hürde, Syntaxelemente zu lernen, entfällt und Anfänger schneller einsteigen können. Durch das Aufkommen von No- und Low-Code wird das Thema nun in der Breite wichtig und erreicht immer mehr Bereiche. Echtzeit-3D-Engines wie Unity, Unreal oder Godot setzen schon länger auf visuelle Sprachen, die den Entwicklungsprozess einer Anwendung vereinfachen.Nicht nur Unity unterstützt das visuelle Scripting. Auch in Unreal gibt es ein ähnliches System. Dort nennt es sich Blueprints Visual Scripting, oder kurz Blueprints, und ist äußerst flexibel und leistungsstark. Damit besteht die Möglichkeit, die gesamte Palette an Konzepten und Werkzeugen zu verwenden, die normalerweise nur Programmierern zur Verfügung stehen. Somit stehen auch Nicht-Entwicklern, wie zum Beispiel Game-Designern, wichtige Konzepte zur Verfügung, um Spiele zu implementieren.Daneben ist die Open-Source-Game-Engine Godot zu nennen, die seit der Version 3.1 ebenfalls die Möglichkeit bietet, Code visuell darzustellen und auf diese Art das Scripting vorzunehmen.Anders als bei Unity und Godot bietet die Unreal Engine schon seit Jahren die Verwendung von Visual Scripting an und scheint diesbezüglich einen nicht unerheblichen Vorsprung in diesem Bereich zu haben. Da alle drei Engines diese Art der Entwicklung als wichtiges Merkmal ansehen, wird es mittlerweile als Wettbewerbsvorteil gesehen und auch in Zukunft weiter ausgebaut. Diese Funktionalität zu vernachlässigen kann sich mittlerweile niemand mehr leisten.Fazit
Der Artikel hat in die Themen des visuellen Scripting und des Code-Scripting auf Basis von C# eingeführt. Beide Funktionalitäten sind sehr mächtig und erlauben es, Spielen Leben einzuhauchen. So werden nicht nur Softwareentwickler angesprochen, sondern praktisch auch alle anderen, die an einem Spiel mitwirken, aber nicht direkt programmieren können.Da beide Varianten des Scripting die identischen Möglichkeiten und Merkmale bieten, nur anders verpackt, lassen sich in beiden Fällen auch komplexe Spiele damit umsetzen. Nicht nur in Unity, sondern auch in anderen Spiele-Engines ist das visuelle ebenso wie das codebasierte Scripting direkt integriert. Etwas nachträglich zu installieren ist mittlerweile nicht mehr notwendig. Das macht den Einstieg noch einmal etwas schneller und unkomplizierter.Wer mit Unity einsteigen möchte und sich trotz Erfahrung in der Softwareentwicklung nicht direkt an den Code herantraut, kann mit dem visuellen Scripting sehr viele Dinge ausprobieren und sich herantasten. Wer sich unsicher ist, macht sicherlich nichts verkehrt, beide Varianten mal auszuprobieren.Fussnoten
- Setting Up Your Scripting Environment, http://www.dotnetpro.de/SL2211Unity1
- Overview of .NET in Unity, http://www.dotnetpro.de/SL2211Unity2
- Unity architecture, http://www.dotnetpro.de/SL2211Unity3
- MonoBehaviour, http://www.dotnetpro.de/SL2211Unity4
- Welcome to the Unity Scripting Reference!, http://www.dotnetpro.de/SL2211Unity5
- Debug C# code in Unity, http://www.dotnetpro.de/SL2211Unity6
- About Unity Test Framework, http://www.dotnetpro.de/SL2211Unity7
- ARK: Survival Evolved für Steam, http://www.dotnetpro.de/SL2211Unity8
- Twitch-Kanal von Bonjwa, http://www.twitch.tv/bonjwa
- MIT Scratch, https://scratch.mit.edu