Composants manquants
Fait partie de la section Les bases du scripting dans Unity du Journey Unity de Coddy. Leçon 31 sur 67.
Lorsque le composant demandé n’est pas présent sur l’objet, GetComponent ne vous arrête pas. Dans l’éditeur, il renvoie un substitut qui est égal à null, et Unity lève une exception dès que votre code l’utilise. Cette balle devrait sauter quand on appuie 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 concerné. Ajoutez le composant dans l’inspecteur ou, si l’objet peut volontairement ne pas l’avoir, vérifiez d’abord. TryGetComponent(out rb) renvoie true et renseigne rb lorsque le composant est présent, et renvoie false sans erreur dans le cas contraire (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 alors 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.
Défi
MoyenEspace allume et éteint les lampadaires, mais l’ampoule de Lamp2 est cassée : elle n’a pas de Light, et appuyer sur Espace provoque une MissingComponentException. Corrige le script :
- Les lampadaires qui ont une Light continuent de s’allumer et de s’éteindre avec Espace.
- Un lampadaire sans Light n’y touche jamais, donc il n’y a pas d’erreur.
- Au démarrage du jeu, un lampadaire sans Light colore son ampoule avec
Color.gray, afin que les joueurs puissent voir qu’elle est cassée.
Appuie sur Play, puis sur Espace pour voir l’erreur. Corrige-la, puis clique sur Check.
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;
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Les bases du scripting dans Unity
1Votre premier script
Bonjour, UnityPlacez le cubeBouger à chaque imageTourner chaque secondeDirigez avec les touchesRécapitulatif : conduisez le cube4Vecteurs
Addition de vecteursDirectionsEspaces local et mondeVitesse diagonaleDistance entre les objetsVector3 est une structRécapitulatif : pilote de drone7Projet : Attrape l’étoile
L’attrapeurUne étoile qui tombe2L’inspecteur
Champs de l’inspecteurSerializeFieldNombres flottants et MathfAttributs de l’inspecteurRécapitulatif : ascenseur5Transformations et hiérarchie
Parents et enfantsÉchelleRegarder les objetsSe déplacer vers un pointRécapitulatif : Lune en orbite8Rechercher des objets
Rechercher par nomTagsRechercher par typeLes références plutôt que FindLe null de UnityRécapitulatif : la pièce la plus proche11Projet : Esquivez les blocs
Le coureurBlocs qui tombent6GameObjects et composants
Références dans l’InspectorObtenir un composantComposants manquantsAjouter un composantRequireComponentAfficher et masquerRécapitulatif : interrupteur