Menu
CoddyTech

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.

challenge icon

Sfida

Medio

La 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;
        }
    }
}
quiz iconMettiti alla prova

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