Awake e Start
Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 55 di 67.
Unity chiama Awake() non appena un oggetto viene caricato, prima del suo Start(). Ciò che lo rende utile è la regola che vale tra gli oggetti: quando una scena inizia, viene eseguito Awake() di ogni oggetto prima di Start() di qualsiasi oggetto. L'ordine degli oggetti all'interno di ciascun turno 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; // configura 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 suo rivale il numero di vite prima che il rivale le avesse impostate, e registrava 0. Con la configurazione 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 buona abitudine da seguire: imposta i campi propri di un oggetto in Awake() e interagisci con gli altri oggetti in Start().
Sfida
MedioDue alveari, HiveA e HiveB, eseguono lo stesso script Hive. Ogni alveare genera le proprie api (3 e 5, a partire da beeCount) e le inserisce in un elenco, poi registra quante api ha il suo rivale: HiveA counts 5 rival bees e HiveB counts 3 rival bees.
Premi Play: un alveare si blocca con un NullReferenceException, perché chiede l'elenco del suo rivale prima che il rivale lo abbia creato. Correggi lo script in modo che ogni alveare abbia il proprio elenco e le proprie api prima che un qualsiasi alveare conti quelle del rivale. Lascia il conteggio dov'è. Poi premi Check.
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti di scripting in Unity
1Il tuo primo script
Ciao, UnityPosiziona il cuboMuovi a ogni frameRuota ogni secondoGuida con i tastiRiepilogo: guida il cubo4Vettori
Sommare vettoriDirezioniSpazio locale e spazio globaleVelocità diagonaleDistanza tra gli oggettiVector3 è una structRiepilogo: pilota di droni7Progetto: Acchiappa la stella
L'acchiappatoreUna stella cadente10Il ciclo di vita degli script
Awake e StartUpdate e LateUpdateOnEnable e OnDisableL’ordine del ciclo di vitaRipasso: logger del ciclo di vita2L'Inspector
Campi dell'InspectorSerializeFieldNumeri decimali e MathfAttributi dell'InspectorRiepilogo: Ascensore5Trasformazioni e gerarchia
Genitori e figliScalaGuarda gli oggettiMuoversi verso un puntoRiepilogo: Luna in orbita6Oggetti di gioco e componenti
Riferimenti nell’InspectorOttenere un componenteComponenti mancantiAggiungere un componenteRequireComponentMostrare e nascondereRipasso: interruttore della luce