【Unity编辑器】拓展Hierarchy视图

news2024/10/5 12:44:49

目录

1、拓展菜单

2、拓展布局

3、重写菜单


1、拓展菜单

在Hierarchy视图中点击Create按钮,弹出的菜单My Create->Cube就是自定义拓展菜单

using UnityEngine;
using UnityEditor;

public class S2_拓展菜单 : MonoBehaviour
{
    [MenuItem("GameObject/My Create/Cube" , false , 0)]
    static void CreateCube()
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube);
    }
}

菜单中已经包含了系统默认的一些菜单项,我们拓展的原理就是重写MenuItem的自定义路径。Create按钮下的菜单项都在GameOject路径下面,所以只要开头是GameObject/xx/xx,均可自由拓展。

2、拓展布局

选择不同的游戏对象后,在右侧可根据EditorGUI拓展出一组按钮,点击Unity图标后,在Console窗口中输入这个游戏对象。

工作原理就是监听EditorApplication.hierarchyWindowItemOnGUI渲染回调

using UnityEditor;
using UnityEngine;

public class S2_拓展布局 : MonoBehaviour
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        EditorApplication.hierarchyWindowItemOnGUI = delegate (int instanceID, Rect selectionRect)
        {
            //在Hierarchy视图中选择一个资源
            if (Selection.activeObject && instanceID == Selection.activeObject.GetInstanceID())
            {
                //设置拓展按钮区域
                float width = 40f;
                float height = 20f;
                selectionRect.x += (selectionRect.width - width);
                selectionRect.width = width;
                selectionRect.height = height;

                //点击事件
                if (GUI.Button(selectionRect, AssetDatabase.LoadAssetAtPath<Texture>("Assets/unity.png")))
                {
                    Debug.LogFormat("click:{0}", Selection.activeObject.name);
                }
            }
        };
    }
}

在代码中实现EditorApplication.hierarchyWindowItemOnGUI委托,就可以重写Hierarchy视图了。

这里使用GUI.Button来绘制自定义按钮,点击按钮可监听事件。

3、重写菜单

彻底重写菜单

工作原理:监听点击的事件,打开一个新的菜单窗口

使用Event.current来获取当前的事件。当监听到鼠标抬起的事件后,并且满足游戏对象的选中状态,开始执行自定义事件。

EditorUtility.DisplayPopupMenu用于弹出自定义菜单,Event.current.Use()的含义是不再执行原有的操作,所以就实现了重写菜单。

using UnityEngine;
using UnityEditor;
using GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer;

public class S2_重写菜单
{
    [MenuItem("Window/Test/自定义工具")]
    static void Test()
    {

    }

    [MenuItem("Window/Test/自定义2")]
    static void Test1()
    {

    }

    [MenuItem("Window/Test/自定义3/MOMO")]
    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 && Event.current.type <= EventType.MouseUp) {
            GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;

            //这里可以判断selectedGameObject的条件
            if (selectedGameObject)
            {
                Vector2 mousePosition = Event.current.mousePosition;

                EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "Window/Test", null);	//用于弹出自定义菜单
                Event.current.Use();	//不再执行原有操作,所以实现了重写
            }
        }
    }
}

此外Hierarchy视图还可以重写系统自带的菜单行为。例如:我觉得Image组件不好用,可以复写它的行为。

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

下面就是复写Image组件的逻辑,让RaycastTarget默认不勾选

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

public class S2_重写组件设置
{
    [MenuItem("GameObject/UI/Image")]
    static void CreatImage()
    {
        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;
            }
        }
    }
}

由于重写了菜单,所以需要通过使用脚本自行创建Image对象和组件。接着,获取到image组件对象,直接设置它的raycastTarget属性即可。

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

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

相关文章

Leetcode268. 丢失的数字

Every day a leetcode 题目来源&#xff1a;268. 丢失的数字 解法1&#xff1a;排序 代码&#xff1a; /** lc appleetcode.cn id268 langcpp** [268] 丢失的数字*/// lc codestart class Solution { public:int missingNumber(vector<int> &nums){int n nums.s…

分数傅里叶变换、小波变换和自适应神经网络

与普通的傅立叶变换&#xff0c;即 1 阶的分数阶傅立叶变换不同&#xff0c;分数阶傅立叶变换&#xff08;p ≠ 1&#xff09;提取的特征同时结合了原始图像的空间和频率特性。 分数傅里叶变换图像是介于原始图像和全傅里叶变换图像之间的东西。 Vander Lugt 相关器可以根据傅…

Playwright之初体验

参考文件 官方文档&#xff1a;https://playwright.dev/docs/intro GitHub链接&#xff1a;https://github.com/microsoft/playwright-python Playwright简介 Playwright Test是专门为满足端到端测试的需求而创建的。Playwright支持所有现代搜索引擎&#xff0c;包括Chrome、…

linux基础简介(一)

1.Linux内核 ​ Linux 系统从应用角度来看&#xff0c;分为内核空间和用户空间两个部分。内核空间是 Linux 操作系统的主要部分&#xff0c;但是仅有内核的操作系统是不能完成用户任务的。丰富并且功能强大的应用程序包是一个操作系统成功的必要件。 ​ Linux 的内核主要由 5…

Android Framework基础面试篇~

在Android应用开发面试中&#xff0c;针对Framework的问题是常被考察的。以下是一些常见的Framework金典面试题目及其详解&#xff1a; 1. 什么是Android应用生命周期&#xff1f;你能描述一下它包含哪几个阶段吗&#xff1f; Android应用生命周期指的是应用从启动到关闭的整…

