Unity的文档有这一行:
默认情况下,不同脚本的Awake,OnEnable和Update函数按脚本加载的顺序调用(这是任意的)。
所以我在这里有两个问题:
我有一段时间想知道Unity如何“决定”它在运行时的行为方式,特别是因为看起来某些东西会在某些时候起作用,但其余的时间会导致崩溃或者几乎没有解释,但文档并没有真正提及它,我似乎无法在其他地方找到很多信息。
答案 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”对象,按照您希望的顺序实例化对象。