Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 16 Min.

Per Skript zum Spiel

Die Game-Engine bietet zahlreiche Möglichkeiten, um 2D- und 3D-Welten zu ­erstellen und zum Leben zu erwecken – auch mit C#-Skripten.
© dotnetpro
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 Scrip­ting 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-Funk­tio­nen 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 Scrip­ting 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 Interak­tion 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-Back­end 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.
Auf diese Weise können Sie bereits auf häufig eintreffende Ereignisse reagieren. Die Dokumentation zu MonoBehaviour erläutert viele weitere Events und Methoden [4].Listing 2 zeigt einige Vorbereitungen, die für die Bewegung eines Objekts zu treffen sind, zum Beispiel Referenzen auf den Körper und die Tasten, mit denen das Objekt bewegt werden soll. In diesem Fall werden die bekannten Tasten [W], [A], [S] und [D] genutzt. Zudem werden die Richtungen definiert, die für diese Tasten gelten sollen.
Listing 2: Eigenschaften und Startmethode
&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; Rigidbody rigidBody; &lt;br/&gt;&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; KeyCode[] inputKeys; &lt;br/&gt;&lt;span class="hljs-keyword"&gt;private&lt;/span&gt; Vector3[] directionsForKeys; &lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;// ... &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;void Start () { &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;  inputKeys = new KeyCode[]&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;  { KeyCode.W, KeyCode.A, KeyCode.S, KeyCode.D }; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;  directionsForKeys = new Vector3[] {&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;    Vector3.forward, Vector3.left, Vector3.back,&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;    Vector3.right }; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;  rigidBody = GetComponent&amp;lt;Rigidbody&amp;gt;(); &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;}&lt;/span&gt; 
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
&lt;span class="hljs-function"&gt;&lt;span class="hljs-keyword"&gt;void&lt;/span&gt; &lt;span class="hljs-title"&gt;FixedUpdate&lt;/span&gt; (&lt;span class="hljs-params"&gt;&lt;/span&gt;) &lt;/span&gt;{ &lt;br/&gt;  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;int&lt;/span&gt; i = &lt;span class="hljs-number"&gt;0&lt;/span&gt;; i &amp;lt; inputKeys.Length; i++){ &lt;br/&gt;    &lt;span class="hljs-keyword"&gt;var&lt;/span&gt; key = inputKeys[i]; &lt;br/&gt;&lt;br/&gt;    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt;(Input.GetKey(key)) { &lt;br/&gt;      Vector3 movement = directionsForKeys[i] *&lt;br/&gt;        acceleration * Time.deltaTime; &lt;br/&gt;        movePlayer(movement); &lt;br/&gt;    } &lt;br/&gt;  } &lt;br/&gt;} 
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.
Eine detailliertere Beschreibung ist aufgrund des Umfangs schwer in einen Artikel unterzubringen. Die Unity-Skript-referenz übernimmt das in Form einer sehr ausführlichen Online-Dokumentation [5].

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 Vi­sual 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 Programmieren­lernen 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, Un­real 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

  1. Setting Up Your Scripting Environment, http://www.dotnetpro.de/SL2211Unity1
  2. Overview of .NET in Unity, http://www.dotnetpro.de/SL2211Unity2
  3. Unity architecture, http://www.dotnetpro.de/SL2211Unity3
  4. MonoBehaviour, http://www.dotnetpro.de/SL2211Unity4
  5. Welcome to the Unity Scripting Reference!, http://www.dotnetpro.de/SL2211Unity5
  6. Debug C# code in Unity, http://www.dotnetpro.de/SL2211Unity6
  7. About Unity Test Framework, http://www.dotnetpro.de/SL2211Unity7
  8. ARK: Survival Evolved für Steam, http://www.dotnetpro.de/SL2211Unity8
  9. Twitch-Kanal von Bonjwa, http://www.twitch.tv/bonjwa
  10. MIT Scratch, https://scratch.mit.edu

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige