Menu
CoddyTech

Componentes Ausentes

Parte da seção Noções básicas de scripting no Unity do Journey de Unity da Coddy. Lição 31 de 67.

Quando o componente que você procura não está no objeto, GetComponent não impede você. No Editor, ele retorna um substituto que é igual a null em uma comparação, e o Unity lança uma exceção na primeira vez que seu código o usa. Esta bola deve pular quando a tecla Espaço for 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);
    }
}

A tecla Espaço exibe 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, e retorna false sem erro quando ele não está (out permite que o método retorne um valor por meio da variável):

bool canHop;

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

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

challenge icon

Desafio

Médio

A barra de espaço acende e apaga os postes de luz, mas a lâmpada do Lamp2 está quebrada: ela não tem um Light, e pressionar a barra de espaço interrompe a execução com MissingComponentException. Corrija o script:

  • Postes que têm um Light continuam acendendo e apagando com a barra de espaço.
  • Um poste sem um Light nunca o acessa, então não ocorre nenhum erro.
  • Quando o jogo começa, um poste sem um Light colore sua lâmpada com Color.gray, para que os jogadores vejam que ela está quebrada.

Pressione Play e, depois, a barra de espaço para ver o erro. Corrija-o e, em seguida, clique em Check.

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;
        }
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Noções básicas de scripting no Unity