Unity编辑器扩展之GenericMenu菜单扩展

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

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity编辑器扩展之GenericMenu自定义菜单
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 GenericMenu 菜单扩展

为初学者节省宝贵的学习时间,避免困惑!



GenericMenu 是 Unity 中的一个强大的类,用于创建和管理自定义上下文菜单(也称为弹出菜单)。

可以使用 GenericMenu 来为编辑器中的不同场合或场景元素创建自定义右键单击菜单,以提供各种操作选项。

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎

allowDuplicateNames 允许菜单具有多个同名的菜单项。
AddDisabledItem 向菜单添加已禁用的项。
AddItem 向菜单添加一个项。
AddSeparator 向菜单添加一个分隔符项。
DropDown 在给定屏幕矩形中显示菜单。
GetItemCount 获取菜单中的项数。
ShowAsContext 右键单击时在鼠标下显示菜单。
MenuFunction 回调函数,菜单项选中时调用。
MenuFunction2 带有用户数据的回调函数,菜单项选中时调用。

 // 创建一个通用菜单
 GenericMenu menu = new GenericMenu();
 
 //添加一个不可用并且勾选的菜单项RGB/Blue
 menu.AddDisabledItem(new GUIContent("RGB/Blue"), true);
 
 //添加一个菜单项RGB/Red,并且传入一个有参回调
 menu.AddItem(new GUIContent("RGB/Red"), false, OnColorSelected, Color.red);
 
 //添加一个菜单项RGB/Green,并且传入一个无参回调
 menu.AddItem(new GUIContent("RGB/Green"), true, OnColorSelected);
 
//添加一个分割线
 menu.AddSeparator("");
 
 //允许重命名
 menu.allowDuplicateNames = true;
 
 //添加两个名称一样的菜单项
 menu.AddItem(new GUIContent("CMYK"), true, OnColorSelected);
 menu.AddItem(new GUIContent("CMYK"), true, OnColorSelected);
 
 // 以右键菜单的形式展示菜单
 menu.ShowAsContext();

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎

一、Scene视图添加自定义菜单


public class MyComponent : MonoBehaviour
{
 	[InitializeOnLoadMethod]
    private static void SceneViewExtensions()
    {
    	// 注册 SceneView 的回调函数
        SceneView.duringSceneGui += OnSceneGUI;
    }

    private static void OnSceneGUI(SceneView sceneView)
    {
        // 在 Scene 视图中的鼠标位置创建 GenericMenu
        Event guiEvent = Event.current;
        Vector2 mousePosition = guiEvent.mousePosition;
        // 通过鼠标右键触发菜
        if (guiEvent.type == EventType.MouseDown && guiEvent.button == 1){
            GenericMenu menu = new GenericMenu();
            menu.AddItem(new GUIContent("Option 1"), false, Option1Selected);
            menu.AddItem(new GUIContent("Option 2"), false, Option2Selected);

            menu.ShowAsContext(); // 以上下文菜单方式显示
            guiEvent.Use(); // 标记事件已被处理
        }
    }

    private static void Option1Selected()
    {
        Debug.Log("Option 1 selected!");
    }

    private static void Option2Selected()
    {
        Debug.Log("Option 2 selected!");
    }
}

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎

通过 SceneView.duringSceneGui 注册了一个回调函数 OnSceneGUI。当在 Scene 视图中使用鼠标右键点击时,将触发 GenericMenu 的创建和显示,显示两个选项 “Option 1” 和 “Option 2”。这里使用了 ShowAsContext() 方法以上下文菜单的方式展示。

二、Hierarchy视图添加自定义菜单


public class MyComponent : MonoBehaviour
{
 	[InitializeOnLoadMethod]
    private static void SceneViewExtensions()
    {
    	// 注册 hierarchyWindowItemOnGUI 的回调函数
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
    }

   private 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;
            if (selectedGameObject)
            {
                // 创建 GenericMenu
                 GenericMenu menu = new GenericMenu();
                menu.AddItem(new GUIContent("Option 1"), false, Option1Selected, selectedGameObject);
                menu.AddItem(new GUIContent("Option 2"), false, Option2Selected, selectedGameObject);

                // 在鼠标位置显示菜单
                menu.ShowAsContext();
                Event.current.Use();
            }
        }
    }

    private static void Option1Selected(object obj)
    {
        GameObject selectedObject = obj as GameObject;
        Debug.Log("Option 1 selected for: " + selectedObject.name);
    }

    private static void Option2Selected(object obj)
    {
        GameObject selectedObject = obj as GameObject;
        Debug.Log("Option 2 selected for: " + selectedObject.name);
    }
}

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎

通过EditorApplication.hierarchyWindowItemOnGUI 来注册 OnHierarchyGUI 方法作为 Hierarchy 视图中的每个项的 GUI 回调函数。当右键点击 Hierarchy 视图中的 GameObject 时,将创建一个包含 “Option 1” 和 “Option 2” 两个选项的 GenericMenu 菜单,并在点击时触发相应的方法。

三、Project视图添加自定义菜单


public class MyComponent : MonoBehaviour
{
 	[InitializeOnLoadMethod]
    private static void SceneViewExtensions()
    {
    	// 注册 projectWindowItemOnGUI 的回调函数
        EditorApplication.projectWindowItemOnGUI += OnProjectOnGUI;
    }

