• 【Unity】编辑器扩展-03-拓展Inspector视图


    【Unity】编辑器扩展-03-拓展Inspector视图


    拓展原生组件

    CustomEditor()表示自定义哪个组件,OnInspectorGUI()可以对该组件元素进行绘制,base.OnInspectorGUI()表示绘制父类原有元素

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(Camera))]
    public class Script_08 : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            if (GUILayout.Button("click"))
            {
                Debug.Log("click");
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    拓展继承组件

    如果按照之前的方式直接拓展,则会导致Inspector界面绘制发生变化,但我们希望拓展面板后仍然保持原有绘制方式。

    Unity将大量的Editor绘制方法封装在内部的DLL文件中,开发者无法调用。

    因此我们需要使用C#反射的方式调用内部未公开的方法

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    using System.Reflection;
    
    [CustomEditor(typeof(Transform))]
    public class Script_09 : Editor
    {
        private Editor m_Editor;
        void OnEnable()
        {
            m_Editor = Editor.CreateEditor(target,Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector",true));
        }
        public override void OnInspectorGUI()
        {
            m_Editor.OnInspectorGUI();
            if (GUILayout.Button("click"))
            {
    
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    组件不可编辑

    在这里插入图片描述

    [CustomEditor(typeof(Transform))]
    public class Script_09 : Editor
    {
        private Editor m_Editor;
        void OnEnable()
        {
            m_Editor = Editor.CreateEditor(target,Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector",true));
        }
        public override void OnInspectorGUI()
        {
            GUI.enabled = false;
            m_Editor.OnInspectorGUI();
            GUI.enabled = true;
            if (GUILayout.Button("click"))
            {
    
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    自定义锁功能菜单

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    
    public class Script_10 : MonoBehaviour
    {
        [MenuItem("GameObject/3D Object/Lock/Lock",false,0)]
        static void Lock()
        {
            if (Selection.gameObjects != null)
            {
                foreach (var gameObject in Selection.gameObjects)
                {
                    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;
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    HideFlags(它可以使用位运算)

    • HideFlags.None; 清楚状态
    • HideFlags.DontSave;设置对象不会被保存(仅编辑模式下)
    • HideFlags.DontSaveInBuild;设置对象构建后不会被保存
    • HideFlags.DontSaveInEditor;设置对象编辑模式下不会被保存
    • HideFlags.DontUnloadUnusedAsset;设置对象不会被Resources.UnloadUnusedAssets()卸载无用资源时卸掉
    • HideFlags.HideAndDontSave;设置对象隐藏,并且不会被保存
    • HideFlags.HideInHierarchy;设置对象在层次视图中隐藏
    • HideFlags.HideInInspector;设置对象在控制面板视图中隐藏
    • HideFlags.NotEditable;设置对象不可被编辑

    Context菜单

    前缀菜单在这里插入图片描述
    CONTEXT

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    
    public class Script_11
    {
        [MenuItem("CONTEXT/Transform/new Context 1")]
        public static void NewContext1(MenuCommand menuCommand)
        {
            Debug.Log(menuCommand.context.name);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们还可可以通过context来访问脚本本身。

    此外,通过宏定义标签UNITY_EDITOR表示这段代码只会在Editor模式下执行,发布后将会被剔除

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    public class Script_11 : MonoBehaviour
    {
        string number;
    #if UNITY_EDITOR
        [MenuItem("CONTEXT/Script_11/new Context 1")]
        public static void NewContext1(MenuCommand menuCommand)
        {
            //访问脚本变量
            Script_11 script_11 = menuCommand.context as Script_11;
            script_11.number = "10";
            Debug.Log(menuCommand.context.name);
        }
    #endif
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    NVMe SSD 学习总结:04 为什么NVME的SSD越来越受欢迎?
    学校档案管理系统软件-学校数字档案室解决方案
    【wps】记录
    mysq基础语句+高级操作(学这篇就够了)
    排查问题的方法论(适用于任何多方合作中产生的问题排查)
    Qt 5.15集成Crypto++ 8.8.0(MSVC 2019)笔记
    简单封装一个易拓展的Dialog
    Django学习笔记二:数据库配置
    BERT应用——文本相似度计算
    从零开始搭建前端脚手架(三)-- [动态添加、删除模板]
  • 原文地址:https://blog.csdn.net/qq_52324195/article/details/126040382