🏠 Startseite

Grundlegende Unity-Komponenten

In diesem Tutorial sehen wir uns die wichtigsten Unity-Komponenten an, mit denen fast jeder in seinen ersten Projekten arbeitet. Diese Komponenten bestimmen, welche Eigenschaften ein GameObject besitzt und wie es sich in einer Szene verhält.

In den vorherigen Lektionen haben wir bereits darüber gesprochen, dass eine Spielszene aus GameObjects besteht. Für sich genommen tun diese Objekte jedoch fast nichts — ihr Verhalten und ihre Eigenschaften werden durch Komponenten definiert. Im Grunde ist jedes Objekt in Unity eine Sammlung von Komponenten, die gemeinsam sein Aussehen, seine Physik, seinen Sound und seine Logik bestimmen.

In dieser Lektion schauen wir uns kurz einige grundlegende Komponenten an, die besonders häufig zu Beginn der Arbeit mit Unity verwendet werden, und verstehen, wofür sie gedacht sind und wie sie in der Praxis eingesetzt werden.

Leeres GameObject

Ein GameObject in Unity dient als Container für Komponenten, die seine Eigenschaften und seine Rolle in der Szene bestimmen. Für sich genommen macht ein GameObject fast nichts — Verhalten, Aussehen und Interaktion entstehen erst, wenn Komponenten hinzugefügt werden.

Meist beginnt die Erstellung eines Objekts mit einem leeren GameObject. Dieses kann über das Menü GameObject → Create Empty oder mit der Tastenkombination Ctrl + Shift + N erstellt werden.

Nach der Erstellung erscheint das Objekt in der Szene und im Fenster Hierarchy. Man kann ihm einen passenden Namen geben und auch ein kleines Symbol auswählen, damit es in der Szene leichter zu finden ist und die Projektstruktur übersichtlicher bleibt.

Beim Erstellen eines GameObjects fügt Unity automatisch die erste und obligatorische Komponente hinzu — Transform. Sie steuert die Position des Objekts in der Szene und ist bei jedem GameObject vorhanden. Im nächsten Schritt werden wir sie genauer betrachten.

leeres GameObject in der Szene
Ein leeres GameObject in der Szene. Das neue Objekt enthält bereits die Transform-Komponente.

Transform

Transform ist eine obligatorische Komponente jedes GameObjects in Unity. Wenn ein Objekt in der Szene existiert, besitzt es eine Position, eine Orientierung und eine Größe. All diese Parameter werden in der Transform-Komponente festgelegt.

Wenn wir die Werte der Transform-Felder im Inspector ändern, verändern wir die Position des Objekts in der Szene, seine Rotation und seinen Maßstab. Fast jedes Objekt in einem Spiel nutzt diese Parameter in irgendeiner Form.

💡 Den Inspector kann man als die „Visitenkarte“ eines GameObjects betrachten. Im Inspector sehen wir alle hinzugefügten Komponenten und ihre Einstellungen. Wenn du ein Objekt in der Szene oder im Hierarchy-Fenster auswählst, zeigt Unity seine Eigenschaften im Inspector-Fenster an.

Die Werte von Komponenten können nicht nur über den Inspector, sondern auch über Skripte geändert werden — und genau so geschieht es während des Spiels meistens.

In den vorherigen Lektionen haben wir bereits über den Zugriff auf Komponenten mit GetComponent<T>() gesprochen. Für Transform macht Unity jedoch eine Ausnahme: Da jede Instanz dieses Objekt diese Komponente besitzt, kann direkt über transform darauf zugegriffen werden.

Über Transform lassen sich nicht nur die im Inspector sichtbaren Felder verändern, sondern auch zusätzliche Funktionen zur Steuerung des Objekts nutzen.

Häufig verwendete Eigenschaften und Methoden von Transform:

Als Beispiel schreiben wir ein einfaches Skript, das zeigt, wie man über Code mit der Transform-Komponente interagieren kann.

using UnityEngine;

public class TransformExample : MonoBehaviour
{
    void Start()
    {
        // Setzt die Position des Objekts auf (1, 1, 0)
        transform.position = new Vector3(1f, 1f, 0f);

        // Dreht das Objekt um 45 Grad um die Z-Achse
        transform.rotation = Quaternion.Euler(0f, 0f, 45f);

        // Vergrößert das Objekt auf die doppelte Größe
        transform.localScale = new Vector3(2f, 2f, 2f);
    }

    void Update()
    {
        // Bewegt das Objekt in jedem Frame etwas nach rechts
        transform.Translate(1f * Time.deltaTime, 0f, 0f);

        // Dreht das Objekt in jedem Frame ein wenig
        transform.Rotate(0f, 0f, 90f * Time.deltaTime);
    }
}
Transform-Komponente im Inspector
Die Transform-Komponente im Inspector — hier werden Position, Rotation und Skalierung des Objekts festgelegt.

