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

时间:2015-01-13 17:59:22

标签: c# unity3d events

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

void Awake ()
{
    gameObject.AddComponent("Script_1");
    gameObject.AddComponent("Script_2");
}

5 个答案:

答案 0 :(得分:6)

简短回答:不是。但您可以在设置中设置Script Execution Order(菜单:编辑>项目设置>脚本执行顺序)或从代码更改

{{1}}

1)Script Execution Order manipulation

2)Changing Unity Scripts Execution Order from Code

3)Change a script's execution order dynamically (from script)

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

答案 1 :(得分:2)

我在商店中看到的一些资产,例如Cinemachine,在.meta文件中设置了executionOrder属性(例如,MyMonoBehavior.cs.meta)。我已经测试过,这确实有效(例如,将其从0更改为200然后右键单击并重新导入)。似乎元文件保存在包中,因此如果您要分发资产,将资产包放在带有元的商店中应该有效(https://docs.unity3d.com/Manual/AssetPackages.html)。

答案 2 :(得分:1)

如上所述here

  

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

可以找到here

的执行顺序设置参考

答案 3 :(得分:0)

您可以使用以下属性:

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

答案 4 :(得分:0)

您也可以在编辑器脚本中实现此目的。添加在加载时初始化的类并动态设置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);
            }
        }
    }

}

这还将在脚本执行顺序窗口中显示脚本。