MonoBehaviour.Awake()
Описание
Unity вызывает Awake при загрузке экземпляра компонента скрипта.
Unity вызывает Awake только один раз в течение срока жизни экземпляра сценария. Срок жизни сценария длится до тех пор, пока сценарий не будет уничтожен или сцена, содержащая его, не будет разгружена. Если сцена загружается снова, Unity загружает экземпляр сценария и вызывает Awake снова. Если сцена загружается несколько раз, Unity загружает несколько экземпляров сценария, и Awake вызывает один раз для каждого экземпляра.
Unity вызывает Awake на компонентах сценария MonoBehaviour, когда любой из следующих сценариев возникает первым в течение срока жизни экземпляра сценария:
- GameObject, к которому прикреплен скрипт, активен в Hierarchy (GameObject.activeInHierarchy ==
true) и инициализируется при загрузке сцены. - GameObject, к которому прикреплен скрипт, переходит из неактивного (GameObject.activeInHierarchy ==
false) в активный (GameObject.activeInHierarchy ==true) в первый раз. - Активный GameObject, к которому прикреплен скрипт, создается с помощью Object.Instantiate и инициализируется.
Unity вызывает Awake независимо от значения Behaviour.enabled для самого компонента скрипта, если выполнены другие условия.
Используйте Awake для инициализации переменных или состояний перед запуском приложения.
Для активного GameObjects в сцене, Unity вызывает Awake после инициализации всех активных GameObjects в сцене, так что вы можете безопасно использовать такие методы, как GameObject.FindWithTag для запроса других GameObjects.
Порядок, в котором Unity вызывает каждый из Awake GameObject не является детерминированным, и вы не можете рассчитывать на то, что Awake будет вызван на одном GameObject до или после другого. Например, не предполагайте, что ссылка, созданная Awake одного GameObject, будет использоваться в другом AwakeGameObject. Вместо этого, вы должны использовать Awake для создания ссылок между скриптами, и использовать Start, который вызывается после завершения всех вызовов Awake, для передачи любой информации туда и обратно.Awake всегда вызывается перед любыми функциями Start. Это позволяет вам определить порядок инициализации скриптов. Awake вызывается даже если скрипт является отключенным компонентом активного GameObject. Если Awake компонента скрипта вызывает исключение, Unity отключает компонент. Awake не может действовать в качестве сопутствующей процедуры.
Используйте Awake вместо конструктора для инициализации, поскольку сериализованное состояние компонента во время конструирования не определено. Awake вызывается один раз, как и конструктор.
Для получения дополнительной информации о порядке выполнения функций событий, см. Порядок выполнения функции события в руководстве.
using UnityEngine;
public class ExampleClass : MonoBehaviour { private GameObject target;
void Awake() { target = GameObject.FindWithTag("Player"); } }
Неактивный GameObject может быть активирован, когда GameObject.SetActive призывают на нее.
Следующие два примера скриптов Example1 и Example2 работать вместе, и проиллюстрировать два времени, когда Awake() называется.
Чтобы воспроизвести пример, создайте сцену с двумя GameObjects Cube1 и Cube2. Назначить Example1 как компонент скрипта для Cube1, и установить Cube1 как неактивный, снимая флажок Inspector в верхнем левом углу (Cube1 станет невидимым). Example2 как компонент скрипта для Cube2, и установить Cube1 как его GO переменная.
Введите режим воспроизведения: нажатие клавиши пробел будет выполнять код в Example2.Update который активирует Cube1и причины Example1.Awake() чтобы быть вызванным.
using UnityEngine;
// Make sure that Cube1 is assigned this script and is inactive at the start of the game.
public class Example1 : MonoBehaviour { void Awake() { // Prints first Debug.Log("Example1.Awake() was called"); }
void Start() { // Prints second Debug.Log("Example1.Start() was called"); }
void Update() { if (Input.GetKeyDown("b")) { // Prints Last if "b" is pressed Debug.Log("b key was pressed"); } } }
Example2. Это вызывает вызов Example1.Awake(). Для этого используется клавиша пробел:
using UnityEngine;
public class Example2 : MonoBehaviour { // Assign Cube1 to this variable GO before running the example public GameObject GO;
void Awake() { Debug.Log("Example2.Awake() was called"); }
void Start() { Debug.Log("Example2.Start() was called"); }
// track if Cube1 was already activated private bool activateGO = true;
void Update() { if (activateGO == true) { if (Input.GetKeyDown("space")) { Debug.Log("space key was pressed"); GO.SetActive(true); activateGO = false; } } } }