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.
Défi
MoyenLamp2 n’a pas de composant Light : fais en sorte que Space l’ignore et indique qu’elle est cassée.
- Dans
Start(), remplace la ligneGetComponentparhasBulb = TryGetComponent(out bulb);, avec un champbool hasBulb;. - Lorsque
hasBulbest faux, colore la lampe :GetComponent<Renderer>().material.color = Color.gray;. - Dans
Update(), ne bascule la lumière que lorsquehasBulbest 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
1Les bases de C# dans Unity
Bonjour, UnityVariablesLes nombres décimaux ont besoin d’un fDu texte dans la consoleDes variables qui mémorisentSi et sinonComparer des nombresRécapitulatif : le collecteur de pièces7Boucles et méthodes
Répéter avec forBoucles imbriquéesÉcrire une méthodeMéthodes qui renvoient une réponseTableauxRécapitulatif : escalier10Rechercher des objets
Rechercher par nomTagsRechercher par typeLes références plutôt que la rechercheLe null de UnityRécapitulatif : la pièce la plus proche13Projet : Éviter les blocs
Le coureurDes blocs tombent du ciel2Mettez-le en mouvement
Placez le cubeDéplacez-le à chaque frameTournez chaque secondeDirigez avec les touchesRécapitulatif : pilotez le cube5Vecteurs
Additionner des vecteursDirectionsEspace local et espace globalVitesse diagonaleDistance entre des objetsVector3 est une structureRécapitulatif : pilote de drone8GameObjects et composants
Références dans l’InspectorObtenir un composantComposants manquantsAjouter un composantRequireComponentAfficher et masquerRécapitulatif : interrupteur3L’inspecteur
Champs de l’inspecteurSerializeFieldFlottants et MathfAttributs de l’inspecteurRécapitulatif : ascenseur6Transformations et hiérarchie
Parents et enfantsHissez le drapeauÉchelleRegarder les objetsSe déplacer vers un pointRécapitulatif : la lune en orbite9Projet : Attrape l’étoile
Le receveurUne étoile filanteEntraînez-vous par vous-même : Playground Unity