Menu
CoddyTech

Brakujące komponenty

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

Gdy komponent, o który prosisz, nie znajduje się na obiekcie, GetComponent cię nie zatrzymuje. W Edytorze zwraca atrapę, która jest równa 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ł jej 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 powoduje wyświetlenie komunikatu MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. Komunikat podaje brakujący typ i obiekt. Dodaj komponent w Inspektorze albo, jeśli obiekt może celowo go nie mieć, najpierw sprawdź jego obecność. TryGetComponent(out rb) zwraca true i wypełnia rb, gdy komponent jest dostępny, a gdy go nie ma, zwraca false bez błędu (out pozwala metodzie przekazać wartość za pośrednictwem zmiennej):

bool canHop;

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

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

challenge icon

Wyzwanie

Średni

Spacja włącza i wyłącza latarnie uliczne, ale żarówka w Lamp2 jest zepsuta: nie ma komponentu Light, a naciśnięcie Spacji powoduje błąd MissingComponentException. Napraw skrypt:

  • Latarnie z komponentem Light nadal włączają się i wyłączają po naciśnięciu Spacji.
  • Latarnia bez komponentu Light nigdy go nie dotyka, więc nie występuje błąd.
  • Po uruchomieniu gry latarnia bez komponentu Light zmienia kolor żarówki na Color.gray, aby gracze mogli zobaczyć, że jest zepsuta.

Naciśnij Play, a następnie Spację, aby zobaczyć błąd. Napraw go, a potem naciśnij Check.

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;
        }
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy skryptów w Unity