Menu
CoddyTech

Awake et Start

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

Unity appelle Awake() dès qu’un objet est chargé, avant son Start(). Ce qui le rend utile, c’est la règle qui s’applique à tous les objets : au démarrage d’une scène, la méthode Awake() de chaque objet est exécutée avant la méthode Start() de n’importe quel objet. Unity décide de l’ordre d’exécution des objets au sein de chaque série, et tu ne peux pas t’y fier.

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 qui démarrait 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 définies avant que l’un ou l’autre n’interroge son rival dans Start() : P1 affiche 5 et P2 affiche 3. La règle à retenir : initialise les champs propres à un objet dans Awake() et communique avec les autres objets dans Start().

challenge icon

Défi

Moyen

Deux ruches, HiveA et HiveB, exécutent le même script Hive. Chaque ruche fait apparaître ses abeilles (3 et 5, à partir de beeCount) dans une liste, puis affiche le nombre d’abeilles de sa rivale : HiveA counts 5 rival bees et HiveB counts 3 rival bees.

Appuie sur Jouer : une ruche s’arrête avec une NullReferenceException, car elle demande la liste de sa rivale avant que celle-ci ne l’ait créée. Corrige le script pour que chaque ruche ait sa liste et ses abeilles avant qu’une ruche ne compte celles de sa rivale. Garde le comptage à sa place. Puis 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;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

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