【Unity编辑器】拓展Project视图

目录

1、拓展右键菜单

2、创建一个菜单

3、拓展布局

4、监听事件


首先创建一个Editor文件夹,此文件夹可以作为多个目录的子文件夹存在,这样开发者就可以按照功能来划分,将不同功能的编辑代码放在不同的Editor目录下。

如果属于编辑模式下的代码,需要放在Editor文件夹下;如果属于运行代码,放在非Editor的文件夹即可

1、拓展右键菜单

在Editor文件夹下创建一个代码

using UnityEngine;
using UnityEditor;

public class Script_03_01 : MonoBehaviour
{
    [MenuItem("Assets/My Tools/Tools 1" , false , 2)]	//自定义菜单的参数需要在MenuItem方法中写入显示的菜单路径。如果菜单条比较多,可以在第三个参数处输入表示排序的整数,数值越小,它的排序越靠前
    static void MyTools1()
    {    
        Debug.Log(Selection.activeObject.name);    //打印选中的游戏对象
    }

    [MenuItem("Assets/My Tools/Tools 2" , false , 1)]
    static void MyTools2()
    {
        Debug.Log(Selection.activeObject.name);
    }
}

 

2、创建一个菜单

在Editor下创建一个编辑代码

using UnityEngine;
using UnityEditor;

public class Script拓展Project : MonoBehaviour
{
    [MenuItem("Assets/Create/My Create/Cube" , false , 2)]
    static void CreateCube()
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube);	//创建方形
    }

    [MenuItem("Assets/Create/My Create/Sphere" , false ,1)]
    static void CreateSphere()
    {
        GameObject.CreatePrimitive(PrimitiveType.Sphere);	//创建球形
    }
}

 

拓展菜单的关键就是找到正确的菜单路径,通过“/”符号将它们拼合而成GameObject.CreatePrimitive()方法用于创建Unity的基础模型体

3、拓展布局

添加一个click按钮,点击后程序会自动在Console窗口中打印选中的资源名

using UnityEditor;
using UnityEngine;

public class S_拓展布局 : MonoBehaviour
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect)	//(project窗口中每个可见列表项的OnGUI事件的委托)
        {
            //在project视图中选择一个资源
            if (Selection.activeObject && guid == AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject)))
            {
                //设置拓展按钮区域
                float width = 10f;
                selectionRect.x += (selectionRect.width - width);
                selectionRect.y += 2f;
                selectionRect.width = width;
                GUI.color = Color.red;

                //点击事件
                if (GUI.Button(selectionRect, "click"))
                {
                    Debug.LogFormat("click : {0}", Selection.activeObject.name);
                }

                GUI.color = Color.white;
            }
        };
    }
}

点击后的效果 

在方法前面添加[InitializeOnLoadMethod]表示此方法会在C#代码每次编译完后首先调用。

监听EditorApplication.projectWindowItemOnGUI委托,即可使用GUI方法来绘制自定义的UI元素

4、监听事件

Project资源比较多,如果不好好规划,资源就会很凌乱。这时就要借助程序来管理资源,可以通过监听资源的创建、删除、移动和保存等事件来实现。

例如:将某个文件移动到错误的目录下,此时就可以监听资源移动事件,程序判断资源的原始位置以及将要移动的位置是否合法,从而决定是否能阻止本次移动

首先需要继承UnityEditor.AssetModificationProcessor,接着重写监听资源创建、删除、保存和移动的方法

using UnityEditor;
using UnityEngine;

public class S_监听事件 : UnityEditor.AssetModificationProcessor
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        //全局监听Project视图下的资源是否发送变化(添加、删除和移动)
        EditorApplication.projectWindowChanged = 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[] OnWillSaveAssets(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);
        //AssetMoveResult.DidMove表示该资源可以移动
        return AssetMoveResult.DidMove;
    }

    //监听“资源即将被删除”事件
    public static AssetDeleteResult OnWillDeleteAsset(string assetpath, RemoveAssetOptions options)
    {
        Debug.LogFormat("delete:{0}", assetpath);
        //AssetDeleteResult.DidDelete表示该资源可以被删除
        return AssetDeleteResult.DidDelete;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/130494633