【Unity】编辑器扩展-02-拓展Hierarchy视图

【Unity】编辑器扩展-02-拓展Hierarchy视图


拓展菜单

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Script_04 : MonoBehaviour
{
    //Hierarchy视图菜单本质上是窗体上的GameObject下的子菜单,只需要注意路径即可,同理之前的也是一样Project视图菜单是Asset的子菜单,如果没有已知路径就会自建新根菜单
    [MenuItem("GameObject/My Create/Cube",false,0)]
    static void CreatePlayer()
    {
        GameObject.Instantiate(Resources.Load("Prefabs/Cube"));
    }
}

拓展布局

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Script_05
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        EditorApplication.hierarchyWindowItemOnGUI += delegate (int instanceID,Rect selectionRect)
        {
            if (Selection.activeObject && instanceID == Selection.activeObject.GetInstanceID())
            {
                float width = 50f;
                float height = 15f;
                selectionRect.x += (selectionRect.width - width);
                selectionRect.width = width;
                selectionRect.height = height;
                if (GUI.Button(selectionRect, "click")) 
                {
                    Debug.LogFormat("click:{0}",Selection.activeObject.name);
                }
            }
        };
    }
}

重写菜单

在这里插入图片描述

我们已经知道了可以在原有菜单的基础上进行扩展,那么我们也可以完全抛弃原有菜单,完全自定义自己的菜单。

基本原理就是判断情况并陈列自己的菜单

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Script_06
{
    [MenuItem("Window/Test/Player")]
    static void Test()
    {

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

    }
    [MenuItem("Window/Test/UI")]
    static void Test2()
    {

    }
    [InitializeOnLoadMethod]
    static void StartInitializeOnLoadMethod()
    {
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
    }

    static void OnHierarchyGUI(int instanceID,Rect selectionRect)
    {
        if (Event.current != null && selectionRect.Contains(Event.current.mousePosition) && Event.current.button == 1) 
        {
            GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
            if (selectedGameObject)
            {
                Vector2 mousePosition = Event.current.mousePosition;
                EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x,mousePosition.y,0,0),"Window/Test",null);
                Event.current.Use();
            }

        }
    }
}

覆盖菜单

我们还可以重写系统自带的菜单行为。例如,我觉得Unity创建的Image组件不好,那么可以复写他的行为。

创建Image组件时,会自动勾选RaycastTarget。如果图片不需要处理点击事件,则带来了额外开销。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

public class Script_07
{
    [MenuItem("GameObject/UI/Image")]
    static void CreateImage()
    {
        if (Selection.activeTransform)
        {
            if (Selection.activeTransform.GetComponentInParent<Canvas>())
            {
                Image image = new GameObject("Image").AddComponent<Image>();
                image.raycastTarget = false;
                image.transform.SetParent(Selection.activeTransform,false);
                Selection.activeTransform = image.transform;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52324195/article/details/126040353