醒来()和开始()

时间:2016-01-07 09:52:18

标签: unity3d

我发现我们可以在Awake()Start()中初始化变量,Awake()之前会调用Start()

我们何时应该在AwakeStart初始化以获得最佳效果?

4 个答案:

答案 0 :(得分:32)

通常,Awake()用于初始化某些值或脚本是否相互依赖,如果其中一个值被初始化得太晚(在游戏开始前清醒运行),则会导致错误。 每个脚本实例也只调用一次唤醒。

让我引用文档:

  

[...]在初始化所有对象后调用Awake,以便您可以安全地与其他对象说话或使用例如查询它们。 GameObject.FindWithTag。每个GameObject的Awake都是在对象之间以随机顺序调用的。因此,您应该使用Awake在脚本之间设置引用,并使用Start()来回传递任何信息。在任何Start功能之前总是调用Awake。这允许您订购脚本的初始化。觉醒不能作为协程。

关于Start():

  

当在任何脚本之前启用脚本时,在帧上调用Start   第一次调用Update方法。

     

与Awake功能一样,Start在生命周期中只调用一次   的脚本。但是,脚本对象时会调用Awake   无论脚本是否已启用,都会初始化。 开始   如果脚本不是,则可能无法在与唤醒相同的帧上调用   在初始化时启用。

最后一部分产生了很大的不同

要问你问题:

如果在游戏开始时脚本启用,并且您不需要初始化变量, start将保存性能 as awake()无论如何都会被调用。
每个变量都会在一开始就被初始化。至少这是我做出的逻辑假设。

答案 1 :(得分:3)

官方文件说明(AwakeStart)对此主题进行了详细说明。

本节介绍您可能需要两个功能的原因:

  

在任何场景中的所有对象上调用Awake函数   调用对象的Start函数。这个事实在以下情况下很有用   对象A的初始化代码需要依赖于对象B.   被初始化; B的初始化应该在Awake时进行   A应该在Start中完成。

AwakeStart之间的区别在于,只有在启用脚本 时才会调用Start

在第一个Update方法之前调用这两个函数,它们之间没有性能差异。我会说Awake用于初始化所有对象(如构造函数),而Start用于链接对象或在游戏开始之前做某事。

答案 2 :(得分:2)

清醒相当于ctor。在创建MonoBehaviour之前,在任何其他方法之前调用它。

第一次启动MonoBehaviour时启动开始。这可能是在醒来之后或很久之后。这允许执行与应用程序或对象的当前状态相关的操作。

例如,你创造了一个敌人,在Awake中,你放置了所有基本的初始化。然后,在清醒结束时停止敌人。之后,敌人即将被激活,但如果玩家拥有某种特定武器,你想让它变红,然后你就可以在开始时进行。

OnEnable类似于Start,但是在每个SetActive(true)和启动时(如果启用)都会发生。例如,这可以成为你的敌人的候选人,他们愿意根据玩家规范改变等级上的颜色。

答案 3 :(得分:2)

性能没有太大差异。但是我可以告诉你它们之间的区别。

举一个简单的例子。假设即使您尚未在检查器中激活脚本,也要使用Awake()函数在控制台中打印“ HELLO”,也可以在控制台中打印它。但是,如果您在Start()函数中编写了相同的内容,但脚本未激活,则在控制台中不会得到任何输出。就是这样。

仅当脚本被激活时,Start()函数中的代码才被执行,即使脚本未被激活,Awake()函数中的代码也被执行。试试吧!