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.
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:
Transform
— wo sich das Objekt befindetSpriteRenderer
— wie es aussiehtRigidbody2D
— damit es der Physik folgtBoxCollider2D
— damit es mit anderen kollidieren kann
CSharpScript
— dein eigenes Verhalten-Skript💡 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.
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.
Die Arbeit mit GetComponent
ist einfach, aber es gibt ein
paar wichtige Dinge zu beachten.
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.
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.
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.