Menu
CoddyTech

Awake e Start

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 70 de 85.

Unity chama Awake() assim que um objeto é carregado, antes de seu Start(). O que torna isso útil é a regra entre os objetos: quando uma cena começa, o Awake() de todos os objetos é executado antes do Start() de qualquer objeto. A ordem dos objetos dentro de cada rodada fica a critério do Unity, e você não pode contar com uma ordem específica.

Este script Player está em dois jogadores, P1 (startLives 3) e P2 (startLives 5), e cada um tem o outro como seu 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 o outro objeto
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

A primeira versão definia lives em Start(). O jogador que começasse primeiro perguntava ao rival antes de ele definir suas vidas e registrava 0. Com a configuração em Awake(), ambos os jogadores já têm suas vidas definidas antes que qualquer Start() pergunte, então P1 registra 5 e P2 registra 3. O hábito a seguir é configurar os campos do próprio objeto em Awake() e interagir com outros objetos em Start().

challenge icon

Desafio

Médio

Corrija as colmeias para que nenhuma conte uma lista que ainda não foi criada.

  1. Adicione void Awake() a Hive.
  2. Mova a linha bees = new List<GameObject>(); e o loop for de Start() para Awake().
  3. Deixe as duas linhas de contagem em Start(): cada Awake() é executado antes de qualquer Start().

Pressione “Jogar”: cada colmeia registra as abelhas da rival, HiveA conta 5 abelhas rivais, sem erros. Em seguida, “Verificar”.

Experimente você mesmo

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

Todas as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity