当前位置: 首页 > news >正文

Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应

目录

  • 需求描述
  • 上代码
  • 打个赏吧

需求描述

现在有这样一个需求:

  • 在Hierarchy面板的对象上绘制按钮
  • 点击按钮,弹出菜单
  • 再点击菜单项目响应自定义操作
  • 在这里的响应主要是复制对象层级路路径
    看具体效果请看动图:
    请添加图片描述

注:

  • 核心是对EditorApplication.hierarchyWindowItemOnGUI委托的实现
  • 其它需求,可参考实现
  • 如是要要Project面板实现类似的功能:可以参考实现EditorApplication.hierarchyWindowItemOnGUI委托

上代码

/*********************************************** @author: anyuanlzh* @date: 2023-05-18* @des:  "Hierarchy面板"工具***********************************************/using System.Collections.Generic;
using UnityEditor;
using UnityEngine;[InitializeOnLoad]
public class HierarchyTabTool
{// 静态构造函数static HierarchyTabTool(){EditorApplication.hierarchyWindowItemOnGUI += HierarchyWindowItemOnGUI;}private static void HierarchyWindowItemOnGUI(int instanceId, Rect selectionRect){var obj = EditorUtility.InstanceIDToObject(instanceId) as GameObject;if (obj == null)return;GameObject selectedObjs = Selection.activeGameObject;if(obj!=selectedObjs)return;selectionRect.x += selectionRect.width - 60;selectionRect.y += 0;selectionRect.width = 60f;GUIStyle fontStyle = new GUIStyle(GUI.skin.button);fontStyle.alignment=TextAnchor.MiddleCenter;fontStyle.fontSize=10;fontStyle.normal.textColor=Color.yellow;//点击事件if (GUI.Button(selectionRect, "复制层级", fontStyle)){// Debug.Log($"click: {Selection.activeObject.name}");// 弹出菜单Vector2 mousePosition = Event.current.mousePosition;Rect position = new Rect(mousePosition.x, mousePosition.y+7, 0, 0);EditorUtility.DisplayPopupMenu(position, "GameObject/1_复制层级路径", null);}}// 防止一次点击响应多次private static float _last_call_time = 0;private static float minInterval_time = 0.5f;[MenuItem("GameObject/1_复制层级路径/A点~B点", false, 40)]private static void GetHierarchyPath2(){if (Time.time - _last_call_time<minInterval_time){return;}_last_call_time = Time.time;GameObject[] selectedObjs = Selection.gameObjects;//Debug.Log(selectedObjs.Length);if (selectedObjs.Length == 1){Copy_HierarchyPath_root2target();return;}else if (selectedObjs.Length < 2){Debug.Log("请选择一个或二个有包含关系对象");return;}Transform first = selectedObjs[0].transform;Transform last = selectedObjs[selectedObjs.Length-1].transform;// Debug.Log($"first.name:{first.name} last.name:{last.name}");Transform a = null;Transform b = null;if (EditorUtils.IsAncestor(first, last)){a = first;b = last;}else if (EditorUtils.IsAncestor(last, first)){a = last;b = first;}else{Debug.LogError("请选择有包含关系的二个对象");return;}List<string> names = new List<string>();while (b!=null){if (a == b){names.Insert(0,b.name);break;}names.Insert(0, b.name);b = b.parent;}string path = "";for (int i = 0; i < names.Count-1; i++){path += names[i] + "/";}path += names[^1];GUIUtility.systemCopyBuffer = path;Debug.Log("对象层次路径 A点到B点: " + path);}[MenuItem("GameObject/1_复制层级路径/根0~目标", false, 40)]private static void Copy_HierarchyPath_root0target(){Copy_HierarchyPath_rootN2target(0);}[MenuItem("GameObject/1_复制层级路径/根1~目标", false, 40)]private static void Copy_HierarchyPath_root1target(){Copy_HierarchyPath_rootN2target(1);}[MenuItem("GameObject/1_复制层级路径/根2~目标", false, 40)]private static void Copy_HierarchyPath_root2target(){Copy_HierarchyPath_rootN2target(2);}[MenuItem("GameObject/1_复制层级路径/根3~目标", false, 40)]private static void Copy_HierarchyPath_root3target(){Copy_HierarchyPath_rootN2target(3);}// 从根0的第N级到目标// rootN从零开static void Copy_HierarchyPath_rootN2target(int rootN){if (Time.time - _last_call_time<minInterval_time){return;}_last_call_time = Time.time;if (Selection.count != 1){Debug.LogError($"Copy_HierarchyPath_rootN2target: 请选择一个对象");return;}Transform target = Selection.activeGameObject.transform;List<string> names = new List<string>();Transform parent = target.transform.parent;while (target != null){names.Insert(0, target.name);target = target.parent;}if (names.Count - 1 < rootN){Debug.LogError($"Copy_HierarchyPath_rootN2target: N:{rootN}大于目标对象的深度");return;}string path = "";for (int i = rootN; i < names.Count-1; i++){path += names[i] + "/";}path += names[^1];GUIUtility.systemCopyBuffer = path;Debug.Log($"对象层次路径 root_{rootN}到target:" + path);}
}

打个赏吧

请添加图片描述

相关文章:

Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应

目录 需求描述上代码打个赏吧 需求描述 现在有这样一个需求&#xff1a; 在Hierarchy面板的对象上绘制按钮点击按钮&#xff0c;弹出菜单再点击菜单项目响应自定义操作在这里的响应主要是复制对象层级路路径 看具体效果请看动图&#xff1a; 注&#xff1a; 核心是对Edito…...

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的&#xff0c;这是由于视频编码方式的问题。解决办法&#xff1a; 首先安装 ffmeg 编码工具&#xff1a; sudo apt-get install ffmpeg 然后改变视频的…...

一键与图片对话!LLM实现图片关键信息提取与交互

本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁&#xff0c;主要介绍了如何通过小模型与大模型的结合&#xff0c;解决数据分析中的问题。 项目背景 在智能涌现的大模型时代&#xff0c;越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率&#xff0c;助力业务智…...

洛谷 P8833 [传智杯 #3 决赛] 课程 讲解

前言&#xff1a; 大家好&#xff01; 我们又见面啦~~~ 对于我20多天没上号&#xff0c;深表歉意&#xff01;&#xff01; 希望大家给我的account点一个赞&#xff0c;加一个粉丝&#xff0c;谢谢&#xff01; 也对CSDN的所有博主们送上衷心的祝福&#xff01; 如有错误…...

中国IT产经新闻:新能源汽车发展前景与燃油车的利弊之争

随着科技的进步和环保意识的提高&#xff0c;新能源汽车在全球范围内逐渐受到重视。然而&#xff0c;在新能源汽车迅速发展的同时&#xff0c;燃油车仍然占据着主导地位。本文将从新能源与燃油车的利弊、新能源汽车的发展前景两个方面进行分析&#xff0c;以期为读者提供全面的…...

一、数据结构

一、 数组 1.1 数组 定义 遍历 // 遍历数组 传递指针 func traverse() {var b [...]int{1, 2, 3} //长度为3 元素为 1 2 3var ptr &b //ptr是指向数组的指针fmt.Println(b[0], b[1]) // 打印数组的前 2 个元素fmt.Println(ptr[0], ptr[1]) // 通…...

案例分享:各行业销售岗位的KPI指标制定分享

在当今竞争激烈的市场环境中&#xff0c;销售岗位的绩效考核至关重要。有效的绩效考核能帮助企业了解销售人员的业绩&#xff0c;激励他们提高效率&#xff0c;并确保销售战略的实现。关键绩效指标&#xff08;KPI&#xff09;作为绩效考核的核心&#xff0c;能精炼地反映销售人…...

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求&#xff1a; 制作一个EXCEL模板&#xff0c;每个班级的班主任统计 班级图书量&#xff08;一个孩子10本&#xff0c;最多35个孩子350本&#xff09; EXCEL模板 1.0版本&#xff1a; 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…...

spring boot 2升级为spring boot 3中数据库连接池druid的问题

目录 ConfigurationClassPostProcessor ConfigurationClassBeanDefinitionReader MybatisPlusAutoConfiguration ConditionEvaluator OnBeanCondition 总结 近期给了一个任务&#xff0c;要求是对现有的 spring boot 2.x 项目进行升级&#xff0c;由于 spring boot 2.x 版…...

客服系统配置之Nginx处理静态资源和动态请求

Nginx直接处理静态资源&#xff0c;接口动态请求走反向代理到后端 这样可以减轻后端服务的压力 location / {try_files $uri kefu; }location kefu {# 这里是命名位置 kefu 的配置proxy_pass http://backend-server;# 其他反向代理的配置... }如果请求的是静态资源&#xff08…...

Golang 切片

前言 在Go语言中&#xff0c;切片是一个引用类型&#xff0c;它提供了对数组的动态窗口。切片并不存储任何数据&#xff0c;它只是描述了底层数组中的一个片段。切片的定义包括三个部分&#xff1a;指向数组的指针、切片的长度和切片的容量 基本使用 声明切片&#xff1a;声…...

防止公司办公终端文件数据 | 资料外泄,——自动智能透明加密防泄密软件系统

天锐绿盾公司电脑文件数据资料透明加密防泄密软件系统是一款专门用于保护企业电脑文件数据安全的软件系统。它采用透明加密技术&#xff0c;能够在不影响员工正常工作的情况下&#xff0c;对电脑上的文件数据进行自动加密&#xff0c;从而有效防止企业数据泄密。 PC端访问地址&…...

C#-枚举

枚举类型 (enum type) 是具有一组命名常量的独特的值类型。 下面的示例声明并使用一个名为 Color 的枚举类型&#xff0c;该枚举具有三个常量值 Red、Green 和 Blue&#xff1a; using System; using System;enum Color {Red,Green,Blue }class Test {static void PrintColor(…...

Java后端开发——SSM整合实验

文章目录 Java后端开发——SSM整合实验一、常用方式整合SSM框架二、纯注解方式整合SSM框架 Java后端开发——SSM整合实验 一、常用方式整合SSM框架 1.搭建数据库环境&#xff1a;MySQL数据库中创建一个名称为ssm的数据库&#xff0c;在该数据库中创建一个名称为tb_book的表 …...

VMware虚拟机安装Ubuntu

准备:Ubuntu的镜像文件,VMware,手. 1.新建虚拟机&#xff0c;选择自定义&#xff0c;下一步。 2.硬件兼容性&#xff0c;选择Workstation 16.x&#xff0c;下一步。 3.选择安装程序光盘映像文件&#xff0c;路径为映像文件所在文件夹&#xff0c;下一步。 4. 创建用户和设置密…...

用一个简单的例子说明单细胞分析中的dgCMatrix数据的结构

dgCMatrix用来存储矩阵的一种数据格式&#xff0c;这种数据格式很适合存储稀疏矩阵&#xff08;即矩阵中大部分值为0&#xff09;。dgCMatrix使用三个数组&#xff08;分别是i&#xff0c;p&#xff0c;x&#xff09;来存储矩阵。怎么存的呢&#xff1f; 先举一个普通矩阵的例…...

【小工具】pixi-live2d-display,直接可用的live2d的交互网页/桌面应用

效果&#xff1a; <script src"https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js"></script> <script src"https://cdn.jsdelivr.net/gh/dylanNew/live2d/webgl/Live2D/lib/live2d.min.js"></script> <…...

vulhub中的Nginx漏洞的详细解析

Nginx漏洞 1.cd到nginx_parsing_vulnerability cd /opt/vulhub/nginx/nginx_parsing_vulnerability 2.执行docker-compose up -d 3.查看靶场是否开启成功 dooker ps 4.访问浏览器 因为这里是80端口所以直接使用ip就能访问成功 5.上传图片 注意这里的图片是含有一句话木马的图…...

如何实现公网访问GeoServe Web管理界面共享空间地理信息【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…...

k8s-存储 11

一、configmapu存储 首先&#xff0c;确保集群正常&#xff0c;节点都处于就绪状态 Configmap用于保存配置数据&#xff0c;以键值对形式存储。configMap资源提供了向 Pod 注入配置数据的方法&#xff0c;旨在让镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...