Menu
CoddyTech

Awake e Start

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 70 di 85.

Unity chiama Awake() appena viene caricato un oggetto, prima del suo Start(). Ciò che lo rende utile è la regola valida per tutti gli oggetti: quando una scena inizia, l'Awake() di ogni oggetto viene eseguito prima dello Start() di qualsiasi oggetto. L'ordine degli oggetti all'interno di ciascuna fase dipende da Unity e non puoi farci affidamento.

Questo script Player è assegnato a due giocatori, P1 (startLives 3) e P2 (startLives 5), e ciascuno ha l'altro come rival:

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

void Awake()
{
    lives = startLives;   // inizializza questo oggetto
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // chiedi all'altro
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

La prima versione impostava lives in Start(). Il giocatore il cui avvio avveniva per primo chiedeva quindi al rivale il numero di vite prima che quest'ultimo lo avesse impostato e registrava 0. Con l'inizializzazione in Awake(), entrambi i giocatori hanno le proprie vite impostate prima che uno dei due le chieda in Start(), quindi P1 registra 5 e P2 registra 3. La regola da seguire è: inizializza i campi di un oggetto in Awake() e interagisci con gli altri oggetti in Start().

challenge icon

Sfida

Medio

Correggi gli alveari in modo che nessuno dei due conti una lista non ancora creata.

  1. Aggiungi void Awake() a Hive.
  2. Sposta la riga bees = new List<GameObject>(); e il ciclo for da Start() a Awake().
  3. Lascia le due righe di conteggio in Start(): ogni Awake() viene eseguito prima di qualsiasi Start().

Premi «Gioca»: ogni alveare registra le api del rivale; HiveA conta 5 api rivali, senza errori. Poi premi «Verifica».

Provalo tu

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;
    }
}

Tutte le lezioni di Fondamenti di scripting in Unity

Esercitati da solo: Playground Unity