学习笔记:unity 拓展Inspector视图

一、拓展源生组件

可以在摄像机组件最上面添加一个拓展按钮,并且只能在最上面和最下面添加不能再中间添加
在这里插入图片描述
代码:

using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Camera))]//自定义编辑器

public class Script_03_09 : Editor
{
    
    
    public override void OnInspectorGUI()//重写方法
    {
    
    
        //public static bool Button (GUIContent content, GUIStyle style, params GUILayoutOption[] options);
        //text 要在按钮上显示的文本。
        //image 要在按钮上显示的 Texture。
        //content	该按钮的文本、图像和工具提示。
        //style	要使用的样式。如果省略,则使用当前 GUISkin 的 button 样式
        //options	(可选)一个布局选项列表,用于指定额外的布局属性。此处传递的任何值都将覆盖 style 定义的设置。
        if (GUILayout.Button("拓展按钮"))
        {
    
    

        }
        base.OnInspectorGUI();//是否绘制父类的原有元素
    }
}

二、拓展继承组件

1.使用与上面相同的方法

using UnityEngine;
using UnityEditor;
using System.Reflection;
[CustomEditor(typeof(Transform))]
public class Script_03_10 : Editor
{
    
    
    public override void OnInspectorGUI()
    {
    
    
        if (GUILayout.Button("拓展按钮"))
        {
    
    

        }
        base.OnInspectorGUI();
    }

}

使用这种方式会使面版变得非常丑陋
在这里插入图片描述

2.使用c#反射方式

如果你希望在拓展面版后还保持原有的布局,可以使用这个方法

using UnityEngine;
using UnityEditor;
using System.Reflection;
[CustomEditor(typeof(Transform))]
public class Script_03_10 : Editor
{
    
    
   
    public Editor m_Editor;
    private void OnEnable()
    {
    
    
        //Editor.CreateEditor 为 targetObject 或 targetObjects 创建自定义编辑器。
        //Assembly.GetAssembly 获取在其中定义指定类型的当前加载的程序集。
        m_Editor = Editor.CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector", true));
    }

    public override void OnInspectorGUI()
    {
    
    
        if (GUILayout.Button("拓展按钮"))
        {
    
    

        }
        //调用系统绘制方法
        m_Editor.OnInspectorGUI();
        // base.OnInspectorGUI();
    }
}

在这里插入图片描述

三、组件不可编辑

unity中我们可以让组件处于不可编辑状态

1、单个组件禁止

这里我们将Transform原有组件禁止掉,但不影响上下两个拓展按钮
在这里插入图片描述
代码示例:

using UnityEngine;
using UnityEditor;
using System.Reflection;

[CustomEditor(typeof(Transform))]
public class Script_03_11 : Editor
{
    
    
    private Editor m_Editor;
    void OnEnable()
    {
    
    
        //Editor.CreateEditor 为 targetObject 或 targetObjects 创建自定义编辑器。
        //Assembly.GetAssembly 获取在其中定义指定类型的当前加载的程序集。
        m_Editor = Editor.CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector", true));
    }

    public override void OnInspectorGUI()//实现此函数以创建自定义检视面板。
    {
    
    

        if (GUILayout.Button("拓展按钮上"))
        {
    
    

        }
        GUI.enabled = false;//设置组件禁用状态
        m_Editor.OnInspectorGUI();//绘制原有信息 这代码里指position rotation scale这几栏
        GUI.enabled = true;//启用
        if (GUILayout.Button("拓展按钮下"))
        {
    
    

        }

    }
}

多个组件禁止

我们可以拓展Hierarchy视图的菜单键,对选定对象同一禁止
在这里插入图片描述
在这里插入图片描述
代码示例:

using UnityEditor;
using UnityEngine;

public class Script_03_12 
{
    
    
    [MenuItem("GameObject/3D Object/Lock/Lock",false,0)]//路径
    static  void Lock()
    {
    
    
        if (Selection.gameObjects != null)//是否选定对象
        {
    
    
            foreach (var gameObject in Selection.gameObjects)//遍历对象
            {
    
    
                gameObject.GetComponent<Transform>().hideFlags = HideFlags.NotEditable;//单个组件不可编辑
                //gameObject.hideFlags = HideFlags.NotEditable;//选定的物体所有组件不可编辑  
            }
        }
    }
    [MenuItem("GameObject/3D Object/Lock/UnLock",false,0)]
    static void UnLock()
    {
    
    
        if (Selection.gameObjects!=null)
        {
    
    
            foreach (var gameObject in Selection.gameObjects)
            {
    
    
                gameObject.hideFlags = HideFlags.None;
            }
        }
    }
}

HideFlags可以使用按位或(|)同时保持多个属性
HideFlags.None:清除状态
HideFlags.DontSave: 设置对象不会保存(仅编辑模式下使用,运行时剔除掉)
HideFlags.DontSaveInBuild: 设置对象构建后不会被保存
HideFlags.DontSaveInEditor:设置对象编辑模式下不会被保存
HideFlags.DontUnloadUnusedAsset: 设置对象不会被 Resources.UnloadUnused-Assets()卸载无用资源时卸掉
HideFlags.HideAndDontSave: 设置对象隐藏,并且不会被保存
HideFlags.HideInInspector: 设置对象在控制面板视图中隐藏
HideFlags.NotEditable:设置对象不可被编辑

4、Context菜单拓展

选择组件鼠标右击可以弹出Context菜单,我们可以在原有的菜单上拓展出新的菜单栏
在这里插入图片描述
代码

using UnityEditor;
using UnityEngine;

public class Script_03_13
{
    
             //context菜单/transform组件/拓展对象名  
    [MenuItem("CONTEXT/Transform/New Context 1")]//路径
    static void NewContext1(MenuCommand command)
    {
    
    
        Debug.Log(command.context.name);//打印组件所属名字
    }
    [MenuItem("CONTEXT/Transform/New Context 2")]
    static void NewContext2(MenuCommand command)
    {
    
    
        Debug.Log(command.context.name);
    }
}

其中[MenuItem(“CONTEXT/Transform/New Context 1”)]表示菜单拓展在Transform组件上,如果想拓展到其他组件上,如摄像机,只需要将Transform改成Camera即可

猜你喜欢

转载自blog.csdn.net/lian_hang/article/details/122208847