Sprite Renderer

Die Sprite Renderer-Komponente ist dafür verantwortlich, Sprites in der Szene darzustellen. Sie sorgt dafür, dass ein GameObject sichtbar wird, indem das ausgewählte Bild gerendert wird.

💡 Um einem Objekt eine Komponente hinzuzufügen, wähle es in der Hierarchy oder direkt in der Szene aus und klicke im Inspector auf die Schaltfläche Add Component. Anschließend kannst du die gewünschte Komponente über das Suchfeld finden.

Im Gegensatz zu Transform ist die Sprite Renderer-Komponente nicht obligatorisch. Deshalb muss sie im Code zuerst über GetComponent<SpriteRenderer>() abgerufen werden.

Häufig verwendete Eigenschaften und Methoden des Sprite Renderer:

Parameter, die häufig über Skripte verändert werden:

Einstellungen, die sich besser im Inspector konfigurieren lassen:

Als Beispiel schreiben wir ein einfaches Skript, das die Sprite-Renderer-Komponente abruft und einige ihrer Parameter ändert.

using UnityEngine;

public class SpriteRendererExample : MonoBehaviour
{
    // Referenz auf die Sprite-Renderer-Komponente
    private SpriteRenderer spriteRenderer;

    // neues Sprite, das im Inspector zugewiesen werden kann
    public Sprite newSprite;

    void Start()
    {
        // Sprite-Renderer-Komponente vom Objekt abrufen
        spriteRenderer = GetComponent<SpriteRenderer>();

        // Bild des Sprites ändern
        spriteRenderer.sprite = newSprite;

        // Sprite horizontal spiegeln
        spriteRenderer.flipX = true;

        // Render-Reihenfolge festlegen
        spriteRenderer.sortingOrder = 10;
    }
}
Sprite-Renderer-Komponente im Inspector
Die Sprite-Renderer-Komponente — sie ist für die Darstellung eines Sprites und dessen Renderreihenfolge in der Szene verantwortlich.

Collider

Collider-Komponenten definieren die Grenzen eines Objekts und seine Interaktion mit anderen Objekten. Das Sprite oder Modell selbst besitzt keine physikalischen Grenzen — der Collider bestimmt die Form, mit der Unity Kollisionen und Kontakte erkennt.

Collider erfüllen in der Regel zwei Hauptfunktionen. Erstens können sie als physische Grenze dienen, sodass andere Objekte nicht durch sie hindurchgehen können. Zweitens kann ein Collider als Erkennungsbereich arbeiten, wenn der Modus Is Trigger aktiviert ist.

Im Trigger-Modus erzeugt der Collider keine normale physische Kollision, sondern meldet lediglich den Kontakt. Über ein Skript kann man erkennen, wann ein anderes Objekt den Triggerbereich betritt, sich darin befindet oder ihn wieder verlässt.

💡 Damit Trigger-Ereignisse funktionieren, muss mindestens eines der beteiligten Objekte eine Rigidbody2D-Komponente besitzen.

Zum Beispiel kann man einem Objekt einen Box Collider 2D hinzufügen und die Option Is Trigger aktivieren. Anschließend kann ein Skript erkennen, wann ein anderer Collider diesen Bereich betritt.

using UnityEngine;

public class TriggerDestroyExample : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D other)
    {
        // Wenn ein anderes Objekt den Triggerbereich betritt,
        // wird dieses Objekt zerstört
        Destroy(other.gameObject);
    }
}

In diesem Beispiel wird die Methode OnTriggerEnter2D automatisch aufgerufen, wenn ein anderes Objekt mit einem 2D-Collider den Triggerbereich betritt. Über den Parameter other erhalten wir Zugriff auf das eingetretene Objekt und können es zum Beispiel mit Destroy() entfernen.

💡 Denke daran, dass Collider in zwei Versionen existieren: 2D und 3D. 2D-Komponenten arbeiten nur mit anderen 2D-Komponenten zusammen, und 3D-Komponenten nur mit 3D-Komponenten.

Wichtige Parameter im Inspector:

Collider können unterschiedliche Formen haben. In 2D werden häufig Box Collider 2D, Circle Collider 2D und Polygon Collider 2D verwendet. Für 3D gibt es Varianten wie Box Collider, Sphere Collider, Capsule Collider und andere.

Je komplexer die Collider-Form ist, desto mehr Berechnungen muss die Engine durchführen. Deshalb ist es meist nicht nötig, die Form eines Sprites perfekt nachzubilden, wenn es keinen Einfluss auf das Gameplay hat. In der Praxis ist die gewünschte Funktionalität wichtiger als eine exakt passende Form.

