Dans Unity, quand vous accédez à une variable mal initialisée (ou pas initialisée du tout), vous récupérez une NullReferenceException1 ou une UnassignedReferenceException.
Ces erreurs apparaissent dans la console de la façon suivante :
Les erreurs les plus fréquentes sont :
utiliser une variable exposée dans l’Inspector mais non-assignée. Un simple drag and drop dans l’éditeur Unity suffit;
utiliser une variable non-initialisée (contenant une référence nulle);
mal épeler le nom d’un GameObject quand on utilise la fonction GameObject.Find()2;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
publicclassExceptionsExample : MonoBehaviour
{
public GameObject unassignedRef1;
[SerializeField] private GameObject unassignedRef2;
private GameObject nullRef1;
private GameObject nullRef2;
private GameObject nullRef3;
// Start is called before the first frame updateprivatevoid Start()
{
// #1: not assigned in inspector Debug.Log(unassignedRef1.name);
// #2: not assigned in inspector Debug.Log(unassignedRef2.name);
// #3: not initialized Debug.Log(nullRef1.name);
// #4: typo so Find() returns nullvar nullRef2 = GameObject.Find("exceptionCubeWithTypo");
Debug.Log(nullRef2.name);
// #5: shadowing, so ok here, but not ok in Shadowing() nullRef3 = gameObject;
Debug.Log(nullRef3.name);
Shadowing();
}
privatevoid Shadowing()
{
// #5: shadowing GameObject nullRef3 = gameObject;
Debug.Log(nullRef3.name);
}
}
Il existe plusieurs types d’Events utilisables dans Unity : les UnityEvents1 et les Events C# natifs2. Les Events offrent un moyen simple et efficace de construire un système de diffusion de messages.
Ils suivent essentiellement le design pattern Observer3^.
Le seul avantage à utiliser les UnityEvents c’est qu’ils sont intégrés directement dans l’éditeur4.
Cependant les UnityEvents sont beaucoup plus lents que les Events C# natifs5.
En conclusion, utilisez les Events C# natifs de préférence.