Отсутствующие компоненты
Часть раздела Основы скриптинга в 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.
Задание
СреднеПробел включает и выключает уличные фонари, но лампочка 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;
}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы скриптинга в Unity
1Ваш первый скрипт
Привет, UnityРазместите кубДвигайте каждый кадрПоворачивайте каждую секундуУправляйте клавишамиПовторение: управляйте кубом2Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт5Преобразования и иерархия
Родители и детиМасштабПосмотри на объектыДвигайся к точкеПовторение: Луна на орбите6Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказать и скрытьПовторение: выключатель света