Menu
CoddyTech

Fehlende Komponenten

Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 45 von 85.

Wenn sich die angeforderte Komponente nicht am Objekt befindet, hält dich GetComponent nicht davon ab. Im Editor gibt es einen Platzhalter zurück, der mit null gleichwertig ist, und Unity löst eine Ausnahme aus, sobald dein Code ihn zum ersten Mal verwendet. Dieser Ball sollte hüpfen, wenn die Leertaste gedrückt wird, aber niemand hat ihm ein Rigidbody hinzugefügt:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 300f);
    }
}

Beim Drücken der Leertaste wird MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. ausgegeben. Die Meldung nennt den fehlenden Typ und das Objekt. Füge die Komponente entweder im Inspector hinzu oder frage vorher nach, wenn dem Objekt die Komponente absichtlich fehlen kann. TryGetComponent(out rb) gibt true zurück und weist rb einen Wert zu, wenn die Komponente vorhanden ist, und gibt false ohne Fehler zurück, wenn sie fehlt (out ermöglicht es der Methode, über die Variable einen Wert zurückzugeben):

bool canHop;

void Start()
{
    canHop = TryGetComponent(out rb);
}

Update() bringt den Ball dann nur mit if (canHop) zum Hüpfen. Außerhalb des Editors, in einem erstellten Spiel, gibt GetComponent stattdessen ein einfaches null zurück. Derselbe Fehler zeigt sich dort also als NullReferenceException.

challenge icon

Aufgabe

Mittel

Lamp2 hat kein Light: Lass Space es überspringen und zeige an, dass die Lampe kaputt ist.

  1. Ersetze in Start() die GetComponent-Zeile durch hasBulb = TryGetComponent(out bulb); und füge ein Feld bool hasBulb; hinzu.
  2. Färbe die Lampe, wenn hasBulb false ist: GetComponent<Renderer>().material.color = Color.gray;.
  3. Schalte in Update() das Licht nur ein, wenn hasBulb true ist.

Drücke „Spielen“ und drücke Space: Die intakten Lampen schalten sich um, ohne dass ein Fehler auftritt. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}

Alle Lektionen in Unity-Scripting: Grundlagen

Übe selbstständig: Unity-Playground