Menu
CoddyTech

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

Часть раздела Основы скриптинга в 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.

challenge icon

Задание

Средне

У Lamp2 нет компонента Light: при нажатии Space пропускай его и показывай, что он неисправен.

  1. В Start() замени строку с GetComponent на hasBulb = TryGetComponent(out bulb); и добавь поле bool hasBulb;.
  2. Если hasBulb равно false, измени цвет лампы: GetComponent<Renderer>().material.color = Color.gray;.
  3. В 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

Потренируйтесь самостоятельно: Песочница Unity