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);}
}

打个赏吧

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制el-table的列显示隐藏

控制el-table的列显示隐藏&#xff0c;一般的话可以通过循环来实现&#xff0c;但是假如业务及页面比较复杂的话&#xff0c;list数组循环并不好用。 在我们的页面中el-table-column是固定的&#xff0c;因为现在是对现有的进行维护和迭代更新。 对需要控制列显示隐藏的页面进…

【EI会议征稿通知】第三届仿真设计与计算建模国际学术会议(SDCM 2024)

The 3rd International Conference on Simulation Design and Computational Modeling 第三届仿真设计与计算建模国际学术会议&#xff08;SDCM 2024&#xff09; 第三届仿真设计与计算建模国际会议&#xff08;SDCM 2024&#xff09;将于 4 月 26-28 日在中国重庆召开。第二届…

【博士每天一篇文-算法】Graph Structure of Neural Networks

阅读时间&#xff1a;2023-11-12 1 介绍 年份&#xff1a;2020 作者&#xff1a;尤家轩 斯坦福大学 期刊&#xff1a; International Conference on Machine Learning. 引用量&#xff1a;130 论文探讨了神经网络的图结构与其预测性能之间的关系。作者提出了一种新的基于图的…

【leetcode】力扣算法之旋转图像【难度中等】

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 用例 输入&#xff1a; matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

java 体育明星管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 体育明星管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

2000-2022各省、地级市风险投资(VC)数据

2000-2022各省、地级市风险投资&#xff08;VC&#xff09;数据 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;350个地级市&#xff0c;34省 3、指标&#xff1a;包含投资机构层面的风险投资原始数据&#xff0c;汇总到省市层面的结果数据&#xff0c;具体指标如下&a…

【Java集合篇】ConcurrentHashMap是如何保证fail- safe的

ConcurrentHashMap是如何保证fail-safe的 ✅典型解析✅拓展知识仓✅分段锁☑️分段锁适用于什么情况&#x1f7e1;分段锁的锁争用情况,是否会带来一定的性能影响✔️分段锁的优缺点&#x1f7e2; 还有哪些其他的线程安全哈希表实现&#x1f7e0;Hashtable和 Collections区别&am…

二叉树及其实现

二叉树 一.树的概念及结构1.1树的概念1.2相关概念 2.二叉树的概念及结构2.1 概念2.2 特殊的二叉树 3.二叉树的遍历3.1 前序、中序以及后序遍历3.2 层序遍历3.3 判断二叉树是否是完全二叉树3.4 二叉树的高度3.5 二叉树的叶子节点个数3.6 二叉树的第k层的节点个数3.7 二叉树销毁3…

Java面向对象综合练习(拼图小游戏),用java图形化界面实现拼图小游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位同学大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

自行车商城网站网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea

【自行车商城网站网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea】 https://www.bilibili.com/video/BV1wT4y1p7jq/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

您的计算机已被.LIVE勒索病毒感染?恢复您的数据的方法在这里!

引言&#xff1a; 在数字时代&#xff0c;.LIVE勒索病毒如暗夜中的黑暗调&#xff0c;威胁着个人和企业的数字安全。本文将深入介绍.LIVE勒索病毒的特征&#xff0c;提供解密数据的方法&#xff0c;并讨论预防措施&#xff0c;让我们共同筑起数字世界的防护之墙。数据的重要性…

太惨了,又一个程序员被渣的开年大瓜

今天闲暇之余浏览了一下mm&#xff0c;忽然看见一条瓜&#xff1a;某东pdf瓜&#xff0c;一份19页的PDF文件&#xff0c;题为《婚房变赠予&#xff0c;京东渣女出轨连环套设计冤大头程序员》&#xff0c;点进去看了一下&#xff0c;简直炸裂了三观&#xff0c;男同志们一定要保…

什么是预训练Pre-training—— AIGC必备知识点,您get了吗?

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 随着人工智能(AI)不断重塑我们的世界&#xff0c;其发展的一个关键方面已经…

数据结构之单调栈、单调队列

今天学习了单调栈还有单调队列的概念和使用&#xff0c;接下来我将对其定义并配合几道习题进行讲解&#xff1a; 首先先来复习一下栈与队列&#xff1a; 然后我们来看一下单调栈的定义&#xff1a; 单调栈中的元素从栈底到栈顶的元素的大小是按照单调递增或者单调递减的关系进…

Javaweb之SpringBootWeb案例的详细解析

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xf…

生信 R语言

11.芯片表达矩阵下游分析 ​rm(list ls())#清除所有变量 options(stringsAsFactors F) #BiocManager::install("CLL") suppressPackageStartupMessages(library(CLL)) data("sCLLex") sCLLex ## ExpressionSet (storageMode: lockedEnvironment) ## as…

centos下系统全局检测工具dstat使用

目录 一&#xff1a;没有需要安装 二&#xff1a;dstat命令参数 三、监测界面各参数含义&#xff08;部分&#xff09; 四、dstat的高级用法 一&#xff1a;没有需要安装 yum install dstat 二&#xff1a;dstat命令参数 有默认选项&#xff0c;执行dstat命令不加任何参数…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷②

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 模块一 …

Java中什么序列化?

在Java中&#xff0c;序列化是一种将对象转换为字节序列的机制&#xff0c;使得对象可以在网络上传输或存储到文件中&#xff0c;而后可以通过反序列化还原为对象。Java提供了java.io.Serializable接口&#xff0c;通过实现这个接口的类可以实现对象的序列化和反序列化。 序列…

HTTP 代理原理及实现(二)

在上篇《HTTP 代理原理及实现&#xff08;一&#xff09;》里&#xff0c;我介绍了 HTTP 代理的两种形式&#xff0c;并用 Node.js 实现了一个可用的普通 / 隧道代理。普通代理可以用来承载 HTTP 流量&#xff1b;隧道代理可以用来承载任何 TCP 流量&#xff0c;包括 HTTP 和 H…