美文网首页
Unity 拓展编辑器

Unity 拓展编辑器

作者: 114105lijia | 来源:发表于2022-09-28 11:34 被阅读0次
一、菜单拓展
using UnityEngine;
using UnityEditor;

public class TestMenu : MonoBehaviour
{
    //快捷键  %-control/command   #-shift     &-alt    上/下/左/右-UP/DOWN/LEFT/RIGHT
    [MenuItem("XFKT/Test1 %#K", false, 1)]
    static void Test1()
    {
        Debug.Log("test1");
    }

    [MenuItem("XFKT/Test2/Test22", false, 2)]
    static void Test2()
    {
        Debug.Log("test2");
    }

    //是否可以点击
    [MenuItem("XFKT/Test2", true, 2)]
    static bool Test2Valide1()
    {
        return false;
    }

    [MenuItem("XFKT/Test3", false, 0)]
    static void Test3()
    {
        Debug.Log("test3");
    }

    //优先级间隔比较大时,会形成分割线
    [MenuItem("XFKT/Test4", false, 20)]
    static void Test4()
    {
        Debug.Log("test4");
    }
}
image.png
二、Scene视图自定义菜单
using UnityEditor;
using UnityEngine;

public class TestSceneMenu : MonoBehaviour
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoad()
    {
        UnityEditor.SceneView.duringSceneGui += (sceneView) =>
        {
            Event e = Event.current;
            if (e != null &&
                e.button == 1 &&
                e.type == EventType.MouseUp)
            {
                Rect rect = new Rect(e.mousePosition.x, e.mousePosition.y - 50, 100, 100);
                GUIContent[] contents = new GUIContent[] { new GUIContent("Test1"), new GUIContent("XFKT/Test2") };
                EditorUtility.DisplayCustomMenu(rect, contents, -1, (data, opt, select) => {
                    Debug.LogFormat("data: {0}, opt: {1}, select: {2}, value: {3}", data, opt, select, opt[select]);
                }, null);

                e.Use();
            }
        };
    }
}
image.png
三、拓展Project视图
using UnityEngine;
using UnityEditor;

public class TestProjectMenu : MonoBehaviour
{
    [MenuItem("Assets/Test1")]
    static void Test1()
    {
        Debug.Log("proect test1");
    }

    //2栏的时候,需要点击第二栏
    
    [InitializeOnLoadMethod]
    static void InitializeOnLoad()
    {
        EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
        {

            if (Selection.activeObject != null)
            {
                string active_guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject));
                if (active_guid == guid &&
                    !string.IsNullOrEmpty(active_guid))
                {
                    rect.x = rect.width - 100;
                    rect.width = 100;
                    if (GUI.Button(rect, "Delete"))
                    {
                        Debug.Log("project delete");
                        AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(Selection.activeObject));
                    }
                }

            }
        };
    }
    
}
image.png
四、拓展Project视图-事件监听
using UnityEditor;
using UnityEngine;

public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
    //创建资源
    public static void OnWillCreateAsset(string path)
    {
        Debug.LogFormat("创建资源:{0}", path);
    }

    //保存资源
    public static string[] OnWillSaveAssets(string[] paths)
    {
        for (int i = 0; i < paths.Length; I++)
        {
            Debug.LogFormat("保存资源:{0}", paths[I]);
        }

        return paths;
    }

    //移动资源
    public static AssetMoveResult OnWillMoveAsset(string oldPath, string newPath)
    {
        Debug.LogFormat("从{0}移动到{1}", oldPath, newPath);
        return AssetMoveResult.DidNotMove;
    }

    //删除资源
    public static AssetDeleteResult OnWillDeleteAsset(string path, RemoveAssetOptions options)
    {
        Debug.LogFormat("删除资源{0}, option:{1}", path, options);
        return AssetDeleteResult.DidNotDelete;
    }

    //监听资源改变
    [InitializeOnLoadMethod]
    static void InitOnLoad()
    {
        EditorApplication.projectChanged += () => {
            Debug.Log("asset change!");
        };
    }
}
五、拓展Hierarchy视图
using UnityEngine;
using UnityEditor;

public class TestHierarchy : MonoBehaviour
{
    //添加自定义菜单
    [MenuItem("GameObject/Test2")]
    static void Test2()
    {
        Debug.Log("test2");
    }

    //添加删除功能
    [InitializeOnLoadMethod]
    static void InitializeOnLoad()
    {
        EditorApplication.hierarchyWindowItemOnGUI += (instanceId, rect) =>
        {

            if (Selection.activeObject != null &&
                Selection.activeObject.GetInstanceID() == instanceId)
            {
                rect.x = rect.width - 50;
                rect.width = 100;
                if (GUI.Button(rect, "Delete"))
                {
                    Debug.Log("hierarchy delete");
                    DestroyImmediate(Selection.activeObject);
                }

            }
        };
    }
}
image.png
六、拓展Inspector视图
using UnityEditor;
using UnityEngine;


[CustomEditor(typeof(Camera))]
public class TestInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if (GUILayout.Button("Test1"))
        {
            Debug.Log("camera test1");
            Camera camera = this.target as Camera;
            if (camera != null)
            {
                camera.depth++;
            }
        }
    }
}
image.png
七、拓展Inspector Context菜单
using UnityEngine;
using UnityEditor;

public class TestInspectorContext : MonoBehaviour
{
    [MenuItem("CONTEXT/Transform/SetPosition")]
    static void SetPosition()
    {
        Debug.Log("SetPosition");
    }

    [MenuItem("CONTEXT/Transform/SetPosition1")]
    static void SetPosition1(MenuCommand command)
    {
        Transform transform = command.context as Transform;
        transform.position += Vector3.one;
    }
}
image.png

参考教程:https://www.bilibili.com/video/BV1kh411Q79K/?p=7&spm_id_from=pageDriver&vd_source=6c44e5fc749096dec7c95fb327b8325a

相关文章

网友评论

      本文标题:Unity 拓展编辑器

      本文链接:https://www.haomeiwen.com/subject/bmkcartx.html