web-dev-qa-db-fra.com

Awake () et Start ()

Je vois que nous pouvons initialiser la variable dans Awake() ou Start() et Awake() sera appelée avant Start().

Quand faut-il initialiser dans Awake et Start pour avoir les meilleures performances?

35
phongvan

Habituellement, Awake () est utilisé pour initialiser si certaines valeurs ou certains scripts dépendent les uns des autres et provoquerait des erreurs si l'un d'eux est initialisé trop tard (awake s'exécute avant le début du jeu). Awake est également appelé une seule fois pour chaque instance de script.

Permettez-moi de citer la documentation:

[...] Awake est appelé après que tous les objets sont initialisés afin que vous puissiez parler en toute sécurité à d'autres objets ou les interroger en utilisant par exemple. GameObject.FindWithTag. Chaque Awake de GameObject est appelé dans un ordre aléatoire entre les objets. Pour cette raison, vous devez utiliser Awake pour configurer des références entre les scripts et utiliser Start () pour transmettre des informations dans les deux sens. Awake est toujours appelé avant toute fonction de démarrage. Cela vous permet de commander l'initialisation des scripts. Awake ne peut pas agir comme une coroutine.

et à propos de Start ():

Start est appelé sur le cadre lorsqu'un script est activé juste avant que l'une des méthodes Update soit appelée la première fois.

Comme la fonction Awake, Start est appelé exactement une fois dans la durée de vie du script. Cependant, Awake est appelé lorsque l'objet de script est initialisé, que le script soit activé ou non. Start ne peut pas être appelé sur la même trame que Awake si le script n'est pas activé au moment de l'initialisation.

Où la dernière partie fait une grande différence

Pour vous poser une question:

Si le script est PAS activé au début de votre jeu, et que vous n'avez pas besoin d'initialiser les variables, start serait sauver les performances comme awake () serait appelé peu importe ...
chaque variable serait initialisée au tout début. C'est du moins l'hypothèse logique que je fais.

35
Minzkraut

Ce sujet est bien décrit dans la documentation officielle ( Awake et Start ).

Cette section explique pourquoi vous pourriez avoir besoin de deux fonctions:

La fonction Awake est appelée sur tous les objets de la scène avant l'appel de la fonction Start d'un objet. Ce fait est utile dans les cas où le code d'initialisation de l'objet A doit s'appuyer sur l'objet B déjà initialisé; L'initialisation de B doit être effectuée dans Awake tandis que A doit être effectuée dans Start.

La différence entre Awake et Start est que Start est appelé uniquement lorsqu'un script est activé .

Ces deux fonctions sont appelées avant la première méthode Update et il n'y a aucune différence de performances entre elles. Je dirais que Awake est utilisé pour initialiser tous les objets (comme un constructeur), et Start est utilisé pour link les objets ou faire quelque chose avant un jeu départs.

4
Sergii Zhevzhyk

Awake est l'équivalent du ctor. Elle est appelée lorsqu'un MonoBehaviour est créé, avant toute autre méthode.

Le démarrage est exécuté la première fois que le MonoBehaviour est activé. Cela peut être juste après le réveil ou longtemps après. Cela permet d'effectuer des actions liées à l'état actuel de l'application ou des objets.

Par exemple, vous créez un ennemi, dans Awake, vous placez tout ce qui est une initialisation de base. Ensuite, l'ennemi est désactivé à la fin de Awake. Plus tard, l'ennemi est sur le point d'être activé mais vous voulez le rendre rouge si le joueur a une arme spécifique, alors vous le faites dans Start.

OnEnable est similaire à Start mais se produit sur chaque SetActive (true) et au démarrage s'il est activé. Cela peut être un candidat pour votre ennemi désireux de changer de couleur sur le niveau en fonction de la magna du joueur par exemple.

2
Everts

Il n'y a pas beaucoup de différence dans les performances. Mais je peux vous dire une différence entre eux.

Prenons un exemple simple. Dites si vous voulez imprimer "BONJOUR" dans la console même si vous n'avez pas activé le script dans l'inspecteur, en utilisant la fonction Awake (), vous pouvez l'imprimer dans la console. Mais si vous aviez écrit la même chose dans la fonction Start () et que le script n'était pas activé, vous n'obtiendrez aucune sortie dans la console. Voilà la différence.

Les codes de la fonction Start () ne sont exécutés que si le script est activé tandis que les codes de la fonction Awake () sont exécutés même si le script n'est pas activé. Essayez!

2
Manoj Hosmath