Auch die Eigenschaften eines Colliders können angepasst werden. Zum Beispiel kann man für die 2D-Physik ein spezielles Physics Material 2D erstellen, das Reibung und Elastizität bestimmt.

Ein solches Material kann über folgendes Menü erstellt werden: Assets → Create → 2D → Physics Material 2D. Danach wählst du das erstellte Material im Project-Fenster aus und stellst seine Parameter im Inspector ein.

Anschließend kann dieses Material im Feld Material der Collider-2D-Komponente zugewiesen werden.

Box-Collider-2D-Komponente im Inspector
Box Collider 2D-Komponente. Der Collider definiert die Interaktionsform eines Objekts und kann entweder als physische Grenze oder als Trigger arbeiten.

Rigidbody

Während ein Collider einem Objekt physische Grenzen hinzufügt, sorgt die Rigidbody-Komponente für physikalisches Verhalten: Fallen durch Gravitation, Bewegung durch Kräfte und Reaktionen auf Kollisionen.

Wenn sich in deinem Spiel ein unbewegliches Objekt befindet, zum Beispiel ein Boden oder eine Wand, reicht normalerweise ein Collider. Wenn sich ein Objekt jedoch bewegen, fallen oder auf Kräfte reagieren soll, benötigt es zusätzlich eine Rigidbody-Komponente.

💡 Denke daran, dass Rigidbody – genau wie Collider – in zwei Versionen existiert: 2D und 3D. Rigidbody2D arbeitet nur mit 2D-Collidern, während das normale Rigidbody mit 3D-Collidern verwendet wird.

Häufig verwendete Eigenschaften und Methoden von Rigidbody:

Parameter, die häufig über Skripte verändert werden:

Einstellungen, die sich besser im Inspector konfigurieren lassen:

Die Bewegung von Objekten mit Rigidbody kann grob in zwei Arten unterteilt werden. Die erste ist die automatische Physik von Unity: Gravitation und Interaktion mit anderen Körpern. Die zweite sind Kräfte oder Änderungen, die wir über Skripte hinzufügen.

In Skripten werden meist zwei Ansätze verwendet: das Anwenden von Kräften oder das direkte Ändern der Geschwindigkeit. Kräfte sorgen für realistischere Physik, während das direkte Setzen der Geschwindigkeit eine reaktionsschnellere Steuerung ermöglicht.

Im folgenden Beispiel bewegt sich ein Objekt mit Rigidbody2D nach links und rechts mit den Pfeiltasten und erhält einen Impuls nach oben (Sprung), wenn Space gedrückt wird.

using UnityEngine;
using UnityEngine.InputSystem;

public class RigidbodyMovementExample : MonoBehaviour
{
   private Rigidbody2D rb;

public float moveSpeed = 5f;
public float jumpForce = 6f;

void Start()
{
    // Rigidbody2D-Komponente abrufen
    rb = GetComponent<Rigidbody2D>();
}

void Update()
{
    if (Keyboard.current == null) return;

    float x = 0f;

    // Bewegung nach links
    if (Keyboard.current.leftArrowKey.isPressed)
        x = -moveSpeed;

    // Bewegung nach rechts
    if (Keyboard.current.rightArrowKey.isPressed)
        x = moveSpeed;

    // Horizontale Geschwindigkeit ändern
    rb.linearVelocity = new Vector2(x, rb.linearVelocity.y);

    // Sprung durch Anwenden einer Kraft
    if (Keyboard.current.spaceKey.wasPressedThisFrame)
    {
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }
}
}
Rigidbody2D-Komponente im Inspector
Die Rigidbody2D-Komponente. Sie steuert die physikalische Bewegung eines Objekts, Gravitation und die Interaktion mit anderen Körpern.

Skript

Deine Skripte in Unity sind ebenfalls Komponenten. Am häufigsten werden Skripte vom Typ MonoBehaviour verwendet. Dabei handelt es sich um normale C#-Skripte, die von der Klasse MonoBehaviour erben, um Zugriff auf Funktionen und Ereignisse von Unity zu erhalten.

Skripte definieren normalerweise die Spiellogik, speichern Daten und interagieren bei Bedarf mit anderen Komponenten eines Objekts — zum Beispiel mit Transform, Sprite Renderer oder Rigidbody.

Um ein neues Skript zu erstellen, öffne das Menü Assets → Create → MonoBehaviour Script. Danach erstellt Unity eine neue C#-Datei, die du im Code-Editor öffnen und bearbeiten kannst.

Im folgenden Beispiel wird das Skript:

