🏠 Startseite

⚙️ GameObject-Komponenten

Ein GameObject ist an sich nur ein Container. Was es zu einem echten Teilnehmer in der Szene macht, sind seine Komponenten. Sie geben dem Objekt Aussehen, Physik, Ton, Animation und vieles mehr.

In dieser Lektion lernen wir, wie man über GetComponent<Typ>() auf die Komponenten eines Objekts zugreift, um deren Einstellungen per Code zu ändern. Ganz einfach — Schritt für Schritt mit Beispielen.

🔧 Was ist eine Komponente?

Eine Komponente ist ein Teil, der einem GameObject eine bestimmte Funktionalität hinzufügt. Für sich allein kann das Objekt nichts, bis du ihm die nötigen „Fähigkeiten“ über Komponenten gibst.

Jedes Objekt in Unity hat immer eine Transform-Komponente — sie ist für Position, Rotation und Maßstab zuständig. Danach entscheidest du selbst, was du noch hinzufügen möchtest: Darstellung, Physik, Kollisionen, Audio oder sogar dein eigenes Skript.

Zum Beispiel kann eine Figur diese Komponenten haben:

💡 Du kannst all diese Komponenten im Inspector sehen, wenn du das Objekt in der Szene auswählst. Dort kannst du sie einstellen oder entfernen — oder auch direkt per Code steuern.

Unity GameObject mit Komponenten: Transform, SpriteRenderer, Rigidbody2D, BoxCollider2D und eigenem Skript
Beispielobjekt in Unity mit Transform, SpriteRenderer, Rigidbody2D, BoxCollider2D und eigenem Skript CSharpScript. All das sind Teile eines GameObjects.

🧲 Komponente mit GetComponent abrufen

Um eine Komponente per Code zu steuern, musst du sie zuerst finden. Unity hat dafür die spezielle Methode GetComponent<Typ>(). Sie gibt dir Zugriff auf den gewünschten Teil des Objekts — z. B. Physik, Sprite oder Collider.

Stell dir vor, das Objekt ist ein Rucksack mit verschiedenen Dingen. GetComponent ist wie „Gib mir die Taschenlampe“ oder „Gib mir die Karte“. Unity sucht die Komponente nach Typ und gibt sie dir zurück.

Hier ein Beispiel: Wir holen uns die Rigidbody2D-Komponente und speichern sie in einer Variablen, um später die Geschwindigkeit steuern zu können:


using UnityEngine;

public class PlayerMover : MonoBehaviour
{
    // Variable für die Speicherung der Rigidbody2D-Komponente
    private Rigidbody2D rb;

    // Start wird einmal beim Start des Objekts aufgerufen
    void Start()
    {
        // Holen der Rigidbody2D-Komponente von diesem Objekt
        rb = GetComponent<Rigidbody2D>();
    }

    // Update wird einmal pro Frame aufgerufen
    void Update()
    {
        // Objekt nach rechts bewegen, indem die X-Geschwindigkeit gesetzt wird
        rb.linearVelocity = new Vector2(5f, rb.linearVelocity.y);
    }
}

In diesem Beispiel wird die Rigidbody2D-Komponente von demselben Objekt geholt, an dem das Skript hängt. Danach setzen wir einfach die X-Geschwindigkeit.

💡 GetComponent funktioniert nur mit Komponenten, die das Objekt bereits hat. Wenn du etwas abrufen willst, das nicht existiert, wird null zurückgegeben.

Du kannst Komponenten nicht nur am gleichen Objekt abrufen, sondern auch an anderen. Dafür brauchst du zuerst eine Referenz auf ein anderes GameObject und rufst dann GetComponent daran auf: otherGameObject.GetComponent<Typ>(). Das ist praktisch, wenn du z. B. das Sprite, die Lebenspunkte oder die Physik eines anderen Objekts steuern willst.


using UnityEngine;

public class CSharpScript : MonoBehaviour
{
    // Referenz auf das Objekt mit dem Tag "Enemy"
    private GameObject enemy;

    // Rigidbody2D-Komponente dieses Objekts
    private Rigidbody2D rb;

