拓展编辑器(五)_监听事件

时间:2023-02-11 22:33:52

监听事件

  这个是拓展Project视图的最后一节,这里将会介绍一下如何借助程序来约束project视图中的资源。例如用程序来判断资源的原始位置以及将要移动的位置是否合法,从而决定是否能阻止本次移动。Unity为此提供了监听的基类。

using UnityEngine;
using UnityEditor;

public class Script_04: UnityEditor.AssetModificationProcessor
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        //全局监听Project视图下的资源是否发生变化(添加,删除和移动)
        EditorApplication.projectChanged += delegate ()
          {
              Debug.Log("change");
          };
    }
    //监听"双击鼠标左键,打开资源"事件
    public static bool IsOpenForEdit(string assetPath, out string message)
    {
        message = null;
        Debug.LogFormat("assetPath:{0}", assetPath);
        //true标识该资源可以打开,false标识不允许在Unity中打开该资源
        return true;
    }
    //监听"资源即将被创建"事件
    public static void OnWillCreateAsset(string path)
    {
        Debug.LogFormat("path:{0}", path);
    }
    //监听"资源即将被保存"事件
    public static string[] OnWillSaveAsset(string[] paths)
    {
        if (paths != null)
        {
            Debug.LogFormat("path:{0}", string.Join(",", paths));
        }
        return paths;
    }
    //监听"资源即将被移动"事件
    public static AssetMoveResult OnWillMoveAsset(string oldPath, string newPath)
    {
        Debug.LogFormat("from:{0} to:{1}", oldPath, newPath);
        //AsserMoveResult.DidMove
        return AssetMoveResult.DidMove;
    }
    //监听"资源即将被删除"事件
    public static AssetDeleteResult OnWillDeleteAsset(string assetPath, RemoveAssetOptions opint)
    {
        Debug.LogFormat("delete:{0}", assetPath);
        //AssetDeleteResult.DidNotDelete表示该资源可以被删除
        return AssetDeleteResult.DidNotDelete;
    }
}

  这个类需要继承UnityEditor.AssetModificationProcessor,然后重写监听资源创建,移动,保存和删除的方法,处理自己的特殊逻辑。