Menu
CoddyTech

Composants manquants

Fait partie de la section Les bases du scripting dans Unity du Journey Unity de Coddy. Leçon 45 sur 85.

Lorsque le composant que tu demandes n’est pas présent sur l’objet, GetComponent ne t’en empêche pas. Dans l’éditeur, il renvoie un substitut qui est égal à null, et Unity déclenche une erreur la première fois que ton code l’utilise. Cette balle devrait sauter lorsque tu appuies sur Espace, mais personne ne lui a ajouté de Rigidbody :

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 300f);
    }
}

La barre d’espace affiche MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. Le message indique le type manquant et l’objet. Ajoute le composant dans l’Inspecteur ou, lorsque l’objet peut volontairement ne pas en avoir, vérifie d’abord. TryGetComponent(out rb) renvoie true et renseigne rb lorsque le composant est présent, et renvoie false sans erreur lorsqu’il ne l’est pas (out permet à la méthode de renvoyer une valeur par l’intermédiaire de la variable) :

bool canHop;

void Start()
{
    canHop = TryGetComponent(out rb);
}

Update() ne propulse ensuite la balle que if (canHop). En dehors de l’éditeur, dans un jeu compilé, GetComponent renvoie plutôt un simple null ; la même erreur se manifeste donc sous la forme d’une NullReferenceException.

challenge icon

Défi

Moyen

Lamp2 n’a pas de composant Light : fais en sorte que Space l’ignore et indique qu’elle est cassée.

  1. Dans Start(), remplace la ligne GetComponent par hasBulb = TryGetComponent(out bulb);, avec un champ bool hasBulb;.
  2. Lorsque hasBulb est faux, colore la lampe : GetComponent<Renderer>().material.color = Color.gray;.
  3. Dans Update(), ne bascule la lumière que lorsque hasBulb est vrai.

Appuie sur « Jouer » puis sur Space : les bonnes lampes basculent, sans erreur. Puis clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}

Toutes les leçons de Les bases du scripting dans Unity

Entraînez-vous par vous-même : Playground Unity