Awake и Start
Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 70 из 85.
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().
Задание
СреднеИсправь ульи, чтобы ни один из них не подсчитывал список, который ещё не создан.
- Добавь
void Awake()вHive. - Перемести строку
bees = new List<GameObject>();и циклforизStart()вAwake(). - Оставь две строки подсчёта в
Start(): каждыйAwake()выполняется до любогоStart().
Нажми «Играть»: каждый улей записывает в журнал количество пчёл соперника, HiveA насчитывает 5 пчёл соперника, ошибок нет. Затем нажми «Проверить».
Попробуйте сами
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Основы C# в Unity
Привет, UnityПеременныеДля дробных чисел нужна fТекст в консолиПеременные, которые запоминаютЕсли и иначеСравнение чиселПовторение: сборщик монет7Циклы и методы
Повторение с forЦиклы внутри цикловНапишите методМетоды, которые возвращают значениеМассивыПовторение: лестница10Поиск объектов
Поиск по имениТегиПоиск по типуСсылки лучше поискаNull в UnityПовторение: ближайшая монета13Проект: уворачиваемся от блоков
БегунБлоки с неба2Заставь двигаться
Размести кубДвигай каждый кадрПоворачивай каждую секундуУправляй клавишамиПовторение: веди куб5Векторы
Сложение векторовНаправленияЛокальное и мировое пространствоСкорость по диагоналиРасстояние между объектамиVector3 — это структураПовторение: пилот дрона8Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказ и скрытиеПовторение: выключатель света3Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт6Трансформации и иерархия
Родители и детиПоднять флагМасштабСмотреть на объектыДвигаться к точкеПовторение: Луна на орбите12Жизненный цикл скрипта
Awake и StartUpdate и LateUpdateOnEnable и OnDisableПорядок вызовов жизненного циклаПовторение: логгер жизненного циклаПотренируйтесь самостоятельно: Песочница Unity