Componenti mancanti
Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 31 di 67.
Quando il componente che cerchi non è sull'oggetto, GetComponent non ti ferma. 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 premi 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. Aggiungi il componente nell'Inspector oppure, se l'oggetto può esserne privo intenzionalmente, controlla prima. TryGetComponent(out rb) restituisce true e assegna il valore a rb quando il componente è presente, e restituisce false senza generare un errore quando non lo è (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 semplice null, quindi lo stesso errore si manifesta come NullReferenceException.
Sfida
MedioLa barra spaziatrice accende e spegne i lampioni, ma la lampadina di Lamp2 è rotta: non ha un componente Light e, premendo la barra spaziatrice, si verifica un’eccezione MissingComponentException. Correggi lo script:
- I lampioni che hanno un componente Light continuano ad accendersi e spegnersi con la barra spaziatrice.
- Un lampione senza un componente Light non lo tocca mai, quindi non si verifica alcun errore.
- Quando inizia il gioco, un lampione senza un componente Light colora la sua lampadina di
Color.gray, così i giocatori possono vedere che è rotta.
Premi Gioca, poi la barra spaziatrice per vedere l’errore. Correggilo, poi premi Controlla.
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;
}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti di scripting in Unity
1Il tuo primo script
Ciao, UnityPosiziona il cuboMuovi a ogni frameRuota ogni secondoGuida con i tastiRiepilogo: guida il cubo4Vettori
Sommare vettoriDirezioniSpazio locale e spazio globaleVelocità diagonaleDistanza tra gli oggettiVector3 è una structRiepilogo: pilota di droni7Progetto: Acchiappa la stella
L'acchiappatoreUna stella cadente10Il ciclo di vita degli script
Awake e StartUpdate e LateUpdateOnEnable e OnDisableL’ordine del ciclo di vitaRipasso: logger del ciclo di vita2L'Inspector
Campi dell'InspectorSerializeFieldNumeri decimali e MathfAttributi dell'InspectorRiepilogo: Ascensore5Trasformazioni e gerarchia
Genitori e figliScalaGuarda gli oggettiMuoversi verso un puntoRiepilogo: Luna in orbita6Oggetti di gioco e componenti
Riferimenti nell’InspectorOttenere un componenteComponenti mancantiAggiungere un componenteRequireComponentMostrare e nascondereRipasso: interruttore della luce