Отсутствующие компоненты
Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 45 из 85.
Если компонента, который ты запрашиваешь, нет на объекте, GetComponent не останавливает выполнение. В редакторе он возвращает подставной объект, который считается равным null, и Unity выдаёт исключение при первом же использовании этого объекта в коде. Этот мяч должен подпрыгивать при нажатии пробела, но ему не добавили Rigidbody:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}При нажатии пробела появляется сообщение 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: при нажатии Space пропускай его и показывай, что он неисправен.
- В
Start()замени строку сGetComponentнаhasBulb = TryGetComponent(out bulb);и добавь полеbool hasBulb;. - Если
hasBulbравно false, измени цвет лампы:GetComponent<Renderer>().material.color = Color.gray;. - В
Update()переключай свет, только еслиhasBulbравно true.
Нажми «Играть» и нажми Space: исправные лампы переключаются без ошибок. Затем нажми «Проверить».
Попробуйте сами
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Основы C# в Unity
Привет, UnityПеременныеДля дробных чисел нужна fТекст в консолиПеременные, которые запоминаютЕсли и иначеСравнение чиселПовторение: сборщик монет7Циклы и методы
Повторение с forЦиклы внутри цикловНапишите методМетоды, которые возвращают значениеМассивыПовторение: лестница10Поиск объектов
Поиск по имениТегиПоиск по типуСсылки лучше поискаNull в UnityПовторение: ближайшая монета13Проект: уворачиваемся от блоков
БегунБлоки с неба2Заставь двигаться
Размести кубДвигай каждый кадрПоворачивай каждую секундуУправляй клавишамиПовторение: веди куб5Векторы
Сложение векторовНаправленияЛокальное и мировое пространствоСкорость по диагоналиРасстояние между объектамиVector3 — это структураПовторение: пилот дрона8Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказ и скрытиеПовторение: выключатель светаПотренируйтесь самостоятельно: Песочница Unity