    // Start wird einmal beim Start des Objekts aufgerufen
    void Start()
    {
        // Objekt mit Tag "Enemy" finden
        enemy = GameObject.FindWithTag("Enemy");

        // Rigidbody2D-Komponente dieses Objekts holen
        rb = enemy.GetComponent<Rigidbody2D>();
    }

    // Update wird einmal pro Frame aufgerufen
    void Update()
    {
        // Bewege den Gegner nach rechts, indem die Geschwindigkeit geändert wird
        rb.linearVelocity = new Vector2(5f, rb.linearVelocity.y);
    }
}

Die meisten Komponenten sind im Unity-Inspector sichtbar — praktisch! Wenn ein Objekt z. B. eine SpriteRenderer-Komponente hat, siehst du Felder für Sprite, Farbe, Transparenz und die Kontrollkästchen Flip X/Y. Hat es eine BoxCollider2D-Komponente, findest du dort z. B. die Option Is Trigger.

Und hier kommt der wichtige Punkt: Was du im Inspector siehst, sind die öffentlichen Eigenschaften der Komponente. Diese kannst du auch per Code steuern.


using UnityEngine;

public class CSharpScript : MonoBehaviour
{
    // Start wird einmal beim Start des Objekts aufgerufen
    void Start()
    {
        // Horizontalen Flip des Sprites aktivieren
        gameObject.GetComponent<SpriteRenderer>().flipX = true;

        // Trigger-Modus bei BoxCollider2D aktivieren
        gameObject.GetComponent<BoxCollider2D>().isTrigger = true;
    }

    // Update wird einmal pro Frame aufgerufen
    void Update()
    {

    }
}

💡 Der Inspector ist keine Magie — er zeigt dir öffentliche Eigenschaften und Felder der Komponente. Fast alles, was du dort siehst, kannst du auch per Code ändern.

🧠 Tipps & häufige Fehler

Die Arbeit mit GetComponent ist einfach, aber es gibt ein paar wichtige Dinge zu beachten.

📛 Was tun, wenn die Komponente nicht gefunden wird?

Wenn das Objekt die gewünschte Komponente nicht hat, gibt GetComponent null zurück. Das kann einen Fehler verursachen, wenn du sie sofort verwendest. Überprüfe daher immer das Ergebnis:


var rb = GetComponent<Rigidbody2D>();
if (rb != null)
{
    rb.linearVelocity = Vector2.right * 5f;
}

Am besten stellst du sicher, dass die Komponente wirklich vorhanden ist. Falls du dir nicht sicher bist, füge eine Überprüfung hinzu — so vermeidest du Fehler zur Laufzeit.

🚀 Wie man es schneller macht

Du kannst GetComponent jederzeit aufrufen, aber es ist etwas langsamer als eine normale Variable. Wenn du eine Komponente oft brauchst, hole sie einmal in Start() und speichere sie in einer Variablen.


using UnityEngine;

public class CSharpScript : MonoBehaviour
{
    private SpriteRenderer sr;

    // Start wird einmal beim Start des Objekts aufgerufen
    void Start()
    {
        sr = GetComponent<SpriteRenderer>();
    }

    // Update wird einmal pro Frame aufgerufen
    void Update()
    {
        sr.flipX = true;
    }
}

💡 Je weniger GetComponent-Aufrufe pro Frame, desto stabiler und performanter wird dein Spiel laufen.

📦 Andere nützliche Komponenten

In Unity gibt es Dutzende Komponenten — von AudioSource bis Animator, von Camera bis Light. Hier haben wir die Grundlagen und das Prinzip der Arbeit mit Komponenten besprochen — das reicht schon, um fast jede davon zu steuern.

Andere Komponenten lernst du in den Lektionen kennen, in denen sie wirklich gebraucht werden. Wir werden sie schrittweise und gezielt einsetzen, damit alles klar bleibt und nicht überladen wird.

💡 Wichtig ist: Du weißt jetzt, wie man sie anspricht: GetComponent<Komponentenname>(). Alles andere ist Übung.