【Unity编辑器】拓展Inspector视图

news2024/11/25 2:31:43

目录

1、拓展源生组件

2、拓展继承组件

3、组件不可编辑

4、Context菜单


1、拓展源生组件

摄像机就是典型的源生组件。它的局限性就是拓展组件只能加在源生组件的最上面或者最下面,不能插在中间,不过这样也就够了

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Camera))]
public class S3_拓展源生组件 : Editor
{
    public override void OnInspectorGUI()
    {
        if (GUILayout.Button("拓展按钮"))
        {}
        base.OnInspectorGUI();
    }
}

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

2、拓展继承组件

Unity大量的Editor绘制方法封装在内部DLL文件里,开发者无法调用它的方法。可以使用C#反射的方式调用内部未公开的方法。通过拓展Transform组件,现在就可以保留原有的绘制方式

通过反射先得到UnityEditor.TransformInspector对象,然后就可以调用它内部的OnInspectorGUI()方法

using UnityEngine;
using UnityEditor;
using System.Reflection;

[CustomEditor(typeof(Transform))]
public class S3_拓展继承组件 : Editor
{
    private Editor m_Editor;
    void OnEnable()
    {
        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();
    }
}

上面重写了OnInspectorGUI()方法。使用GUILayout.Button绘制了自定义的按钮元素,接着调用m_Editor.OnInspectorGUI()绘制Transform原有面板信息,这样我们拓展的按钮就会显示在Transform面板上方

现在每个Transform组件下都有一个拓展按钮

3、组件不可编辑

将Transform组件的原始功能禁掉(灰色表示不可编辑),而不影响我们上下拓展的两个按钮

using UnityEngine;
using UnityEditor;
using System.Reflection;

[CustomEditor(typeof(Transform))]
public class S3_组件不可编辑 : Editor
{
    private Editor m_Editor;
    void OnEnable()
    {
        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();
        //结束禁止
        GUI.enabled = true;
        if (GUILayout.Button("拓展按钮下"))
        {

        }
    }
}

禁用整个组件

从右键菜单中选择3D Object->Lock->Lock(锁定)或者Unlock(解锁)

原理就是设置游戏对象的hideFlags。也可以不设置游戏对象的hideFlags,也可以单独给某个组件设置hideFlags,这样只会影响到一个组件并非全部。

 [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 , 1)]
    static void UnLock()
    {
        if(Selection.gameObjects != null )
        {
            foreach(var gameObject in Selection.gameObjects)
            {
                gameObject.hideFlags = HideFlags.None;
            }
        }
    }

 

  • HideFlags.None:清除状态

  • HideFlags.DontSave:设置对象不会被保存(仅编辑模式下使用,运行时剔除掉)

  • HideFlags.DontSaveInBuild:设置对象构建后不会被保存

  • HideFlags.DontSaveInEditor:设置对象编辑模式下不会被保存

  • HideFlags.DontUnloadUnusedAsset:设置对象不会被Resources.UnloadUnused-Assets()卸载无用资源时卸掉

  • HideFlags.HideAndDontSave:设置对象隐藏,并且不会被保存

  • HideFlags.HideInHierarchy:设置对象在层次视图中隐藏

  • HideFlags.HideInInspector:设置对象在控制面板视图中隐藏

  • HideFlags.NotEditable:设置对象不可被编辑

4、Context菜单

using UnityEngine;
using UnityEditor;

public class S3_4Context菜单 
{
    [MenuItem("CONTEXT/Transform/New Context 1")]
    public static void NewContext1(MenuCommand command)
    {
        Debug.Log(command.context.name);
    }
    
    [MenuItem("CONTEXT/Transform/New Context 2")]
    public static void NewContext2(MenuCommand command)
    {
        Debug.Log(command.context.name);
    }
}

[MenuItem("CONTEXT/Transform/New Context 1")]表示将新菜单扩展在Transform组件上。如果想给所有组件都添加菜单栏,这里改成Component即可

