Menu
CoddyTech

Brakujące komponenty

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 45 z 85.

Gdy komponent, o który prosisz, nie znajduje się na obiekcie, GetComponent nie zatrzymuje programu. W Edytorze zwraca atrapę, która porównuje się jako null, a Unity zgłasza błąd przy pierwszym użyciu jej w kodzie. Ta piłka powinna podskoczyć po naciśnięciu spacji, ale nikt nie dodał do niej komponentu Rigidbody:

Rigidbody rb;

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

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

Naciśnięcie spacji wyświetla komunikat MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. Komunikat podaje nazwę brakującego typu i obiektu. Dodaj komponent w Inspektorze albo, jeśli obiekt może celowo go nie mieć, najpierw to sprawdź. TryGetComponent(out rb) zwraca true i przypisuje wartość do rb, gdy komponent jest obecny, a w przeciwnym razie zwraca false bez błędu (out pozwala metodzie przekazać wartość z powrotem przez zmienną):

bool canHop;

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

Funkcja Update() popycha wtedy piłkę tylko if (canHop). Poza Edytorem, w zbudowanej grze, GetComponent zwraca zamiast tego zwykłe null, więc ten sam błąd objawia się tam jako NullReferenceException.

challenge icon

Wyzwanie

Średni

Lamp2 nie ma komponentu Light: spraw, by Space go pomijał, i pokaż, że jest zepsuta.

  1. W Start() zastąp wiersz GetComponent kodem hasBulb = TryGetComponent(out bulb); i dodaj pole bool hasBulb;.
  2. Gdy hasBulb ma wartość false, zmień kolor lampy: GetComponent<Renderer>().material.color = Color.gray;.
  3. W Update() przełączaj światło tylko wtedy, gdy hasBulb ma wartość true.

Naciśnij „Graj” i naciśnij Space: sprawne lampy się przełączą, bez błędu. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

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

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

Wszystkie lekcje w sekcji Podstawy skryptów w Unity

Poćwicz samodzielnie: Edytor online Unity