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.
Desafio
MédioLamp2 não tem Light: faça com que Space seja ignorado e mostre que ela está quebrada.
- Em
Start(), substitua a linhaGetComponentporhasBulb = TryGetComponent(out bulb);, com um campobool hasBulb;. - Quando
hasBulbfor false, pinte a lâmpada:GetComponent<Renderer>().material.color = Color.gray;. - Em
Update(), alterne a luz somente quandohasBulbfor 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
1Fundamentos de C# no Unity
Olá, UnityVariáveisDecimais precisam de um fTexto no ConsoleVariáveis que guardam valoresIf e ElseComparar númerosRevisão: Coletor de Moedas7Laços e Métodos
Repita com forLaços dentro de laçosEscreva um métodoMétodos que respondemArraysRevisão: Escada10Encontrando coisas
Buscar pelo nomeTagsBuscar por tipoReferências são melhores que FindO null do UnityRevisão: moeda mais próxima13Projeto: Desvie dos Blocos
O CorredorBlocos do Céu2Faça-o se mover
Posicione o cuboMova a cada quadroGire a cada segundoDirija com as teclasRecapitulando: dirija o cubo5Vetores
Somando vetoresDireçõesEspaço local e globalVelocidade diagonalDistância entre objetosVector3 é uma structRevisão: piloto de drone8GameObjects e Componentes
Referências no InspectorObter um componenteComponentes ausentesAdicionar um componenteRequireComponentMostrar e ocultarRevisão: Interruptor de luz6Transformações e hierarquia
Pais e filhosIçar a bandeiraEscalaOlhar para as coisasMover-se em direção a um pontoRevisão: Lua em órbita9Projeto: Pegue a Estrela
O PegadorUma Estrela CadentePratique por conta própria: Playground de Unity