3

Unity 的文档有这一行:

默认情况下,不同脚本的 Awake、OnEnable 和 Update 函数是按照脚本加载的顺序(任意)调用的。

所以我在这里有两个问题:

  1. 在这种情况下,“任意”是什么意思?是随机的吗?
  2. 这是否还包括 Awake() 旁边的 Start(),或者 Start() 是否有自己的特殊行为,不遵循脚本执行顺序,即使该顺序已在项目设置中更改?

我一直想知道 Unity 如何“决定”它在运行时的行为方式,特别是因为它似乎在某些时候会起作用,但在其余时间它会导致崩溃或几乎没有解释的东西,但是文档并没有真正提及它,而且我似乎在其他地方找不到太多信息。

4

2 回答 2

3

这种说法有点令人困惑。

Awake、OnEnable 和 Update 将始终按顺序调用。

1.在这种情况下,“任意”是什么意思?是随机的吗?

的,它是随机的。虽然,它不是在谈论 Awake、OnEnable 和 Update 函数。它正在谈论脚本。脚本是随机选择执行的。

2.这是否还包括 Start() 和 Awake(),或者 Start() 是否有自己的特殊行为,不遵循脚本执行顺序,即使该顺序已在项目设置中更改?

答案#1 也应该回答问题#2。这不会影响诸如 Start() Awake() 或 OnEnable() 之类的回调函数。

我一直想知道 Unity 如何“决定”它在运行时的行为方式,特别是因为它似乎在某些时候会起作用,但在其余时间它会导致崩溃或几乎没有解释的事情

是的,这是真的。这在过去也发生在我身上。当您有包含许多脚本的大型项目时,这更容易发生。脚本是随机调用的。有时,您可能会因为GetComponent无法工作而收到空异常错误。这就是脚本执行顺序设置的原因,以便您始终可以设置脚本执行的顺序。

我解决此类问题的方法是GetComponent在协程函数中执行。之后,我检查它是否为空。如果为空,请等待一帧然后GetComponent重试。

同样,这适用于执行脚本的顺序,而不是调用/调用回调函数的顺序。

于 2016-11-01T11:09:37.973 回答
1

问题 1

根据https://docs.unity3d.com/Manual/class-ScriptExecution.html,您可以手动设置脚本加载的顺序。如果您不设置顺序,我的猜测是 Unity 使用了一些预定义的顺序(随机、字母顺序或其他顺序)

问题2

Awake() 始终在 Start() 之前运行,并在加载脚本时调用https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html

要按特定顺序加载脚本,您需要使用脚本执行顺序。为确保以特定顺序运行每个对象的 Start() 函数,您需要创建一个“管理器”对象,该对象以您希望的顺序实例化对象。

于 2016-11-01T11:16:22.347 回答