Toolbox Interactiondesign


Emerging Technologies

Unity Anfänger Script Tutorial

Unity Tutorial

Lisa Umlauft, 30.05.2014 | Emerging Technologies bei Sascha Reinhold

Dieses Tutorial ist für Einsteiger mit Basiskenntnissen im Programmieren gedacht und soll bei der Verwirklichung erster Projekte in Unity unterstützen – für ausführlichere Informationen, Tutorials und fortgeschrittene Projekte ist die Unity Learn Page ein guter Startpunkt.

Als Basis für Erklärungen wurde dieses Beispielprojekt verwendet, das beliebig genutzt, verändert und zerstört werden darf.

Unity User Interface

Das Layout der einzelnen Tabs in Unity ist frei veränderbar. Über das Dropdown-Menü Layout in der Toolbar können Voreinstellungen getroffen und Layouts gespeichert oder gelöscht werden. Das oben im Bild dargestellte Layout ist eine Möglichkeit, mit der man alles Wichtige im Blick behält.

Scene

Hier werden alle Objekte platziert und manipuliert. Die Buttons oben rechts lassen bequem durch unterschiedliche Funktionen wechseln. Von links nach rechts:

Hand-Tool (Shortcut Q) – Bewegung durch die Szene. Mit Alt + linke Maustaste bewegt sich die Kamera um den aktuellen Pivot-Punkt. Scrollrad oder Alt + rechte Maustaste für Zoomen.

Translate (W) – Objekt bewegen

Rotate (E) – Objekt drehen

Scale (R) – Objekt vergrößern oder verkleinern

Hierarchy

Hier sind alle Objekte der aktuellen Szene in hierarchischer Struktur aufgeführt. Soll ein Objekt abhängig vom anderen sein, wird es einfach auf das gewünschte Parentobjekt gezogen. Im Beispielprojekt wurde beispielsweise der Main Camera ein Spotlight zugewiesen, das sich so immer mit der Kamera mit bewegt und aus der First Person Perspektive einen Taschenlampeneffekt erzeugt.

Inspector

Ist ein Objekt ausgewählt, werden hier alle relevanten Informationen angezeigt – insbesondere manipulierbare Parameter. Hier können dem Objekt auch neue Komponenten wie Materialien, Skripte oder physikalische Elemente zugewiesen werden.

Project

Hier sind alle zum Projekt zugehörigen Assets aufgeführt. Es können neue Assets erstellt oder bestehende aus dem Unity Asset Store geladen werden. Mit Rechtsklick auf Assets können Assets und Packages aus anderen Ordnern importiert werden. Für das Beispielprojekt wurde unter Import Package das Standard Assets Package importiert, um den First Person Controller zu verwenden (für die Ego-Perspektive mit klassischer Interaktion) und um den Hintergrund zu erzeugen (Skyboxes).

Game

Hier wird die gerenderte Version des fertigen Spiels aus der Perspektive der Kamera(s) angezeigt, also das, was die Spieler später zu sehen kriegen. Um das Spiel zu testen, kann in den Play Mode gewechselt werden (Toolbar Mitte). Alle Änderungen, die im Play Mode durchgeführt werden, setzen sich automatisch zurück, wenn der Play Mode beendet wird – so kann alles ohne Verluste ausprobiert werden.

Damit klar ist, wann man sich im Play Mode befindet, ändert sich das Erscheinungsbild der Oberfläche entsprechend (in diesem Fall ist es auf grün eingestellt).

Scripten in Unity

In Unity wird mit C# programmiert. Einzelne Scripts werden dabei einem Objekt als „Component“ zugewiesen, können also in der Unity Umgebung direkt als solches manipuliert werden. Hierdurch können auch Anfänger schnell Ideen umsetzen.

Die Main Klasse

…gibt es in dem Sinn nicht, da Unity einen eher Komponenten-orientierten Ansatz hat. Globale Variablen sollten vermieden werden; allerdings können Objekte andere Objekte in der Szene sehen und mit ihnen interagieren.

Es ist möglich, ein „Manager Script“ zu schreiben, um globale Vorgänge zu lenken (generell erreicht mit einem leeren Game Objekt, dem dieses Script zugewiesen wird). Tendenziell wird dies aber nicht benötigt.

Alle Klassen in Unity erben von MonoBehaviour; die Engine ruft MonoBehaviour.Update(); und damit in jeder Klasse diese Funktion auf.

Allgemeine Funktionen

  • Als public deklarierte Variablen können in Unity direkt manipuliert werden
  • Awake() wird sofort ausgeführt, auch wenn das Skript auf disabled gestellt ist. Diese Funktion dient z.B. als Referenz zwischen Skripten.
  • Start() gleicht setup() in Processing, Update() gleicht draw(), wird also 1x pro Frame ausgeführt
  • FixedUpdate() hat konstante Intervalle, wird zum Beispiel für physikalische Funktionen (Rigidbody) benutzt

