我发现我们可以在Awake()
或Start()
中初始化变量,Awake()
之前会调用Start()
。
我们何时应该在Awake
和Start
初始化以获得最佳效果?
答案 0 :(得分:32)
通常,Awake()用于初始化某些值或脚本是否相互依赖,如果其中一个值被初始化得太晚(在游戏开始前清醒运行),则会导致错误。 每个脚本实例也只调用一次唤醒。
让我引用文档:
[...]在初始化所有对象后调用Awake,以便您可以安全地与其他对象说话或使用例如查询它们。 GameObject.FindWithTag。每个GameObject的Awake都是在对象之间以随机顺序调用的。因此,您应该使用Awake在脚本之间设置引用,并使用Start()来回传递任何信息。在任何Start功能之前总是调用Awake。这允许您订购脚本的初始化。觉醒不能作为协程。
关于Start():
当在任何脚本之前启用脚本时,在帧上调用Start 第一次调用Update方法。
与Awake功能一样,Start在生命周期中只调用一次 的脚本。但是,脚本对象时会调用Awake 无论脚本是否已启用,都会初始化。 开始 如果脚本不是,则可能无法在与唤醒相同的帧上调用 在初始化时启用。
最后一部分产生了很大的不同
要问你问题:
如果在游戏开始时脚本不启用,并且您不需要初始化变量, start将保存性能 as awake()无论如何都会被调用。
每个变量都会在一开始就被初始化。至少这是我做出的逻辑假设。
答案 1 :(得分:3)
官方文件说明(Awake
和Start
)对此主题进行了详细说明。
本节介绍您可能需要两个功能的原因:
在任何场景中的所有对象上调用
Awake
函数 调用对象的Start
函数。这个事实在以下情况下很有用 对象A的初始化代码需要依赖于对象B. 被初始化; B的初始化应该在Awake
时进行 A应该在Start
中完成。
Awake
和Start
之间的区别在于,只有在启用脚本 时才会调用Start
。
在第一个Update
方法之前调用这两个函数,它们之间没有性能差异。我会说Awake
用于初始化所有对象(如构造函数),而Start
用于链接对象或在游戏开始之前做某事。
答案 2 :(得分:2)
清醒相当于ctor。在创建MonoBehaviour之前,在任何其他方法之前调用它。
第一次启动MonoBehaviour时启动开始。这可能是在醒来之后或很久之后。这允许执行与应用程序或对象的当前状态相关的操作。
例如,你创造了一个敌人,在Awake中,你放置了所有基本的初始化。然后,在清醒结束时停止敌人。之后,敌人即将被激活,但如果玩家拥有某种特定武器,你想让它变红,然后你就可以在开始时进行。
OnEnable类似于Start,但是在每个SetActive(true)和启动时(如果启用)都会发生。例如,这可以成为你的敌人的候选人,他们愿意根据玩家规范改变等级上的颜色。
答案 3 :(得分:2)
性能没有太大差异。但是我可以告诉你它们之间的区别。
举一个简单的例子。假设即使您尚未在检查器中激活脚本,也要使用Awake()函数在控制台中打印“ HELLO”,也可以在控制台中打印它。但是,如果您在Start()函数中编写了相同的内容,但脚本未激活,则在控制台中不会得到任何输出。就是这样。
仅当脚本被激活时,Start()函数中的代码才被执行,即使脚本未被激活,Awake()函数中的代码也被执行。试试吧!