Menu
CoddyTech

Awake и Start

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 55 из 67.

Unity вызывает Awake(), как только объект загружен, до его Start(). Полезно это тем, что действует правило для всех объектов: когда сцена запускается, у каждого объекта выполняется Awake() до того, как у любого объекта выполнится Start(). Какой объект будет первым в каждом раунде, решает Unity, и рассчитывать на определённый порядок нельзя.

Этот скрипт Player назначен двум игрокам: P1 (startLives 3) и P2 (startLives 5), и у каждого в качестве rival указан другой игрок:

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

void Awake()
{
    lives = startLives;   // настроить этот объект
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // запросить у другого объекта
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

В первой версии значение lives задавалось в Start(). Поэтому игрок, у которого метод запускался первым, спрашивал своего соперника до того, как тот успевал задать свои жизни, и выводил в журнал 0. Если настроить объект в Awake(), оба игрока получают свои значения жизней до того, как Start() любого из них задаст вопрос, поэтому P1 выводит 5, а P2 — 3. Следует придерживаться такого правила: настраивай собственные поля объекта в Awake(), а взаимодействуй с другими объектами в Start().

challenge icon

Задание

Средне

Два улья, HiveA и HiveB, используют один и тот же скрипт Hive. Каждый улей создаёт своих пчёл (3 и 5, согласно beeCount) и помещает их в список, а затем выводит, сколько пчёл у его соперника: HiveA counts 5 rival bees и HiveB counts 3 rival bees.

Нажми Играть: один из ульев останавливается с ошибкой NullReferenceException, потому что запрашивает список соперника до того, как тот успел его создать. Исправь скрипт так, чтобы у каждого улья были список и пчёлы до того, как любой улей посчитает пчёл соперника. Оставь подсчёт на прежнем месте. Затем нажми Проверить.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы скриптинга в Unity