Unity工具之设置C#脚本执行顺序

Unity工具之设置C#脚本执行顺序

简介

在Unity中经常需要调整脚本的执行顺序,以控制整个执行的流程,Unity本身通过设置ScriptExecutionOrder来解决此问题。

Unity提供了对应的工具可以直接调整脚本的执行顺序,但是此工具在使用上并不方便,本文将重点介绍另一种方式,通过为脚本添加属性,借助于编辑器功能进一步自动调整脚本的执行顺序。

声明

本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。

如果您进行转载,请标明出处。

Unity工具之ScriptExecutionOrder(http://www.liyubin.com/articles/2019/03/20/1553056823837.html)

Unity中调整ScriptExecutionOrder方式

使用Unity菜单中的Editor->Project Setting->Script Execution Order,可以查看到调整窗口,如:

Script Execution Order Window

通过点击"+"按钮并查找需要调整的脚本,通过拖拽可以调整脚本的执行顺序,也可以通过给予特定的数值来调整脚本的执行顺序。

  • 值为0,表示使用标准时间,默认值
  • 值小于0,表示脚本的执行时机早于标准时间
  • 值大于0,表示脚本的执行时机晚于标准时间

PS:添加的值仅仅表示执行的顺序,并非表示具体的时间

使用自定义工具调整ScriptExecutionOrder

如果项目中脚本较多,使用Unity自带的方式调整的话,就会发现不方便之处,项目中大量的脚本,查找就有一定的难度,所以需要一个简化的方式可以方便调整脚本的执行顺序。特此GitHub上提供了一开源项目,借助于此工具可以通过代码中指定属性,从而自动调整代码的执行顺序。

Unity-ExecutionOrder

  • 实现原理

    通过制定属性标签指定脚本的执行顺序,借助于Unity本身对于脚本导入时会触发[UnityEditor.Callbacks.DidReloadScripts]标签指定的方法的特点,通过添加工具将指定的脚本的属性添加到Unity的ScriptExecutionOrder中

  • 使用方式

    工具内容非常简单,仅仅有两个脚本:ExecutionOrderAttributes.cs和ExecutionOrderAttributesEditor.cs,在项目中只要将ExecutionOrderAttributesEditor添加到Editor工具中即可。

    示例代码:
    
    public class Script1 : MonoBehaviour {
        void Start () {
            Debug.Log("Second");
        }
    }
    
    • ExecutionOrderAttribute

      参数: order

      通过直接指定固定的时间,来标识脚本的执行顺序

      [ExecutionOrder(100)]
      public class Script2 : MonoBehaviour {
          void Start () {
              Debug.Log("Third");
          }
      }
      
    • ExecuteAfterAttribute

      参数:targetType,orderIncrease

      通过指定具体的类型及时机,来标识脚本的执行在指定的类型之后

      [ExecuteAfter(typeof(Script1))]
      public class Script3 : MonoBehaviour {
          void Start () {
              Debug.Log("First");
          }
      }
      ```
      
      
    • ExecuteBeforeAttribute

      参数:targetType,orderIncrease

      通过指定具体的类型及时机,来标识脚本的执行在指定的类型之前

      [ExecuteBefore(typeof(Script1))]
      public class Script4 : MonoBehaviour {
          void Start () {
              Debug.Log("First");
          }
      }
      ```
      

    PS: 可以同时使用ExecuteBefore和ExecuteAfter两个标签,标识脚本执行早于类型A,晚于类型B

    [ExecuteAfter(typeof(Script2)), ExecuteAfter(typeof(Script3), orderIncrease = 20)]
    public class Script4 : MonoBehaviour {
        void Start () {
            Debug.Log("Fourth");
        }
    }
    

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值