【Unity编辑器】拓展Hierarchy视图

这篇具有很好参考价值的文章主要介绍了【Unity编辑器】拓展Hierarchy视图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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

【Unity编辑器】拓展Hierarchy视图

菜单中已经包含了系统默认的一些菜单项,我们拓展的原理就是重写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);
                }
            }
        };
    }
}

【Unity编辑器】拓展Hierarchy视图

在代码中实现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();	//不再执行原有操作,所以实现了重写
            }
        }
    }
}

【Unity编辑器】拓展Hierarchy视图

此外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属性即可。文章来源地址https://www.toymoban.com/news/detail-433625.html

到了这里,关于【Unity编辑器】拓展Hierarchy视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity编辑器拓展——Editor模式下屏幕坐标转换为世界坐标

    发会牢骚,最近一直在做Unity的编辑器拓展,其中难的地方不少,但不至于到看不懂的地步,可一做到关于坐标转换的内容时把我弄不会了。 这个不查不知道,一查吓一跳,Unity的坐标系非常多,有世界坐标,屏幕坐标,局部坐标,视窗坐标等等,而且每一个都是不一样的坐

    2024年02月03日
    浏览(32)
  • Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

    在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的样式,可以通过一键点击后设置UI背景的样式,省

    2024年02月03日
    浏览(38)
  • UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

    目录  需要考虑的问题 重定向的修复函数 代码: 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候,会发现,有些资产在删除的时候会出现有被什么什么引用,还有的是没有被引用。 而我们如果直接选择一片去进行删除的话,那么会导致看到很多有引用

    2024年02月07日
    浏览(43)
  • UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,高效复制多个同样的资产】

    目录 ​​​​​​​ 插件制作 添加新的类:AssetActionUtility 添加新的模块:EditorScriptingUtilities 路径了解 添加debug的头文件 代码【debug.h】内涵注释: 写函数 .h文件 .cpp文件 首先第一步是做一个插件: 因为是用于编辑器的,所以在模块中我们需要进行更改: 将类型改为 Edit

    2024年02月07日
    浏览(32)
  • 在线json格式化编辑器--在线查看json解析视图并按节点排序,查看,编辑,并可导入导出json

    在线JSON编辑器--视图查看器节点筛选节点编辑插入json导入导出

    2024年04月22日
    浏览(31)
  • 【Unity编辑器扩展】 | 编辑器扩展入门基础

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(63)
  • Unity编辑器扩展 | 编辑器扩展基础入门

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(49)
  • Unity 可视化节点编辑器(GraphView、编辑器扩展)

      前几天把导师的项目打包发布交了一稿,这半个星期除了再把项目缝缝补补外(说实话项目做到后边实在有些无聊,都是些琐碎的东西而且自己也学不到什么,纯粹是 浪费 消磨时间)无聊逛Unity商店发现了个有意思的东西,说实话一开始我以为只是单纯绘制的2D动画:

    2024年02月12日
    浏览(45)
  • UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

    目录 了解相关的函数 第一种做法:自定义添加选择资产的前缀或后缀 代码 效果 第二种做法:通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中,我们创建了插件,用来扩展编辑器的使用: UE5.1编辑器拓展【一、脚本化资产行为,通知,弹窗,

    2024年02月07日
    浏览(36)
  • Unity编辑器紫色

    紫色原因是因为编辑器内跑了其他平台的shader兼容性导致的,需要动态的去修改shader,主要用到Unity的api :  Shader.Find(shaderName); 具体的工具代码如下: Shader的添加形式大概有两种: 跟随AssetBundle 打进包里面,可以直接使用       自建材质  

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包