Awake y Start
Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 55 de 67.
Unity llama a Awake() en cuanto se carga un objeto, antes de su Start(). Lo que lo hace útil es la regla que se aplica a todos los objetos: cuando empieza una escena, se ejecuta el Awake() de todos los objetos antes del Start() de cualquiera de ellos. Unity decide qué objeto va primero en cada ronda, y no puedes contar con que siga un orden determinado.
Este script Player está en dos jugadores, P1 (startLives 3) y P2 (startLives 5), y cada uno tiene al otro como su rival:
public int startLives = 3;
public GameObject rival;
int lives;
void Awake()
{
lives = startLives; // configura este objeto
}
void Start()
{
int theirs = rival.GetComponent<Player>().Lives(); // consulta al otro
Debug.Log(name + " sees a rival with " + theirs + " lives");
}
public int Lives()
{
return lives;
}La primera versión establecía lives en Start(). El jugador que empezaba primero le preguntaba entonces a su rival antes de que este hubiera establecido sus vidas, y registraba 0. Con la configuración en Awake(), ambos jugadores tienen sus vidas establecidas antes de que cualquiera de los dos las consulte en Start(), así que P1 registra 5 y P2 registra 3. La costumbre que debes adoptar: configura los campos propios de un objeto en Awake() y comunícate con otros objetos en Start().
Desafío
IntermedioDos colmenas, HiveA y HiveB, ejecutan el mismo script Hive. Cada colmena genera sus abejas (3 y 5, a partir de beeCount) en una lista y luego registra cuántas abejas tiene su rival: HiveA counts 5 rival bees y HiveB counts 3 rival bees.
Pulsa Play: una colmena se detiene con una NullReferenceException porque intenta acceder a la lista de su rival antes de que este la haya creado. Corrige el script para que cada colmena tenga su lista y sus abejas antes de que cualquier colmena cuente las de su rival. Mantén el conteo donde está. Después, pulsa Check.
Pruébalo tú mismo
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos de scripting en Unity
1Tu primer script
Hola, UnityColoca el cuboMuévete en cada fotogramaGira cada segundoDirige con las teclasRepaso: conduce el cubo4Vectores
Sumar vectoresDireccionesEspacio local y globalVelocidad diagonalDistancia entre objetosVector3 es una estructuraRepaso: piloto de dron7Proyecto: Atrapa la estrella
El atrapadorUna estrella fugaz10El ciclo de vida de los scripts
Awake y StartUpdate y LateUpdateOnEnable y OnDisableEl orden del ciclo de vidaRepaso: registrador del ciclo de vida2El Inspector
Campos del InspectorSerializeFieldNúmeros decimales y MathfAtributos del InspectorRepaso: Ascensor5Transformaciones y jerarquía
Padres e hijosEscalaMirar objetosMoverse hacia un puntoRepaso: Luna en órbita8Encontrar cosas
Buscar por nombreEtiquetasBuscar por tipoLas referencias superan a FindEl valor nulo de UnityRepaso: la moneda más cercana11Proyecto: Esquiva los bloques
El corredorBloques que caen6GameObjects y componentes
Referencias en el InspectorObtener un componenteComponentes faltantesAñadir un componenteRequireComponentMostrar y ocultarRepaso: interruptor de luz