O null do Unity
Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 60 de 85.
Um objeto do Unity tem duas partes: o objeto C# que seu script mantém e o objeto do mecanismo por trás dele. Destroy(obj) remove a parte do mecanismo no fim do quadro, mas sua variável ainda aponta para a parte C#, então, em termos de C# puro, ela não é null. O Unity sobrescreve == para lidar com isso: depois que o objeto é destruído, obj == null é verdadeiro, assim como o teste curto !obj. Esse é o null falso do Unity.
?., ?? e is null não usam esse ==. Eles verificam a referência C#, que ainda existe, então permitem que a chamada prossiga, e acessar o objeto destruído gera MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. Este rótulo mostra o nome do líder da corrida, que pode ser eliminado (destruído):
[SerializeField] private Transform leader;
void Update()
{
// lança uma exceção quando leader é destruído: string shown = leader?.name ?? "nobody";
string shown = leader != null ? leader.name : "nobody";
Debug.Log("Leader: " + shown);
}Para qualquer coisa que venha de UnityEngine.Object (GameObjects, componentes, seus scripts), teste com == null, != null ou if (obj), e reserve ?. e ?? para objetos C# comuns, como strings. Lembre-se também de que Destroy espera até o fim do quadro: até lá, o objeto continua vivo e == null é falso.
Desafio
MédioInterrompa os erros do drone quando o alvo for destruído.
- Em
Update(), substitua as duas linhas porif (target != null), o teste de nulo próprio do Unity. - Dentro dele, escreva
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);.
Pressione “Jogar”: o drone persegue o alvo e, em seguida, aguarda sem erros no Console. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
public class Chaser : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private float speed = 2f;
void Start()
{
Destroy(target.gameObject, 2f); // o target é destruído após 2 segundos
}
void Update()
{
Vector3 goal = target?.position ?? transform.position;
transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
}
}
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