unity脚本执行顺序和Start()

Posted

技术标签:

【中文标题】unity脚本执行顺序和Start()【英文标题】:Unity script execution order and Start() 【发布时间】:2017-03-14 12:16:08 【问题描述】:

Unity 的文档有这一行:

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

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

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

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

【问题讨论】:

你不能通过在这些方法中设置一些调试输出并运行你的游戏脚本来发现这一点,以便Awake 打印一些东西,Start 打印一些东西,你可以阅读日志为然后澄清哪个先发生 answers.unity3d.com/questions/217941/… 我不确定 4 年半前的一个错误是否与这个问题有关 另见***.com/questions/36252189/…的问答 【参考方案1】:

那句话有点令人困惑。

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

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

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

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

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

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

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

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

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

【讨论】:

澄清:例如的执行顺序默认情况下,您不同脚本中的所有Start-functions 都是随机的。有时Start 来自Script A 会先执行,有时Start 来自Script B,但所有Awake 函数都会在第一个Start 函数之前执行。 我知道事件函数的顺序,即 Awake -> Start -> OnEnable -> Update,所有脚本中的每个 Awake 函数都在任何 Start 函数之前被调用。例如,我想知道 Unity 如何决定“唤醒”函数的顺序。你已经回答了,它是随机的,坦率地说,我认为这很愚蠢,但我想这就是 Unity。谢谢。 是的,它是随机的。该随机事件在选择随机脚本时开始。然后,所选的随机脚本将调用其 Awake 函数。为了更正您,顺序是 Awake -> OnEnable-> Start-> Update。 @GunnarB 我认为这是正确的,这取决于选择运行的脚本。 可以补充一点,Awake 和 Start 明显不同,Awake 就像一个 ctor,因为 MB 没有暴露一个 ctor。 Start 在脚本第一次运行时被调用。因此,如果您使用 AddComponent,则会调用 Awake,如果禁用以下行,则在第一次启用之前(以及 OnEnable)将不会启动。 Start 不会再次运行,而 OnEnable 会。 这很愚蠢,因为它不一致。如果某些事情因为我有或没有做过的事情而在 100% 的情况下崩溃,我可以忍受它。但是,当由于随机选择脚本顺序而导致 1% 的崩溃时,即使使用调试也很难复制。我只是觉得应该有一些一致的默认值,这意味着每次运行您的应用程序时顺序都是相同的,即使该顺序是错误的。【参考方案2】:

问题 1

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

问题 2

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

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

【讨论】:

显然,如果您不设置任何内容,则顺序是随机的。我知道 Awake() 在 Start() 之前运行,我的意思是 Start() 受脚本执行顺序的影响,因为文档暗示它不是。 我不太明白这个问题。 Start() 在对象启用脚本后立即运行,就在 Update() 运行之前。因此,不同 Start() 的运行顺序取决于您启用脚本的顺序 好吧,确实令人困惑。文档说“Awake、OnEnable 和 Update Functions”在脚本执行顺序中被调用,但没有提到 Start(),所以当场景第一次启动时,在调用所有 Awake 函数之后,Start() 会发生什么职能。它们是按相同的顺序调用的,还是它们的顺序是任意的,这会使其与唤醒函数的顺序不同? 好吧,好吧。我不确定场景中已经存在的对象。你能通过在不同的 Start() 函数中记录一些东西来测试它,看看它是否看起来是随机的吗?这就是为什么我写这个来保证你需要使用某种“管理器”对象的顺序,该对象在按下播放时实例化你的对象。

以上是关于unity脚本执行顺序和Start()的主要内容,如果未能解决你的问题,请参考以下文章

Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序

浅谈Unity的脚本执行顺序

小功能⭐️Unity改变代码执行顺序

Unity 脚本的执行顺序

unity脚本执行顺序

酷熊科技工作积累 ----------- Unity3d中的Awake()OnEnable()Start()等默认函数的执行顺序和生命周期