描述

Awake 在加载脚本实例时调用。

Awake 用于在游戏启动之前初始化任何变量或游戏状态。 在脚本实例的生命周期内仅调用 Awake 一次。 所有对象初始化之后,将调用 Awake,以便您可以使用 GameObject.FindWithTag 等安全地与其他对象通信或者对其进行查询。 在对象之间,按随机顺序调用每个游戏对象的 Awake。因此,您应该使用 Awake 在脚本之间设置引用,并使用 Start 来回传递任何信息。 始终先调用 Awake,然后才调用任何 Start 函数。这让您可以对脚本的初始化进行排序。 Awake 不能充当协程。

注意:请使用 Awake 来代替构造函数进行初始化,因为组件的序列化状态在构造时是未定义的。 与构造函数一样,仅调用 Awake 一次。

using UnityEngine;

public class ExampleClass : MonoBehaviour { private GameObject target;

void Awake() { target = GameObject.FindWithTag("Player"); } }

对于未激活的 GameObject,调用 GameObject.SetActive 可以将其激活。

以下两个脚本协同工作。使用名为 Cube1 和 Cube2 的两个游戏对象。Example1.cs 是 Cube1 的脚本。使用 Inspector 左上角的按钮,将该脚本标记为非活动状态。这意味着将隐藏 Cube1。将 Cube2 标记为活动状态。然而,Cube1 是 Cube2 的公共游戏对象。Example2 脚本可以激活 Cube1,并使它执行 Example1.cs 脚本中的 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() { Debug.Log("Awake"); }

void Start() { Debug.Log("Example1"); }

void Update() { if (Input.GetKeyDown("b")) { print("b key was pressed"); } } }

Example2。此示例将调用 Example1 中的 Awake。空格键用于执行此操作:

using UnityEngine;

public class Example2 : MonoBehaviour { // GO has Example1 script assigned to it so is Cube1 public GameObject GO;

void Start() { Debug.Log("Example2"); }

// allow Cube1 to activated just once private bool activateGO = true;

void Update() { if (activateGO == true) { if (Input.GetKeyDown("space")) { Debug.Log("space key was pressed"); GO.SetActive(true); activateGO = false; } } } }

Awake 不能作为协同程序使用。