Der Transform gehört zu den wichtigsten Grundlagen in Unity. Er bestimmt, wo sich ein GameObject befindet, wie es gedreht ist und in welcher Skalierung es erscheint. Gleichzeitig bildet die Komponente die Grundlage für Eltern-Kind-Beziehungen innerhalb der Hierarchy. Sobald du ein GameObject in einer Szene platzierst oder bewegst, arbeitest du deshalb direkt oder indirekt mit seinem Transform.
Jedes GameObject besitzt einen Transform
Erstellst du ein GameObject, fügt Unity automatisch einen Transform hinzu. Im Gegensatz zu vielen anderen Komponenten gehört er fest zum GameObject und lässt sich nicht einfach entfernen. Im Inspector findest du drei zentrale Bereiche: Position, Rotation und Scale.
Die drei Werte bestehen wiederum aus den Achsen X, Y und Z. Welche davon besonders wichtig sind, hängt vom Aufbau deines Spiels ab. In einem klassischen 2D-Projekt arbeitest du bei Bewegungen häufig vor allem mit X und Y. Ein 3D-Spiel nutzt dagegen alle drei Raumachsen unmittelbar.
Position legt den Standort fest
Über Position bestimmst du, an welcher Stelle sich ein GameObject befindet. X beschreibt die Position entlang der horizontalen Achse, Y die vertikale Position und Z die Position entlang der Tiefenachse.
In einem 2D-Plattformer bewegt sich eine Spielfigur beispielsweise hauptsächlich entlang der X- und Y-Achse. X verschiebt sie nach links oder rechts, während Y unter anderem für Sprünge und Höhenunterschiede relevant ist.
Die Z-Achse verschwindet in einem 2D-Projekt nicht. Sie kann weiterhin eine Rolle bei der räumlichen Anordnung spielen. Die sichtbare Reihenfolge von Sprites steuerst du allerdings häufig gezielter über Sorting Layers und Order in Layer statt allein über unterschiedliche Z-Positionen.
Rotation dreht ein GameObject
Mit Rotation legst du fest, wie ein GameObject um die X-, Y- und Z-Achse gedreht ist. Im Inspector zeigt Unity diese Drehungen in Grad an. Ein Wert von 0 bedeutet, dass auf der entsprechenden Achse keine zusätzliche Drehung eingetragen ist.
Bei einem typischen 2D-Sprite ist vor allem die Z-Rotation leicht zu erkennen. Änderst du diesen Wert, dreht sich das Sprite innerhalb der sichtbaren 2D-Ebene. Eine Z-Rotation von 90 Grad dreht das Objekt entsprechend um ein Viertel einer vollständigen Umdrehung.
Rotation kann sowohl direkt im Inspector als auch über Animationen, Physik oder Scripts verändert werden. Dadurch lassen sich beispielsweise rotierende Hindernisse, Räder oder andere bewegliche Spielelemente umsetzen.
Scale verändert die Größe
Der Bereich Scale bestimmt die Skalierung eines GameObjects. Die Ausgangswerte lauten normalerweise X = 1, Y = 1 und Z = 1. Damit besitzt das Objekt seine reguläre Skalierung.
Ein Wert von 2 auf einer Achse verdoppelt die Skalierung in dieser Richtung, während 0,5 sie halbiert. Änderst du X und Y unterschiedlich, wird ein Sprite entsprechend gestreckt oder gestaucht. Eine gleichmäßige Skalierung mit identischen Werten erhält dagegen seine ursprünglichen Proportionen.
Bei Sprites solltest du die Skalierung nicht mit der eigentlichen Auflösung der Grafik verwechseln. Auch Einstellungen beim Import des Sprites, insbesondere die Pixels Per Unit, beeinflussen dessen Größe innerhalb der Unity-Welt.
Negative Scale kann ein Objekt spiegeln
Auch negative Werte sind möglich. Eine negative X-Skalierung kann beispielsweise ein Sprite horizontal spiegeln. Das lässt sich nutzen, wenn eine Figur je nach Bewegungsrichtung nach links oder rechts schauen soll.
Allerdings eignet sich eine negative Skalierung nicht für jede Situation gleichermaßen. Abhängige Collider, untergeordnete GameObjects und andere Komponenten können ebenfalls von der Transformation betroffen sein. Bei Figuren bietet der SpriteRenderer mit Flip X deshalb eine weitere Möglichkeit zum Spiegeln eines Sprites.
Transform und die Hierarchy
Der Transform speichert nicht nur räumliche Werte. Er bildet zugleich die Grundlage für die Eltern-Kind-Struktur der Unity-Hierarchy. Ziehst du ein GameObject in der Hierarchy auf ein anderes Objekt, wird es zu dessen Child. Das übergeordnete Objekt ist sein Parent.
Bewegst oder drehst du anschließend das Parent, folgt das Child dieser Transformation. Auf diese Weise lassen sich mehrere Elemente zu einer gemeinsamen Struktur zusammenfassen. Ein Charakter kann beispielsweise untergeordnete Objekte für Effekte, Ausrüstung oder bestimmte Bezugspunkte besitzen.
Local Position und World Position unterscheiden
Bei Parent-Child-Beziehungen musst du zwischen lokalen und globalen Koordinaten unterscheiden. Die lokalen Transform-Werte eines Child-Objekts beziehen sich auf seinen Parent. Seine tatsächliche Position innerhalb der gesamten Spielwelt ergibt sich zusätzlich aus der Transformation der übergeordneten Objekte.
Ein Child kann beispielsweise lokal auf X = 2 stehen. Verschiebst du anschließend den Parent, bleibt dieser lokale Abstand bestehen, während sich die Position des Childs in der Spielwelt mit verändert.
Diese Unterscheidung begegnet dir auch beim Programmieren. transform.position beschreibt die Position im Weltkoordinatensystem, während transform.localPosition die Position relativ zum Parent liefert.
Transform per Script verändern
Viele Spielmechaniken verändern Transform-Werte während der Laufzeit. Eine einfache Positionsänderung lässt sich beispielsweise über ein Script vornehmen:
using UnityEngine;
public class MoveObject : MonoBehaviour
{
public float speed = 2f;
private void Update()
{
transform.position += Vector3.right * speed * Time.deltaTime;
}
}
Das GameObject bewegt sich damit kontinuierlich entlang der positiven X-Achse. Time.deltaTime berücksichtigt die vergangene Zeit zwischen zwei Frames, sodass die Bewegung nicht einfach an die Anzahl der berechneten Bilder pro Sekunde gekoppelt ist.
Transform und Physik nicht verwechseln
Nicht jede Bewegung sollte ausschließlich durch direkte Änderungen des Transforms erfolgen. Nutzt ein GameObject einen Rigidbody beziehungsweise Rigidbody2D und soll aktiv am Physiksystem teilnehmen, musst du berücksichtigen, wie Unity physikalische Bewegungen verarbeitet.
Eine Spielfigur, die springen, fallen und mit Plattformen kollidieren soll, stellt andere Anforderungen als ein rein dekoratives Objekt, das du ohne Physik verschiebst. Transform und Physiksystem arbeiten deshalb zwar miteinander, erfüllen aber unterschiedliche Aufgaben.
Transform und Static
Der Transform spielt außerdem eine wichtige Rolle bei der Frage, ob ein GameObject als statisch gelten kann. Ändern sich Position, Rotation oder andere relevante Eigenschaften während des Spiels, eignet sich das Objekt nicht für jede Static-Einstellung.
Mehr dazu findest du im Artikel Unity Static – wann ein GameObject als statisch gilt.
Der Transform der Main Camera
Auch die Main Camera besitzt einen Transform. Ihre Position und Rotation bestimmen zusammen mit der Camera-Komponente, aus welcher Richtung und von welchem Standort du die Szene betrachtest. Bei einem 2D-Spiel befindet sich die Kamera beispielsweise häufig mit Abstand auf der Z-Achse vor der eigentlichen Spielebene.
Folgt die Kamera einer Spielfigur, verändert ein Camera-Follow-System ihren Transform während des Spiels. Dadurch verschiebt sich der sichtbare Ausschnitt, obwohl die eigentliche Camera-Komponente weiterhin für die Darstellung verantwortlich bleibt.
Wie Kamera und Transform zusammenspielen, erfährst du im Artikel Unity Camera – die Camera-Komponente im Inspector.
Reset bringt den Transform auf Ausgangswerte
Möchtest du die Transform-Werte eines GameObjects zurücksetzen, kannst du die Reset-Funktion der Komponente verwenden. Bei einem GameObject ohne Parent setzt Unity Position und Rotation auf ihre Ausgangswerte und Scale auf 1. Bei einem Child beziehen sich die zurückgesetzten Positions- und Rotationswerte auf das Parent-Objekt.
Gerade beim Aufbau verschachtelter Objekte ist diese Funktion praktisch. Ein neu angelegtes Child lässt sich damit schnell am Ursprung seines Parent-Objekts ausrichten und anschließend gezielt positionieren.
Weitere technische Einzelheiten zu Position, Rotation, Skalierung und Parent-Child-Beziehungen findest du im Unity-Handbuch zum Transform.
Weiter geht es mir Runaway 3: A Twist of Fate
