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.
Desafio
MédioA 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;
}
}
}
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
1Seu primeiro script
Olá, UnityPosicione o cuboMova a cada quadroGire a cada segundoConduza com as teclasRecapitulando: dirija o cubo4Vetores
Adicionando vetoresDireçõesEspaço local e espaço do mundoVelocidade diagonalDistância entre objetosVector3 é uma structRevisão: piloto de drone7Projeto: Pegue a Estrela
O ApanhadorUma Estrela Cadente10O ciclo de vida dos scripts
Awake e StartUpdate e LateUpdateOnEnable e OnDisableA ordem do ciclo de vidaRevisão: registrador do ciclo de vida5Transformações e Hierarquia
Pais e FilhosEscalaObserve as CoisasMova-se em Direção a um PontoRevisão: Lua em Órbita6GameObjects e Componentes
Referências no InspectorObter um ComponenteComponentes AusentesAdicionar um ComponenteRequireComponentMostrar e OcultarRevisão: Interruptor de Luz