    private static void OnProjectOnGUI(string guid, Rect selectionRect)
    {
        if (Event.current != null && selectionRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.ContextClick)
        {
            // 获取当前右键点击的资源路径
            string assetPath = AssetDatabase.GUIDToAssetPath(guid);
            // 创建 GenericMenu
            GenericMenu menu = new GenericMenu();
            menu.AddItem(new GUIContent("Option 1"), false, Resource1Selected, assetPath);
            menu.AddItem(new GUIContent("Option 2"), false, Resource2Selected, assetPath);

            // 在鼠标位置显示菜单
            menu.ShowAsContext();
            Event.current.Use();
        }
    }

    private static void Resource1Selected(object obj)
    {
        string assetPath = obj as string;
        Debug.Log("Option 1 selected for: " + assetPath);
    }

    private static void Resource2Selected(object obj)
    {
        string assetPath = obj as string;
        Debug.Log("Option 2 selected for: " + assetPath);
    }
}

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎


注册一个回调函数 OnProjectGUI 到 EditorApplication.projectWindowItemOnGUI 事件中。当在 Project 视图中右键点击资源项时,将检测鼠标事件类型是否为右键点击,并且鼠标位置是否在资源项区域内。如果是,则会获取当前资源的路径,并创建一个包含 “Option 1” 和 “Option 2” 两个选项的 GenericMenu 菜单。

四、Game视图添加自定义菜单


using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

#if UNITY_EDITOR
[ExecuteInEditMode]
public class GameExtensions : MonoBehaviour
{
    private void OnGUI()
    {
        // 在 Game 视图中的鼠标位置创建 GenericMenu
        if (Event.current != null && Event.current.type == EventType.ContextClick) // 通过鼠标右键触发菜单
        {
            Vector2 mousePosition = Event.current.mousePosition;

            GenericMenu menu = new GenericMenu();
            menu.AddItem(new GUIContent("Option 1"), false, Option1Selected);
            menu.AddItem(new GUIContent("Option 2"), false, Option2Selected);

            menu.ShowAsContext(); // 以上下文菜单方式显示

            Event.current.Use(); // 标记事件已被处理
        }
    }

    private static void Option1Selected()
    {
        Debug.Log("Option 1 selected!");
    }

    private static void Option2Selected()
    {
		Debug.Log("Option 2 selected!");
    }
}
#endif

unity genericmenu,Unity编辑器扩展,unity,编辑器,游戏引擎文章来源地址https://www.toymoban.com/news/detail-790820.html





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

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

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

相关文章

  • Unity编辑器扩展 | 编辑器扩展基础入门

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

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

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

    2024年02月10日
    浏览(84)
  • Unity编辑器扩展(外挂)

    每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/     //添加变量悬浮提示文字     //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认显示5行,最多显示10行内容,再多用滚动条控

    2024年01月24日
    浏览(87)
  • Unity 编辑器篇|(一)MenuItem菜单栏

    itemName :菜单名称路径 特殊路径: CONTEXT : 为组件添加菜单项 Assets : 对应顶部菜单 Assets,并添加 Project 面板右键菜单 GameObject : 对应顶部菜单 GameObject,priority 值在1~49时,添加 Hierarchy 面板右键菜单 Component : 对应顶部菜单 Component,对应 Inspector 面板的 Add Component 窗口。但是不

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

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

    2024年02月12日
    浏览(63)
  • Unity 扩展自定义编辑器窗口

    在Assets文件夹路径下任意位置创建Editor文件夹,将扩展编辑器的代码放在Editor文件夹下 代码中首先引用命名空间 然后将创建的类继承自EditorWindow 然后通过扩展编辑器菜单功能调用创建窗口的方法 要注意方法中泛型参数需要传入的是自己代码的类,这个功能是根据后面OnGUI方

    2024年04月27日
    浏览(56)
  • Unity 编辑器扩展之 Attribute

    Unity内置属性[Attribute]是一种类似修饰功能的标签。可以对OnSceneGUI,InspectorGUI,MenuGUI,WindowGUI等实现各种各样的GUI扩展。用户只要添加上特性标签,就能够自由的使用这些扩展功能。下面列出一些常用的标签: 隐藏属性在Inspector面板上的显示。在继承了MonoBehaviour的类中,用

    2023年04月09日
    浏览(70)
  • Unity编辑扩展:功能篇之Json数据编辑器

    前言 编辑器扩展算是比较纯粹的功能开发,基本没有什么理论知识,都是一些 Unity 相关接口的使用与数据类型的设计操作等。在本篇文章主要的文字描述基本都是在做代码解释,为了使内容接受度更高,我会尽量描述到代码结构中的每个细节。如果有对此不太了解又很感兴

    2024年02月06日
    浏览(103)
  • 盘点Unity几款编辑器扩展工具

    unity 编辑器一个不容忽视的强大之处就是非常易于自定义扩展工具,来满足各种各样的美术、策划及程序上的需求。今天为大家介绍Asset Store资源商店中几款实用的编辑器扩展工具,帮助大家直接在Unity编辑器中完成3D建模与调整工作,免去与其它软件进行数据转换的过程,从

    2024年04月09日
    浏览(48)
  • 【Unity编辑器扩展】| Inspector监视器面板扩展

    前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。 后面就来针对Uniity编辑器扩展中比较常用的模块进行学习介绍。 本文就来详细介绍一下Unity编辑器扩展中关于 Inspector面板 扩展功能学习。

    2024年02月08日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包