C# 以编程方式定义脚本的执行顺序

C# 以编程方式定义脚本的执行顺序,c#,unity3d,events,C#,Unity3d,Events,通过编程方式将脚本添加到给定的游戏对象,这些脚本是否会按添加顺序执行?他们的事件将按添加顺序运行吗 void Awake () { gameObject.AddComponent("Script_1"); gameObject.AddComponent("Script_2"); } 如上所述 默认情况下,不同脚本的Awake、OnEnable和Update函数是按照加载脚本的顺序调用的(这是任意的)。但是,可以使用脚本执行顺序设置修改此顺序 可以找到执行顺序设置的参考简短回答:

通过编程方式将脚本添加到给定的游戏对象,这些脚本是否会按添加顺序执行?他们的事件将按添加顺序运行吗

void Awake ()
{
    gameObject.AddComponent("Script_1");
    gameObject.AddComponent("Script_2");
}
如上所述

默认情况下,不同脚本的Awake、OnEnable和Update函数是按照加载脚本的顺序调用的(这是任意的)。但是,可以使用脚本执行顺序设置修改此顺序


可以找到执行顺序设置的参考

简短回答:否。但您可以在设置(菜单:编辑>项目设置>脚本执行顺序)中进行设置,也可以从代码中进行更改:

// First you get the MonoScript of your MonoBehaviour
MonoScript monoScript = MonoScript.FromMonoBehaviour(yourMonoBehaviour);

// Getting the current execution order of that MonoScript
int currentExecutionOrder = MonoImporter.GetExecutionOrder(monoScript);

// Changing the MonoScript's execution order
MonoImporter.SetExecutionOrder(monoScript, x);
(一)

(二)

(三)


最近我也遇到了类似的问题,发现这个问题没有答案。因此决定发布有用的信息,希望能有所帮助:)

我在商店中看到的一些资产,例如Cinemachine,在.meta文件中设置executionOrder属性(例如MyMonoBehavior.cs.meta)。我已经测试过,这确实有效(例如,将其从0更改为200,然后右键单击并重新导入)。元数据文件似乎保留在包中,因此,如果您要分发资产,将资产包与meta一起放入存储中应该可以工作()。

您可以使用以下属性:

[DefaultExecutionOrder(100)]
public class SomeClass : MonoBehaviour
{
}

您还可以在编辑器脚本中实现这一点。添加加载时初始化的类,并动态设置MonoScripts顺序

[InitializeOnLoad]
public class SetExecutionOrder{

    static SetExecutionOrder(){
        MonoScript[] scripts = (MonoScript[])Resources.FindObjectsOfTypeAll(typeof(MonoScript));
        int order = -100;  //Set this to whatever order you want
        foreach(MonoScript script in scripts){
            if(script.GetClass() == typeof(MyMonoScriptType)){  //The type of the MonoScript who's order you want to change
                MonoImporter.SetExecutionOrder(script , order);
            }
        }
    }

}

这也会在脚本执行顺序窗口中显示脚本。

没错,但这并不能回答我关于非任意加载(非随机)的问题。那么,通过awake以编程方式加载脚本,它们是否按照添加的顺序运行,并继续按照添加的顺序运行?我认为您不会得到比这更好的答案。没有定义它们的执行顺序。除非使用脚本执行顺序设置修改顺序。执行顺序没有定义,可能是因为unity使用多个线程执行它们。在完成前一个函数后,每个线程可能只处理下一个尚未开始处理的函数。根据我的经验,它似乎确实按照脚本连接到游戏对象的顺序执行。我已经试过好几次了,并在很多非生产脚本中使用过它。然而,由于没有官方文件,而且事情可能会发生变化,我不会一直指望这项工作。这正是我一直在寻找的。非常感谢你!令人惊叹的!如果您担心它没有起到任何作用(就像我一样),因为它没有显示在脚本执行顺序窗口中,这显然是出于设计:您的“YourMonoBehavior”句柄来自何处?你分配一个新的吗?这只会返回null。通常情况下,您是通过编辑器脚本执行这类操作的,因此可以将您的目标强制转换为MonoBehavior:
MonoBehavior YourMonoBehavior=(MonoBehavior)target如果您不熟悉编辑器脚本,请查看一些教程,例如ic tnx。还发现“[DefaultExecutionOrder(100)]”是一个更好的解决方案。