通过以编程方式将脚本添加到给定的游戏对象,这些脚本是否会按照添加的顺序执行?他们的活动会按照他们添加的顺序运行吗?
void Awake ()
{
gameObject.AddComponent("Script_1");
gameObject.AddComponent("Script_2");
}
答案 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);
}
}
}
}
这还将在脚本执行顺序窗口中显示脚本。