Описание
Пробуждение вызывается при загрузке экземпляра скрипта.
Пробуждение вызывается, когда активный игровой объект, содержащий сценарий, инициализируется при загрузке сцены, или когда ранее неактивный игровой объект становится активным, или после создания игрового объекта с помощью Object .Instantiate инициализируется. Используйте Awake для инициализации переменных или состояний перед запуском приложения.
Unity вызывает Awake только один раз за время существования экземпляра скрипта. Срок жизни сценария длится до тех пор, пока сцена, содержащая его, не будет выгружена. Если сцена загружается снова, Unity снова загружает экземпляр скрипта, поэтому Awake будет вызываться снова. Если сцена загружается несколько раз аддитивно, Unity загружает несколько экземпляров скрипта, поэтому Awake будет вызываться несколько раз (по одному для каждого экземпляра).
Для активных игровых объектов, помещенных в сцену, Unity вызывает Awake после инициализации всех активных игровых объектов в сцене, поэтому вы можете безопасно использовать такие методы, как GameObject.FindWithTag для запроса других игровых объектов.
Порядок, в котором Unity вызывает Awake каждого GameObject, не является детерминированным. Из-за этого вы не должны полагаться на то, что Awake одного GameObject вызывается до или после другого (например, вы не должны предполагать, что ссылка, установленная одним GameObject Awake можно будет использовать в Awake другого игрового объекта). Вместо этого следует использовать Awake для установки ссылок между сценариями и использовать Start
, который вызывается после всех Вызовы Awake завершены для передачи любой информации туда и обратно.
Awake всегда вызывается перед любым Start
функций. Это позволяет заказывать инициализацию скриптов. Awake вызывается, даже если скрипт является отключенным компонентом активного GameObject.
Awake не может действовать как сопрограмма.
Примечание. Используйте Awake вместо конструктора для инициализации, поскольку сериализованное состояние компонента не определено во время создания. Awake вызывается один раз, как и конструктор.
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
private GameObject target;
void Awake()
{
target = GameObject.FindWithTag("Player");
}
}
Неактивный GameObject можно активировать, когда для него вызывается GameObject.SetActive.
Следующие два примера скриптов Example1 и Example2 работают вместе и иллюстрируют два тайминга при вызове Awake().
Чтобы воспроизвести пример, создайте сцену с двумя игровыми объектами Cube1 и Cube2. Назначьте Example1 в качестве компонента скрипта для Cube1 и установите Cube1 как неактивный, сняв флажок Inspector в левом верхнем углу (Cube1 станет невидимым). Назначьте Example2 в качестве компонента скрипта для Cube2 и установите Cube1 в качестве его переменной GO
.
Войдите в режим воспроизведения: нажатие клавиши пробела приведет к выполнению кода в Example2.Update, который активирует Cube1 и вызовет Example1.Awake().
using UnityEngine;
// Убедитесь, что Cube1 назначен этот скрипт и неактивен в начале игры.
public class Example1 : MonoBehaviour
{
void Awake()
{
Debug.Log("Example1.Awake() was called");
}
void Start()
{
Debug.Log("Example1.Start() was called");
}
void Update()
{
if (Input.GetKeyDown("b"))
{
print("b key was pressed");
}
}
}
Пример 2. Это вызывает вызов Example1.Awake(). Для этого используется клавиша пробела:
using UnityEngine;
public class Example2 : MonoBehaviour
{
// Назначаем Cube1 этой переменной GO перед запуском примера
public GameObject GO;
void Awake()
{
Debug.Log("Example2.Awake() was called");
}
void Start()
{
Debug.Log("Example2.Start() was called");
}
// отслеживаем, был ли уже активирован Cube1
private bool activateGO = true;
void Update()
{
if (activateGO == true)
{
if (Input.GetKeyDown("space"))
{
Debug.Log("space key was pressed");
GO.SetActive(true);
activateGO = false;
}
}
}
}