[oeasy]python0048_注释_comment_设置默认编码格式

注释Comment 回忆上次内容 使用了版本控制 git 制作备份进行回滚 尝试了 嵌套的控制结构 层层 控制 不过 除非 到不得以尽量不要 太多层次的嵌套 这样 从顶到底含义 明确而且 还扁平 扁平 也能 含义明确 还可以 做点什么&#xff1f; 让程序含义 更加明确呢&#xff1f;&…

数据结构学习分享之栈和队列详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:数据结构学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你了解更多数据结构的知识   &#x1f51d;&#x1f51d; 数据结构第五课 1. 前言&a…

文心一言 VS chatgpt (14)-- 算法导论3.2 2~3题

二、证明等式&#xff08;3.16&#xff09;&#xff1a;a ^ {\log_b c} c ^ {\log_b a}。 文心一言&#xff1a; chatgpt&#xff1a; 我们需要证明的等式为&#xff1a; a log ⁡ b c c log ⁡ b a a^{\log_b c} c^{\log_b a} alogb​cclogb​a。 首先&#xff0c;将 l…

时序预测 | MATLAB实现ARIMA-BP组合模型时间序列预测

时序预测 | MATLAB实现ARIMA-BP组合模型时间序列预测 目录 时序预测 | MATLAB实现ARIMA-BP组合模型时间序列预测预测效果基本介绍模型原理程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现ARIMA-BP组合模型时间序列预测。 模型原理 ARIMA-BP组合模型是一种常用的时间…

2023年第二届材料科学与工程国际会议(CoMSE 2023) | IOP-JPCS出版

会议简介 Brief Introduction 2023年第二届材料科学与工程国际会议(CoMSE 2023) 会议时间&#xff1a;2023年7月21日-23日 召开地点&#xff1a;中国泰州 大会官网&#xff1a;www.icomse.org CoMSE 2023由四川大学、华南理工大学亚热带建筑科学国家重点实验室、国际电气电子和…

PCL学习四:RANSAC-随机采样一致性

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 1. RANSAC 概念及作用 RANSAC&#xff08;Random Sample Consensus&#xff0c;随机采样一致性&#xff09;是一种迭代方法&#xff0c;作用&#xff1a;从包含异常值的一组数据中估计数学模型的参数&#xff0c;RANSAC 算…

AIGC:【LLM(一)】——LoRA微调加速技术

文章目录 一.微调方法1.1 Instruct微调1.2 LoRA微调 二.LoRA原理三.LoRA使用 一.微调方法 Instruct微调和LoRA微调是两种不同的技术。 1.1 Instruct微调 Instruct微调是指在深度神经网络训练过程中调整模型参数的过程&#xff0c;以优化模型的性能。在微调过程中&#xff0c…

Flutter——最详细(TextField)使用教程

TextField简介 文本输入框&#xff0c;拥有复杂的属性。可指定控制器、文字样式、装饰线、行数限制、游标样式等。监听输入框变动事件。 使用场景&#xff1a; 搜索框&#xff0c;输入账号密码等 属性作用controller输入框监听器decoration输入框装饰属性textAlign内容对齐方式…

UE5.1.1 C++ 从0开始 (1.人物移动)

开个天坑&#xff0c;UE5.1.1的移动代码做了一个大更新&#xff0c;对于我这种万年蓝图然后正在转C的人来说可以说是个挑战也可以说是个更方便我去工作的一个点。同时斯坦福大学的那个教程的开头几个章节就不适用了&#xff0c;对于学习UE5.1.1的同学来说。所以我这里会尽量每天…

[230506] 2021年托福阅读真题第6篇|Water and Life on Mars|15:30~16:30|16:30~19:19

正确率&#xff1a;6/10 ​​​​​​​ Water and Life on Mars Paragraph 1: The question of life on Mars depends heavily on the characteristics of its air and water. Mars has a relatively thin and dry atmosphere, with a high percentage of carbon dioxide com…

想转行大数据,需要学习什么?

Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联网企业都在使用 Python 完成各种各样的工作&#xff0…

Spark大数据处理讲课笔记3.7 Spark任务调度

文章目录 零、本节学习目标一、有向无环图&#xff08;一&#xff09;DAG概念&#xff08;二&#xff09;实例讲解 二、Stage划分依据&#xff08;一&#xff09;两阶段案例&#xff08;二&#xff09;三阶段案例 三、RDD在Spark中的运行流程&#xff08;一&#xff09;RDD Obj…

buuctf7

目录 Crypto MD5 Url编码 看我回旋踢 web [极客大挑战 2019]BuyFlag​ [BJDCTF2020]Easy MD5 Crypto MD5 1.下载文件 2.md5在线解密 3.外包flag Url编码 使用url在线解码 看我回旋踢 下载&#xff0c;得到这串字符&#xff0c;搜一下synt编码 看到使用凯撒密码&#x…

2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。

2023-05-04&#xff1a;用go语言重写ffmpeg的scaling_video.c示例&#xff0c;用于实现视频缩放&#xff08;Scaling&#xff09;功能。 答案2023-05-04&#xff1a; 这段代码实现了使用 libswscale 库进行视频缩放的功能。下面是程序的主要流程&#xff1a; 1.获取命令行参…

唐书计组第三章总线部分课后习题和解答

我自己的一些总结 总线周期分为哪四个阶段 申请分配阶段寻址阶段存数阶段结束阶段 总线分为哪四种通信方式 同步通信异步通信半同步通信分离式通信 总线有哪几种判优方式 链式查询 计数器定时查询 独立请求方式 计算数据传输率 3.14设总线的时钟频率为8MHz,一个总线周期…