以上设置也可以应用在自己的脚本中,在代码中可以通过MenuCommand来获取脚本对象,从而访问脚本中的变量。

#if UNITY_EDITOR    //表示这段代码会在Editor模式下进行,发布后将被剔除掉
using UnityEditor;
#endif
using UnityEngine;

public class tests : MonoBehaviour
{
    public string contextName;
#if UNITY_EDITOR
    [MenuItem("CONTEXT/tests/New Context 1")]
    public static void NewContext2(MenuCommand command)
    {
        tests script = (command.context as tests);
        script.contextName = "hello world";
    }
#endif
}

[ContextMenu("Remove Component")]
    void RemoveComponent()  //重写删除组件的按钮
    {
        Debug.Log("RemoveComponent");
        //等一帧后再删除自己
        UnityEditor.EditorApplication.delayCall = delegate ()
        {
            DestroyImmediate(this);
        };
    }

 编辑情况下的代码可能会出现问题。比如DestroyImme(this)删除自己的代码时,会触发引擎底层的一个错误,不过可以用UnityEditor.EditorApplication.delayCall来延迟一帧调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试之Jmeter+Ant+Jenkins接口自动化测试平台

目录 平台简介 环境准备 Jenkins简介 下载与安装 平台搭建 依赖文件配置 build.xml配置 Ant构建 阿里大佬倾情演绎,3天让你学会Jmeter接口测试,学不会算我输_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q84y1K7bK/?spm_id_from333.99…

如何设置渗透测试实验室

导语:在本文中,我将介绍设置渗透实验室的最快方法。在开始下载和安装之前,必须确保你使用的计算机符合某些渗透测试的要求,这可以确保你可以一次运行多个虚拟机而不会出现任何问题。 在本文中,我将介绍设置渗透实验室的…

Python | 人脸识别系统 — 用户操作

本博客为人脸识别系统的摄像头画面展示代码解释 人脸识别系统博客汇总:人脸识别系统-博客索引 项目GitHub地址: 注意:阅读本博客前请先参考以下博客 工具安装、环境配置:人脸识别系统-简介 UI界面设计:人脸识别系统-UI…

错题汇总03

1.以下对二维数组a进行正确初始化的语句是 A int a[2][]{{0,1,2},{3,4,5}} B int a[][3]{{0,1,2},{3,4,5}} C int a[2][4]{{0,1,2},{3,4},{5}}; D int a[][3]{{0,,2},{},{3,4,5}} A数组列不能省略 C数组越界 D数组初始化每一行必须连续初始化 2.能把函数处理结果的二个数据…

msvcr110.dll丢失的解决方法-计算机中丢失msvcr110.dll怎么办?

看到您遇到了msvcr110.dll丢失的问题,这是由于您的计算机缺少必要的系统文件导致的。为了解决这个问题,您可以尝试以下几个步骤方法:就可以轻松解决msvcr110.dll丢失的问题。 msvcr110.dll修复方法一 重新安装Microsoft Visual C msvcr110.d…

windows安装node.js和vue3.x

目录 下载并安装node配置环境变量配置淘宝镜像源安装webpack全局打包工具安装cnpm安装vue-cli 3.xcnpm问题警告的解决办法 下载并安装node 1,下载nodejs 直接从node.js官网下载:https://nodejs.org/en/download 根据自己电脑的版本选择32位或者64位&…

建筑诊断用热像仪应用-flir T530红外热成像仪

建筑诊断用热像仪应用-flir T530红外热成像仪 建筑诊断领域热成像技术 隔热性能不良或隔热性能不足、潮气、建筑物外表面裂缝及不达标工程往往使住宅用建筑及商用建筑业主蒙受巨大的 经济损失。而红外热像仪却能够帮助您快速察觉有待改进的能效问题 建筑诊断用热像仪应用|带电…

两分钟成为 ChatGPT 国内高手【不要再拿ChatGPT当百度用了】

