当前位置: 首页 > 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;以便实现镜像的可移植性和可复用…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...