Unity 编辑器篇|(二)GenericMenu自定义弹出式菜单

news2024/10/5 15:55:17

目录

  • 1. 前言
  • 2. Scene视图添加自定义菜单
  • 3. Hierarchy视图添加自定义菜单
  • 4. Project视图添加自定义菜单
  • 5. Game视图添加自定义菜单

1. 前言

  • GenericMenu 是 Unity 中的一个强大的类,用于创建和管理自定义上下文菜单(也称为弹出菜单)。可以使用 GenericMenu 来为编辑器中的不同场合或场景元素创建自定义右键单击菜单,以提供各种操作选项。
    1
方法描述
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();

using UnityEngine;
using UnityEditor;

public class GenericMenuExample : EditorWindow
{
    [MenuItem("Example/GUI Color")]
    static void Init()
    {
        EditorWindow window = GetWindow<GenericMenuExample>();
        window.position = new Rect(50f, 50f, 200f, 24f);
        window.Show();
    }

    [SerializeField]
    Color m_Color = Color.white;

    void OnEnable()
    {
        titleContent = new GUIContent("GUI Color");
    }

    void AddMenuItemForColor(GenericMenu menu, string menuPath, Color color)
    {
        menu.AddItem(new GUIContent(menuPath), m_Color.Equals(color), OnColorSelected, color);
    }

    void OnColorSelected(object color)
    {
        m_Color = (Color)color;
    }

    void OnGUI()
    {
        GUI.color = m_Color;

        if (GUILayout.Button("Select GUI Color"))
        {
            GenericMenu menu = new GenericMenu();

            AddMenuItemForColor(menu, "RGB/Red", Color.red);
            AddMenuItemForColor(menu, "RGB/Green", Color.green);
            AddMenuItemForColor(menu, "RGB/Blue", Color.blue);

            menu.AddSeparator("");

            AddMenuItemForColor(menu, "CMYK/Cyan", Color.cyan);
            AddMenuItemForColor(menu, "CMYK/Yellow", Color.yellow);
            AddMenuItemForColor(menu, "CMYK/Magenta", Color.magenta);
            menu.AddSeparator("CMYK/");
            AddMenuItemForColor(menu, "CMYK/Black", Color.black);

            menu.AddSeparator("");

            AddMenuItemForColor(menu, "White", Color.white);

            menu.ShowAsContext();
        }
    }
}

在这里插入图片描述

2. Scene视图添加自定义菜单

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

public class TestGenericMenu : 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!");
    }
}

2

3. Hierarchy视图添加自定义菜单

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

public class TestGenericMenu : 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);
    }
}

3

4. Project视图添加自定义菜单

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

public class TestGenericMenu : 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);
    }
}

3

5. Game视图添加自定义菜单

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

