Unity脚本执行顺序和Start()

Dis*_*Neo 5 unity-game-engine order-of-execution

Unity的文档中有这样一行:

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

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

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

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

Pro*_*mer 4

这种说法有些令人困惑。

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

1.在此上下文中“任意”是什么意思?是随机的吗?

是的,它是随机的。不过,它并不是谈论 Awake、OnEnable 和 Update 功能。这是在谈论脚本。脚本是随机选择执行的。

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

答案#1 也应该回答问题#2。这不会影响 Start()、Awake() 或 OnEnable() 等回调函数。

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

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

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

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

  • 澄清一下:默认情况下,不同脚本中的所有“Start”函数的执行顺序是随机的。有时先执行“Script A”中的“Start”,有时先执行“Script B”中的“Start”,但所有“Awake”函数都将在第一个“Start”函数之前执行。 (2认同)