unity3d
Implémentation de classe MonoBehaviour
Recherche…
Aucune méthode surchargée
La raison pour laquelle vous n'avez pas besoin de remplacer Awake
, Start
, Update
et d'autres méthodes est qu'elles ne sont pas des méthodes virtuelles définies dans une classe de base.
Lors de la première utilisation de votre script, le moteur d'exécution de script examine le script pour voir si certaines méthodes sont définies. Si tel est le cas, ces informations sont mises en cache et les méthodes sont ajoutées à leur liste respective. Ces listes sont ensuite simplement retransmises à des moments différents.
La raison pour laquelle ces méthodes ne sont pas virtuelles est due aux performances. Si tous les scripts avaient Awake
, Start
, OnEnable
, OnDisable
, Update
, LateUpdate
et FixedUpdate
, ils seraient tous ajoutés à leurs listes, ce qui signifierait que toutes ces méthodes seraient exécutées. Normalement, cela ne poserait pas de gros problème, cependant, tous ces appels de méthodes vont du côté natif (C ++) au côté géré (C #), ce qui entraîne un coût de performance.
Maintenant, imaginez ceci, toutes ces méthodes sont dans leurs listes et certaines / la plupart d'entre elles n'ont peut-être même pas un corps de méthode réel. Cela signifierait qu'il y a une énorme quantité de performance gaspillée sur les méthodes d'appel qui ne font même rien. Pour éviter cela, Unity a choisi de ne pas utiliser de méthodes virtuelles et a créé un système de messagerie qui vérifie que ces méthodes ne sont appelées que lorsqu'elles sont réellement définies, ce qui évite les appels de méthodes inutiles.
Vous pouvez en savoir plus sur le sujet sur un blog Unity ici: 10000 Update () Appels et plus sur IL2CPP ici: Une introduction à IL2CPP Internals