Unity - 脚本的 Awake() 是不是在其他脚本的 Start() 之前运行?

Posted

技术标签:

【中文标题】Unity - 脚本的 Awake() 是不是在其他脚本的 Start() 之前运行?【英文标题】:Unity - Does a script's Awake() run before other scripts' Start()?Unity - 脚本的 Awake() 是否在其他脚本的 Start() 之前运行? 【发布时间】:2019-03-17 03:10:43 【问题描述】:

他们说 Awake() 在 Start() 之前被调用,但他们没有提到这些函数是否必须属于同一个脚本。

【问题讨论】:

【参考方案1】:

他们说 Awake() 在 Start() 之前被调用,但他们没有提到是否 这些函数必须属于同一个脚本。

场景中的所有 Awake() 在任何 Start() 之前调用。它们所属的脚本无关紧要。除非脚本附加到的 GameObject 在启动 Awake 期间处于非活动状态,否则在 GameObject 激活之前不会调用它。来自https://docs.unity3d.com:

第一个场景加载

这些函数在场景开始时被调用(场景中的每个对象一次)。

Awake:此函数始终在任何 Start 函数之前调用,并且 也只是在预制件实例化之后。 (如果一个游戏对象是 在启动期间不活动 Awake 直到它被调用才被调用 活跃。) OnEnable:(仅在对象处于活动状态时调用):此函数是 在启用对象后调用。当一个 创建 MonoBehaviour 实例,例如在加载关卡时或 一个带有脚本组件的 GameObject 被实例化。 OnLevelWasLoaded:执行此函数以通知游戏 新关卡已加载。

请注意,对于添加到场景中的对象,所有脚本的 Awake 和 OnEnable 函数将在为其中任何一个调用 Start、Update 等之前调用。当然,在游戏过程中实例化对象时无法强制执行此操作。

更多关于这个here

顺便说一句:您没有问过这个问题,但是如果出于任何原因您需要在其他脚本之前执行某些脚本,您可以查看link 以了解如何设置脚本执行顺序(这是关于脚本的顺序,不是每个脚本内部方法的顺序)

【讨论】:

感谢两位的回答。是的,我指的是场景中预先存在的对象,而不是将新实例化的对象与现有对象进行比较。实际上我尽量避免设置脚本执行顺序,因为我觉得以后添加更多脚本时可能会搞砸。 值得一提的是AwakeOnEnable是一个接一个的调用。所以除了我一开始想的以外,OnEnableall Awake 完成后不会被调用,而是一起为一个脚本调用,所以在OnEnable 中不能依赖其他脚本Awake。跨度> 【参考方案2】:

我的实验表明场景中的所有 Awake() 都在所有 Start() 之前执行。

我创建了10个脚本,分别放在10个游戏对象上。

【讨论】:

也说明Awake/Start调用之间没有先后顺序。

以上是关于Unity - 脚本的 Awake() 是不是在其他脚本的 Start() 之前运行?的主要内容,如果未能解决你的问题,请参考以下文章

Unity不同脚本或者多个脚本之间的执行顺序Awake, Start

[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中

[Unity] Awake 与 Start 的使用, 为什么将 GetComponent 逻辑放到 Awake 中

Unity3D脚本中Start和Awake的区别

在 Unity 中,是在游戏开始之前还是在场景开始之前调用 Awake()?

Unity脚本启动细节