#if UNITY_EDITOR
[ExecuteInEditMode]
public class TestGenericMenu : MonoBehaviour
{
    private void OnGUI()
    {
        // 在 Game 视图中的鼠标位置创建 GenericMenu
        if (Event.current != null && Event.current.type == EventType.ContextClick) // 通过鼠标右键触发菜单
        {
            Debug.Log("1");
            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

4

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django配置日志系统的最佳实践

概要 日志是跟踪应用行为、监控错误、性能分析和安全审计的重要工具。在Django框架中&#xff0c;合理配置日志系统可以帮助开发者有效管理项目运行过程中的关键信息。本文将详细介绍Django日志系统的最佳实践。 日志系统概述 Django使用Python的 logging 模块来实现日志系统…

苹果快捷指令在哪?详细使用教程送给大家!

快捷指令是苹果公司推出的一个实用功能&#xff0c;然而&#xff0c;可能还有很多新手用户不知道苹果快捷指令在哪。其实&#xff0c;快捷指令中心是iOS系统自带的应用&#xff0c;它一般就位于手机的主屏幕中。今天&#xff0c;小编将针对此问题来给大家分享一下有关苹果快捷指…

虚拟机Linux硬盘扩容

扩容前(20G)&#xff1a; 扩容后(60G)&#xff1a; 步骤&#xff1a; 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 2. 运行虚拟机&#xff0c;查看根目录属于那个文件系统&#xff0c;我的是 /dev/sda1…

前端八股文(网络篇)一

目录 1.Get和Post的请求的区别 2.常见的HTTP请求头和响应头 3.常见的HTTP请求方法 4.HTTP与HTTPS协议的区别 5.对keep-alive的理解 6.页面有多张图片&#xff0c;HTTP是怎样的加载表现&#xff1f; 7.HTTP请求报文是什么样的&#xff1f; 8.HTTP响应报文是什么样&#x…

【数据结构】数据结构中应用题大全(完结)

自己在学习过程中总结了DS中几乎所有的应用题&#xff0c;可以用于速通期末考/考研/各种考试。很多方法来源于B站大佬&#xff0c;底层原理本文不做过多介绍&#xff0c;建议自己研究。例题大部分选自紫皮严书。pdf版在主页资源 一、递归时间/空间分析 1.时间复杂度的分析 设…

与AI合作 -- 写一个modern c++单例工厂

目录 前言 提问 bard给出的答案 AI答案的问题 要求bard改进 人类智能 AI VS 人类 前言 通过本文读者可以学到modern C单例模式工厂模式的混合体&#xff0c;同时也能看到&#xff1a;如今AI发展到了怎样的智能程度&#xff1f;怎样让AI帮助我们快速完成实现头脑中的想法&…

如何下载和处理Sentinel-2数据

Sentinel-2是欧洲空间局&#xff08;ESA&#xff09;Copernicus计划中的一组地球观测卫星&#xff0c;主要用于提供高分辨率的光学遥感数据。Sentinel-2卫星组成了一个多光谱成像系统&#xff0c;可用于监测地球表面的陆地变化、植被覆盖、水域和自然灾害等。它具有以下特性&am…

2019年认证杯SPSSPRO杯数学建模A题(第一阶段)好风凭借力,送我上青云全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 纸飞机在飞行状态下的运动模型 A题 好风凭借力&#xff0c;送我上青云 原题再现&#xff1a; 纸飞机有许多种折法。世界上有若干具有一定影响力的纸飞机比赛&#xff0c;通常的参赛规定是使用一张特定规格的纸&#xff0c;例如 A4 大小的纸张…

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

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

JQuery异步加载表格选择记录

JQuery异步加载表格选择记录 JQuery操作表格 首先在页面中定义一个表格对象 <table id"insts" class"table"><thead><tr><th>列1</th><th>列2</th><th>例3</th><th></th></tr>…

世微AP2400 DC-DC降压恒流IC12-80V 9V/3A LED电动摩托车灯驱动芯片方案

1&#xff0c;做一款三功能LED车灯驱动方案 AP2400 是一款 PWM 工作模式,率、外围简单、外驱功率管&#xff0c;适用于 输入的降压 LED 恒流驱动芯片。外驱 MOS&#xff0c;大输出电流可达 6A。AP2400 可实现三段功能切换&#xff0c;通过 MODE1/2/3 切换三种功能模式&#xff…

群辉安装gitea

群辉安装gitea 安装giteagitea容器配置 安装gitea gitea容器配置

​安全可靠测评结果公告(2023年第1号)

安全可靠测评主要面向计算机终端和服务器搭载的中央处理器&#xff08;CPU&#xff09;、操作系统以及数据库等基础软硬件产品&#xff0c;通过对产品及其研发单位的核心技术、安全保障、持续发展等方面开展评估&#xff0c;评定产品的安全性和可持续性&#xff0c;实现对产品研…

Opencv实验合集——实验八:相机校准

1.定义 首先&#xff0c;我们来理解一下怎么从相机的角度去看一张图片&#xff0c;就好比如你用眼睛作为相机来进行摄影&#xff0c;但是比摄影机强的是&#xff0c;你是怎么摄影图片之后再将它矫正出现在你眼前&#xff0c;将歪歪扭扭的图片变成一张在你眼前是一张直的图片 为…

孩视宝、飞利浦、书客护眼台灯怎么样?多方位深度测评对比

台灯是我们日常生活中比较常见的一种桌面照明工具&#xff0c;不管是大人用于工作&#xff0c;还是小孩用于学习、阅读&#xff0c;都离不开它。不过我们也要注意&#xff0c;如果使用一款不合格的台灯&#xff0c;时间长了也会影响我们的眼睛健康&#xff0c;尤其是青少年学生…

类别型特征的编码方法

机器学习模型中除了决策树等少数模型能直接处理字符串形式的类别型特征输入外&#xff0c;逻辑回归、支持向量机等模型的输入必须是数值型特征才能在矩阵上执行线性代数计算&#xff0c;所以参加计算的特征必须是数值型的&#xff0c;对于非数值型的特征需要进行编码处理。对于…

【全栈开发|Fresh框架】Fresh环境安装与快速体验Fresh全栈开发

文章目录 前言一、环境配置1. 安装Deno2. 安装idea插件 二、Hello World1.创建项目2.项目结构3. 创建一个路由4. 创建一个动态路由5. 自定义handlers1. 自定义响应头2. 随即生成uuid 6. 表单提交7. 部署到生产环境1. 将代码上传到github2. 在Deno控制面板创建一个项目 总结 前言…

【IEEE会议征稿通知】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL 2024)

第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09; 2024 5th International Conference on Computer Vision, Image and Deep Learning 第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09;定于2024年4月19-21日…

美国成人便携式床护栏ASTMF3186–17安全标准详解

2023年7月21日&#xff0c;美国消费品安全委员会(CPSC)发布了最终规则16CFR1270&#xff0c;建立了成人便携式床栏(APBR)的安全标准&#xff0c;旨在减少与APBR夹住和其他危险相关的不合理的伤害和死亡风险。该规则纳入了ASTMF3186–17&#xff08;成人便携式床栏及相关产品的标…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器&#xff0c;最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C&#xff0c;工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…