Componenti mancanti
Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 45 di 85.
Quando il componente che chiedi non è presente sull’oggetto, GetComponent non ti impedisce di procedere. Nell’Editor restituisce un sostituto che risulta uguale a null, e Unity genera un’eccezione la prima volta che il tuo codice lo usa. Questa palla dovrebbe saltare quando si preme Spazio, ma nessuno le ha assegnato un Rigidbody:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}Premendo Spazio viene visualizzato MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. Il messaggio indica il tipo mancante e l’oggetto. Puoi aggiungere il componente nell’Inspector oppure, se l’oggetto potrebbe non averlo intenzionalmente, verificarne prima la presenza. TryGetComponent(out rb) restituisce true e assegna un valore a rb quando il componente è presente; se invece manca, restituisce false senza generare un errore (out permette al metodo di restituire un valore tramite la variabile):
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}Update() spinge quindi la palla solo if (canHop). Fuori dall’Editor, in un gioco compilato, GetComponent restituisce invece un normale null, quindi lo stesso errore si manifesta lì come NullReferenceException.
Sfida
MedioLamp2 non ha una luce: fai in modo che Space la salti e mostra che è guasta.
- In
Start(), sostituisci la rigaGetComponentconhasBulb = TryGetComponent(out bulb);, aggiungendo un campobool hasBulb;. - Quando
hasBulbè false, colora la lampada:GetComponent<Renderer>().material.color = Color.gray;. - In
Update(), cambia lo stato della luce solo quandohasBulbè true.
Premi «Gioca» e premi Space: le lampade funzionanti si accendono e si spengono, senza errori. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
Tutte le lezioni di Fondamenti di scripting in Unity
1Nozioni di base di C# in Unity
Ciao, UnityVariabiliI numeri decimali richiedono una fTesto nella ConsoleVariabili che ricordanoIf ed ElseConfrontare i numeriRipasso: il collezionista di monete7Cicli e metodi
Ripeti con forCicli annidatiScrivere un metodoMetodi che restituiscono valoriArrayRiepilogo: scala10Trovare gli oggetti
Trovare per nomeTagTrovare per tipoI riferimenti battono la ricercaIl null di UnityRipasso: la moneta più vicina13Progetto: Schiva i blocchi
Il corridoreBlocchi dal cielo2Fallo muovere
Posiziona il cuboMuovilo a ogni frameRuotalo ogni secondoGuidalo con i tastiRiepilogo: guida il cubo5Vettori
Somma di vettoriDirezioniSpazio locale e spazio mondoVelocità diagonaleDistanza tra gli oggettiVector3 è una structRiepilogo: pilota di droni8GameObject e componenti
Riferimenti nell'InspectorOttenere un componenteComponenti mancantiAggiungere un componenteRequireComponentMostrare e nascondereRiepilogo: interruttore della luce3L’Inspector
Campi dell’InspectorSerializeFieldNumeri decimali e MathfAttributi dell’InspectorRiepilogo: ascensore6Trasformazioni e gerarchia
Genitori e figliIssare la bandieraScalaOsservare gli oggettiMuoversi verso un puntoRiepilogo: Luna in orbita9Progetto: Acchiappa la stella
Il raccoglitoreUna stella cadente12Il ciclo di vita dello script
Awake e StartUpdate e LateUpdateOnEnable e OnDisableL'ordine del ciclo di vitaRiepilogo: Lifecycle LoggerEsercitati da solo: Playground Unity