Menu
CoddyTech

Awake et Start

Fait partie de la section Les bases du scripting dans Unity du Journey Unity de Coddy. Leçon 70 sur 85.

Unity appelle Awake() dès qu'un objet est chargé, avant son Start(). Ce qui rend cela utile, c'est la règle qui s'applique à tous les objets : au démarrage d'une scène, le Awake() de chaque objet s'exécute avant le Start() de n'importe quel objet. Unity décide de l'ordre des objets au sein de chaque étape, et tu ne peux pas compter sur un ordre précis.

Ce script Player est attaché à deux joueurs, P1 (startLives 3) et P2 (startLives 5), et chacun a l'autre comme rival :

public int startLives = 3;
public GameObject rival;
int lives;

void Awake()
{
    lives = startLives;   // initialiser cet objet
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // interroger l’autre
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

La première version définissait lives dans Start(). Le joueur dont le démarrage avait lieu en premier interrogeait alors son rival avant que celui-ci ait défini ses vies, et affichait 0 dans le journal. Avec l'initialisation dans Awake(), les deux joueurs ont leurs vies avant que l'un ou l'autre Start() ne pose sa question : P1 affiche 5 dans le journal et P2 affiche 3. La bonne habitude à prendre : initialise les champs propres à un objet dans Awake(), et communique avec les autres objets dans Start().

challenge icon

Défi

Moyen

Corrige les ruches pour qu’aucune ne compte une liste qui n’a pas encore été créée.

  1. Ajoute void Awake() à Hive.
  2. Déplace la ligne bees = new List<GameObject>(); et la boucle for de Start() vers Awake().
  3. Laisse les deux lignes de comptage dans Start() : chaque Awake() s’exécute avant n’importe quel Start().

Appuie sur « Jouer » : chaque ruche affiche dans le journal le nombre d’abeilles de sa rivale, HiveA compte 5 abeilles rivales, sans erreur. Puis appuie sur « Vérifier ».

Essayez vous-même

using System.Collections.Generic;
using UnityEngine;

public class Hive : MonoBehaviour
{
    public GameObject beePrefab;
    public GameObject rival;
    public int beeCount = 3;
    List<GameObject> bees;

    void Start()
    {
        bees = new List<GameObject>();
        for (int i = 0; i < beeCount; i++)
        {
            Vector3 spot = transform.position + new Vector3(i * 0.6f - 1.2f, 1.5f, 0);
            bees.Add(Instantiate(beePrefab, spot, Quaternion.identity));
        }

        int theirs = rival.GetComponent<Hive>().BeeCount();
        Debug.Log(name + " counts " + theirs + " rival bees");
    }

    public int BeeCount()
    {
        return bees.Count;
    }
}

Toutes les leçons de Les bases du scripting dans Unity

Entraînez-vous par vous-même : Playground Unity