Menu
CoddyTech

Отсутствующие компоненты

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 31 из 67.

Если запрашиваемого компонента нет на объекте, GetComponent не остановит тебя. В редакторе он возвращает заглушку, которая сравнивается с null, и Unity выдаёт ошибку при первом же обращении к ней из кода. Этот мяч должен подпрыгивать при нажатии Space, но ему не добавили Rigidbody:

Rigidbody rb;

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

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

При нажатии Space появляется сообщение MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. В сообщении указаны тип отсутствующего компонента и объект. Добавь компонент в Inspector или, если объект может намеренно обходиться без него, сначала проверь его наличие. TryGetComponent(out rb) возвращает true и заполняет rb, если компонент есть, а если его нет — возвращает false без ошибки (out позволяет методу вернуть значение через переменную):

bool canHop;

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

Затем Update() толкает мяч только при if (canHop). Вне редактора, в собранной игре, GetComponent возвращает обычный null, поэтому та же ошибка проявится там как NullReferenceException.

challenge icon

Задание

Средне

Пробел включает и выключает уличные фонари, но лампочка Lamp2 сломана: у неё нет компонента Light, и при нажатии пробела выполнение останавливается с ошибкой MissingComponentException. Исправь скрипт:

  • Фонари с компонентом Light по-прежнему включаются и выключаются нажатием пробела.
  • Фонарь без компонента Light никогда не обращается к нему, поэтому ошибки не возникает.
  • При запуске игры фонарь без компонента Light окрашивает свою лампочку в Color.gray, чтобы игроки видели, что она сломана.

Нажми Играть, затем пробел, чтобы увидеть ошибку. Исправь её, затем нажми Проверить.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы скриптинга в Unity