using UnityEngine;
using UnityEngine.InputSystem;

public class ScriptExample : MonoBehaviour
{
    // Referenz auf die Rigidbody2D-Komponente unseres Objekts
    private Rigidbody2D rb;

    // Referenz auf das Friend-Objekt
    private GameObject friend;

    // SpriteRenderer-Komponente des Friend-Objekts
    private SpriteRenderer friendRenderer;

    // Sprites, die im Inspector zugewiesen werden können
    public Sprite sprite1;
    public Sprite sprite2;
    public Sprite sprite3;

    public float moveSpeed = 5f;

    void Start()
    {
        // Rigidbody2D-Komponente abrufen
        rb = GetComponent<Rigidbody2D>();

        // Für dieses Beispiel die Gravitation deaktivieren
        rb.gravityScale = 0f;

        // In der Szene nach einem Objekt mit dem Tag "Friend" suchen
        friend = GameObject.FindWithTag("Friend");

        // Seine SpriteRenderer-Komponente abrufen
        if (friend != null)
            friendRenderer = friend.GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        if (Keyboard.current == null) return;

        float x = 0f;
        float y = 0f;

        // Bewegung nach links und rechts
        if (Keyboard.current.leftArrowKey.isPressed) x = -moveSpeed;
        if (Keyboard.current.rightArrowKey.isPressed) x = moveSpeed;

        // Bewegung nach oben und unten
        if (Keyboard.current.upArrowKey.isPressed) y = moveSpeed;
        if (Keyboard.current.downArrowKey.isPressed) y = -moveSpeed;

        // Geschwindigkeit des Rigidbody2D ändern
        rb.linearVelocity = new Vector2(x, y);

        // Sprite des Friend-Objekts ändern
        if (friendRenderer != null)
        {
            if (Keyboard.current.digit1Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite1;

            if (Keyboard.current.digit2Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite2;

            if (Keyboard.current.digit3Key.wasPressedThisFrame)
                friendRenderer.sprite = sprite3;
        }
    }
}

💡 Skripte funktionieren wie normale Komponenten. Um ein Skript zu verwenden, füge es einem Objekt über die Schaltfläche Add Component im Inspector hinzu.

Skript im Inspector als Komponente angezeigt
Ein Skript erscheint im Inspector wie eine normale Komponente und kann zusammen mit anderen Komponenten des Objekts arbeiten.

Wenn du das Skript in Aktion testen möchtest, füge den Feldern im Skript drei Sprites hinzu. Zum Testen kannst du auch die eingebauten Unity-Sprites verwenden, zum Beispiel InputFieldBackground, Knob oder UISprite.

Erstelle anschließend ein neues Objekt in der Szene: GameObject → 2D Object → Sprite → Square. Ändere danach im Inspector den Tag dieses Objekts zu Friend.

Wenn du die Szene startest, findet das Skript das Objekt mit dem Tag Friend und ändert dessen Sprite, wenn die Tasten 1, 2 und 3 gedrückt werden.

Erstellen eines Sprite-Objekts Square
Erstellen eines neuen 2D-Sprite-Objekts (Square), das als Friend-Objekt verwendet wird.
Skriptfelder mit drei Sprites gefüllt
Im Inspector sind drei Sprites im Skript eingetragen, die beim Drücken der Tasten gewechselt werden.

Welche Komponenten verwenden

Letztendlich bestimmt dein Spiel, welche Komponenten die Objekte in deiner Szene benötigen. Die in dieser Lektion genannten Komponenten dienen nur als Beispiele und helfen, das grundlegende Prinzip von Unity zu verstehen: Ein GameObject erhält seine Eigenschaften und sein Verhalten durch die Komponenten, die ihm hinzugefügt werden.

In der Praxis enthält Unity eine sehr große Anzahl verschiedener Komponenten, die für unterschiedliche Aufgaben gedacht sind. Zum Beispiel gibt es Komponenten für Benutzeroberflächen, Animationen, Beleuchtung, Audiosysteme, Kameras, Navigation von Charakteren und viele weitere Funktionen.

Mit der Weiterentwicklung deines Projekts wirst du nur die Komponenten hinzufügen, die tatsächlich für eine bestimmte Spielmechanik benötigt werden. Ein Objekt kann nur wenige Komponenten besitzen, während ein anderes eine ganze Reihe davon enthalten kann, die gemeinsam sein Verhalten bestimmen.

Wenn du sehen möchtest, wie verschiedene Komponenten in der Praxis verwendet werden, schau dir Beispiele für Spielmechaniken in anderen Tutorials auf dieser Website an. Dort findest du verschiedene Möglichkeiten, Unity-Komponenten in realen Spielsituationen einzusetzen.