学习笔记:unity拓展Hierarchy视图

一、拓展菜单

 //Hierarchy视图拓展
    [MenuItem("GameObject/My Create/Cube",false,0)]
    static void CreateCube()
    {
    
    
        GameObject.CreatePrimitive(PrimitiveType.Cube);//建立立方体
    }
拓展原理是重写MenuItem的自定义路径,Create按钮下的菜单项都在GameObject下,所以只要开头是GameObject/xxx/xxx,均可自由拓展。

二、拓展布局

[InitializeOnEnterPlayMode]//用于在进入播放模式时重置编辑器类中的静态字段,而无需重新加载域。
    static void InitializeOnEnterPlayMode()
    {
    
    
        //Hierarchy 窗口中每个可见列表项的 OnGUI 事件的委托。
        EditorApplication.hierarchyWindowItemOnGUI = delegate (int instanceID, Rect selectionRect)
        {
    
    
            //在Hierarchy视图中选择一个资源
            //Selection.activeGameObject 返回处于活动状态的游戏对象 
            if (Selection.activeGameObject && instanceID == Selection.activeGameObject.GetInstanceID())
            {
    
    
                float width = 50f;
                float height = 20f;
                selectionRect.x += (selectionRect.width - width);//左边界位置
                selectionRect.width = width;//宽度
                selectionRect.height = height;//高度
                
                //public static bool Button (Rect position, string text);
                //position 屏幕上用于按钮的矩形。
                //text	要在按钮上显示的文本。                						//⬇️路径下确保有图片
                if (GUI.Button(selectionRect, AssetDatabase.LoadAssetAtPath<Texture>("Assets/bufeng.jpg")))
                {
    
    //AssetDatabase.LoadAssetAtPath 返回给定路径 assetPath 下 type 类型的第一个资源对象。
                    Debug.LogFormat("click : {0}", Selection.activeGameObject.name);
                }
            }
        };
    }

代码中实现了EditorApplication.hierarchyWindowItemOnGUI 委托,就可以重写hierarchy视图了。
效果图如下:
在这里插入图片描述

三、重写菜单


    [MenuItem("Window/Test/yusong")]
    static void Test()
    {
    
    

    }
    [MenuItem("Window/Test/momo")]
    static void Test1()
    {
    
    

    }
    [MenuItem("Window/Test/测试/MOMO")]
    static void Test2()
    {
    
    

    }

    [InitializeOnLoadMethod]//允许在 Unity 加载时初始化编辑器类方法,而无需用户执行任何操作。
    static void StartInitializeOnLoadMethod()
    {
    
    
        //Hierarchy 窗口中每个可见列表项的 OnGUI 事件的委托。
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
    }

    static void OnHierarchyGUI(int instanceID, Rect selectionRect)
    {
    
    
        //Event.current 将被立即处理的当前事件。selectionRect.Contains 返回某个对象是否包含在当前选择中。EventType.MouseUp 释放了鼠标键。
        if (Event.current!=null && selectionRect.Contains(Event.current.mousePosition)&&Event.current.button==1 && Event.current.type<=EventType.MouseUp)//监听鼠标抬起事件
        {
    
      
            // EditorUtility.InstanceIDToObject 将实例 ID 转换为对对象的引用。
            GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
            if (selectedGameObject)
            {
    
    
                Vector2 mousePosition = Event.current.mousePosition;//鼠标坐在位置
                // Rect 由 X 和 Y 位置、宽度以及高度定义的 2D 矩形。EditorUtility.DisplayPopupMenu 显示弹出菜单。
                EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "Window/Test", null);//用于弹出自定义菜单
                Event.current.Use();
            }
        }
    }

Event.current获取当前事件,当监听到鼠标抬起事件并且满足游戏对象选中状态,则开始执行自定义事件。
EditorUtility.DisplayPopupMenu 用于弹出自定义菜单

猜你喜欢

转载自blog.csdn.net/lian_hang/article/details/122142541
今日推荐