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().
Задание
СреднеДва улья, 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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы скриптинга в Unity
1Ваш первый скрипт
Привет, UnityРазместите кубДвигайте каждый кадрПоворачивайте каждую секундуУправляйте клавишамиПовторение: управляйте кубом4Векторы
Сложение векторовНаправленияЛокальное и мировое пространствоСкорость по диагоналиРасстояние между объектамиVector3 — это структураПовторение: пилот дрона10Жизненный цикл скрипта
Awake и StartUpdate и LateUpdateOnEnable и OnDisableПорядок вызовов жизненного циклаПовторение: регистратор жизненного цикла2Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт5Преобразования и иерархия
Родители и детиМасштабПосмотри на объектыДвигайся к точкеПовторение: Луна на орбите6Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказать и скрытьПовторение: выключатель света