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.
Wyzwanie
ŚredniSpacja 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;
}
}
}
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
1Twój pierwszy skrypt
Witaj, UnityUmieść sześcianPoruszaj się w każdej klatceObracaj się co sekundęSteruj za pomocą klawiszyPodsumowanie: Prowadź sześcian2Inspektor
Pola inspektoraSerializeFieldLiczby zmiennoprzecinkowe i MathfAtrybuty inspektoraPodsumowanie: Winda5Transformacje i hierarchia
Rodzice i dzieciSkalaPatrz na obiektyPoruszanie się w kierunku punktuPodsumowanie: Księżyc krążący po orbicie3Wejście
Naciśnięty, przytrzymany, zwolnionyOsiePrzyciski o nazwachPrzyciski myszyPowtórka: naładowany skok6Obiekty gry i komponenty
Referencje w InspectorzePobieranie komponentuBrakujące komponentyDodawanie komponentuRequireComponentPokazywanie i ukrywaniePodsumowanie: włącznik światła