Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Lamp2 non ha una luce: fai in modo che Space la salti e mostra che è guasta.

  1. In Start(), sostituisci la riga GetComponent con hasBulb = TryGetComponent(out bulb);, aggiungendo un campo bool hasBulb;.
  2. Quando hasBulb è false, colora la lampada: GetComponent<Renderer>().material.color = Color.gray;.
  3. In Update(), cambia lo stato della luce solo quando hasBulb è 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

Esercitati da solo: Playground Unity