Unity脚本执行顺序和Start()

时间:2016-11-01 10:56:54

标签: unity3d unity5 order-of-execution

Unity的文档有这一行:

  

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

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

  1. 在这种情况下,“任意”意味着什么?它是随机的吗?
  2. 这是否还包括Start()和Awake(),或者Start()是否有自己的特殊行为,不遵循脚本执行顺序,即使在项目设置中更改了该顺序?
  3. 我有一段时间想知道Unity如何“决定”它在运行时的行为方式,特别是因为看起来某些东西会在某些时候起作用,但其余的时间会导致崩溃或者几乎没有解释,但文档并没有真正提及它,我似乎无法在其他地方找到很多信息。

2 个答案:

答案 0 :(得分:2)

这句话有点令人困惑。

清醒,OnEnable和Update将按顺序调用始终

  

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

,它是随机的。虽然,谈论Awake,OnEnable和Update功能。它在谈论脚本。随机选择脚本来执行。

  

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

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

  

我有一段时间想知道Unity如何“决定”它的行为方式   运行,特别是因为看起来某些东西会起作用   时间,但其余的时间会导致崩溃或其他事情   很少甚至没有解释

是的,这是真的。这在过去也发生在我身上。当您拥有包含许多脚本的大型项目时,更容易发生这种情况。这些脚本是随机调用的。有时,您可以获得null异常错误,因为GetComponent无效。这就是制作 Script Execution Order Settings 的原因,以便您始终可以设置脚本执行的顺序。

我要解决的问题是在协程功能中执行GetComponent。之后,我检查它是否为空。如果为null,请等待一帧,然后再次尝试GetComponent

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

答案 1 :(得分:1)

问题1

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

问题2

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

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