Objekte, Komponenten

Objekte können mehrere Komponenten enthalten; diese definieren beispielsweise das Aussehen oder das Verhalten des Objekts.

  • component.enabled = false; Komponente aktivieren/ deaktivieren – funktioniert auch mit Skripten. Beispiel Licht an-/ausschalten.
  • gameObject.setActive(true); Objekt wird aktiviert/deaktiviert
  • Ein mit einer Rigidbody Komponente versehenes Objekt unterliegt den Gesetzen der Physikengine von Unity, d.h. das Objekt verhält sich der Schwerkraft entsprechend und wird mit anderen Objekten zusammenprallen. Dazu gibt es noch allerhand Scripting-Möglichkeiten, bspw. realistische Beschleunigung
  • Destroy(gameObject); zerstört ein Objekt. Dies muss nicht das Objekt sein, dessen Skript den Befehl enthält. Mit Destroy(gameObject, float) kann ein Delay zugefügt werden
  • Destroy(GetComponent<component>()); Zerstört eine Komponente

 

Koordinatensystem

Das Unity-Koordinatensystem baut auf der Linke-Hand-Regel auf (Mittelfinger Z, Zeigefinger Y, Daumen X). Um Objekte im dreidimensionalen Raum zu bewegen, werden Vektoren verwendet, um beispielsweise die Position oder die Bewegungsrichtung zu übergeben. Nützliche Funktionen hier sind

Vector3.magnitude(); //Länge eines Vektors
Vector3.Dot(vector1, vector2); //Skalarprodukt - gibt es 0 zurück, stehen die Vektoren senkrecht aufeinander
Vector3.Cross(vector1, vector2); //Kreuzprodukt - bestimmt Vektor, der senkrecht auf zwei Vektoren liegt. Nützlich beispielsweise, um die Drehachse zu bestimmen, um von Punkt 1 auf Punkt 2 zu zeigen.

//Abkürzungen
Vector3.back();  //Vector3(0,0,-1)
Vector3.down();  //Vector3(0,-1,0)
Vector3.forward();  //Vector3(0,0,1)
Vector3.left();  //Vector3(-1,0,0)
Vector3.one();  //Vector3(1,1,1)
Vector3.right();  //Vector3(1,0,0)
Vector3.up();  //Vector3(0,1,0)
Vector3.zero();//Vector3(0,0,0)

transform.Translate(Vector3.forward*movespeed*Time.deltaTime);  //bewegt Objekt vorwärts
Time.deltaTime();  //lässt in Meter pro Sekunde anstatt Meter pro Frame bewegen
transform.Rotate(Vector3.up, turnspeed*Time.deltaTime);  // dreht Objekt um die Y-Achse im Uhrzeigersinn 
transform.Rotate(Vector3.up,- turnspeed*Time.deltaTime);  //dreht Objekt um die Y-Achse gegen den Uhrzeigersinn
transform.LookAt(target);  //Kamera fokussiert auf betreffendes Objekt (in Deklaration wird public Transform target benötigt)
transform.position = Vector3.Lerp(from Vector3, to Vector3, time float);  //Bewegung ist smooth anstatt ruckartig
Mathf.Lerp(from float, to float, time float);  //ändert z.B. Intensität des Lichts
Color.Lerp(from float, to float, time float);  //Farbänderung

Input

  • Edit > Project Settings > Input: hier können Buttons festgelegt werden, beispielsweise die Leertaste als Sprungtaste. Dieser wird dann ein Name gegeben (zum Beispiel „Jump“), auf den im Skript referenziert wird. So kann ein Button nachträglich nochmal verlegt werden, ohne das Skript ändern zu müssen.
  • GetButtonDown = true im Frame, in dem der Button gedrückt wird
  • GetButton = true, solang Button gedrückt bleibt
  • GetButtonUp = true im Frame, in dem der Button losgelassen wird
  • GetAxis gibt kein boolean, sondern einen float zwischen -1 (negativer Button) und 1 (positiver Button) zurück. Er beschreibt, wie smooth Bewegungen sind (je nach Gravity Setting). 0 ist hierbei keine Bewegung, und je nach Gravity kehrt der Wert von -1 bzw. 1 schneller oder langsamer zu 0 zurück. GetAxisRaw, vor allem bei 2D-Spielen, in denen exakte Bewegung nötig ist, springt sofort von -1 bzw. 1 zurück zu 0.
  • OnMouseDown() lässt Aktionen festlegen, die beim Mausklick ausgeführt werden

 

06.06.2014 | Lisa Umlauft |