不要再问ChatGPT那些问百度的问题了,有更进阶的用法 更高效的编写prompts,以便ChatGPT给出更精准的回答 但是需要注意的是:国内现在根本没有GPT-4使用,但凡是说有GPT-4的都是骗子。 GPT 可以写文章,可以写诗&#x…

全方位揭秘!大数据从0到1的完美落地之运行流程和分片机制

一个完整的MapReduce程序在分布式运行时有三类实例进程: MRAppMaster: 负责整个程序的过程调度及状态协调MapTask: 负责Map阶段的整个数据处理流程ReduceTask: 负责Reduce阶段的整个数据处理流程 当一个作业提交后(mr程序启动),大概流程如下&#xff1…

TouchGFX开发(2)----触摸屏幕组件点亮LED

TouchGFX开发.1----安装软件 概述创建 TouchGFX 项目添加图片组件添加按钮interactions 设置生成代码打开文件配置LED触摸点亮LED演示效果 概述 了解如何使用 TouchGFX 配置屏幕,添加触摸按钮,并通过按钮控制板载 LED 的状态。 创建 TouchGFX 项目 打…

详解map、set、multimap、multiset的使用

✍作者:阿润菜菜 📖专栏:C 目录 前言set、multiset的使用1. set2. multiset3. 什么时候应该使用multiset而不是set map、multimap的使用1.map2.multimap3.什么时候应该使用multimap而不是map 前言 map、set、multimap、multiset是C STL中的四…

如何把握未来增长话语权,全链路数字化运营有解

近年来,良品铺子、元气森林、蔚来等迅速成为市场中现象级的品牌,它们往往在很短时间内就发展成市场的生力军和消费者青睐的对象。 仔细研究背后,这些新生品牌的崛起,核心商业逻辑跟以往品牌大为不同,明显更“懂”新生…

基于微信小程序的酒店预定管理系统设计与实现

第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…

Java——和为S的连续正数序列

题目链接 牛客网在线oj题——和为S的连续正数序列 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为…

用Jmeter进行接口自动化测试的工作流程你知道吗?

目录 测试流程 接口测试相关文档管理规范 接口测试要点 测试流程 在测试负责人接受到测试任务后,应该按照以下流程规范完成测试工作。 2.1 测试需求分析 产品开发负责人在完成某产品功能的接口文档编写后,在核对无误后下发给对应的接口测试负责人…

word@论文后期优化和完善工作@页眉页脚页码@配置并导出pdf

文章目录 论文结构例 目录操作页眉页脚页眉样式检查所有页面的页眉添加横线 页码从第二页(封面后的一页)开始用罗马数字标页码 word导出pdf等其他格式额外配置带独立书签和目录打印pdf 最后的优化 论文结构 一篇规范的论文应该大致包括以下部分: 标题页&#xff1…

JavaScript全解析——canvas 入门(下)

canvas 线段两端的样式 ●canvas 中, 是可以设置线段两端的样子的 ●我们先来画三个平行线 // 0. 获取到页面上的 canvas 标签元素节点 const canvasEle document.querySelector(#canvas)// 1. 获取当前这个画布的工具箱 const ctx canvasEle.getContext(2d)// 2. 开始绘制第…

webpack 5 实战(2)

二十一、babel-loader 使用 使用babel-loader对js文件进行处理,在lg.Webpack.js配置文件中配置js文件规则。 使用单独的插件进行转换 使用预设进行转换 使用babel.config.js配置文件进行babel配置 const path require(path) const CopyWebpackPlugin require(…

day12 IP协议与ethernet协议

目录 IP包头 IP网的意义 IP数据报的格式 IP数据报分片 以太网包头(链路层协议) IP包头 IP网的意义 当互联网上的主机进行通信时,就好像在一个网络上通信一样,看不见互联的各具体的网络异构细节; 如果在这种覆盖…

RabbitMQ 死信队列实现

// consumer处理成功后,通知broker删除队列中的消息,如果设置multipletrue,表示支持批量确认机制以减少网络流量 channel.basicAck(deliveryTag, multiple);// 拒绝deliveryTag对应的消息,第二个参数是否requeue,true则…