Menu
CoddyTech

Componentes ausentes

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 45 de 85.

Quando o componente que você solicita não está no objeto, GetComponent não impede você de continuar. No Editor, ele retorna um substituto que é igual a null, e o Unity lança uma exceção na primeira vez que seu código o utiliza. Esta bola deveria pular quando a tecla Espaço fosse pressionada, mas ninguém adicionou um Rigidbody a ela:

Rigidbody rb;

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

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

Ao pressionar Espaço, aparece MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. A mensagem informa o tipo ausente e o objeto. Adicione o componente no Inspector ou, quando o objeto puder não ter esse componente intencionalmente, verifique primeiro. TryGetComponent(out rb) retorna true e preenche rb quando o componente está presente; se não estiver, retorna false sem gerar um erro (out permite que o método devolva um valor por meio da variável):

bool canHop;

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

Update() então impulsiona a bola somente if (canHop). Fora do Editor, em um jogo compilado, GetComponent retorna um null comum; assim, o mesmo erro aparece como uma NullReferenceException.

challenge icon

Desafio

Médio

Lamp2 não tem Light: faça com que Space seja ignorado e mostre que ela está quebrada.

  1. Em Start(), substitua a linha GetComponent por hasBulb = TryGetComponent(out bulb);, com um campo bool hasBulb;.
  2. Quando hasBulb for false, pinte a lâmpada: GetComponent<Renderer>().material.color = Color.gray;.
  3. Em Update(), alterne a luz somente quando hasBulb for true.

Pressione “Jogar” e pressione Space: as lâmpadas boas acendem e apagam, sem erros. Depois, “Verificar”.

Experimente você mesmo

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}

Todas as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity