当前位置: 首页 > java >正文

Unity GenericMenu 类详解

Unity GenericMenu 类方法详解表

方法签名作用描述参数说明使用示例
AddItem(GUIContent content, bool on, GenericMenu.MenuFunction func)添加可点击菜单项content: 菜单项显示内容
on: 是否显示选中标记
func: 点击回调方法
menu.AddItem(new GUIContent("保存"), false, Save)
AddItem(GUIContent content, bool on, GenericMenu.MenuFunction2 func, object userData)添加带参数的菜单项userData: 传递给回调的自定义数据menu.AddItem(new GUIContent("删除"), false, (data) => Delete(data), obj)
AddDisabledItem(GUIContent content, bool on)添加禁用菜单项content: 菜单项显示内容
on: 是否显示选中标记
menu.AddDisabledItem(new GUIContent("需要专业版"))
AddSeparator(string path)添加菜单分隔符path: 分隔符位置路径menu.AddSeparator("编辑/")
ShowAsContext()在鼠标位置显示菜单无参数menu.ShowAsContext()
DropDown(Rect rect)在指定位置显示菜单rect: 显示位置的矩形区域menu.DropDown(buttonRect)
allowDuplicateNames允许重复菜单项名布尔值属性menu.allowDuplicateNames = true

方法详解与使用场景

1. AddItem - 基础菜单项

menu.AddItem(new GUIContent("新建场景"), false, () => EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects)
);
  • 适用场景:创建基本功能菜单项
  • 参数说明
    • content:可包含文本和图标
    • on:控制左侧勾选状态
    • func:无参数回调方法

2. AddItem - 带参数菜单项

menu.AddItem(new GUIContent($"删除/{obj.name}"), false, (target) => DestroyImmediate(target as GameObject), obj
);
  • 适用场景:动态生成的菜单项
  • 优势:可传递上下文数据
  • 典型用途:对象列表操作

3. AddDisabledItem - 禁用菜单项

bool hasSelection = Selection.activeObject != null;if (!hasSelection)
{menu.AddDisabledItem(new GUIContent("复制属性"));
}
  • 适用场景:条件未满足的功能项
  • 视觉提示:灰色显示,不可交互
  • 最佳实践:配合条件判断使用

4. AddSeparator - 菜单分隔符

menu.AddItem("文件/新建", false, NewFile);
menu.AddSeparator("文件/"); // 在"文件"菜单下添加分隔符
menu.AddItem("文件/打开", false, OpenFile);
  • 路径规则
    • "":根菜单分隔符
    • "分类/":指定子菜单分隔符
  • 作用:视觉分组,提高可读性

5. ShowAsContext - 上下文菜单

// 在Inspector中添加
public override void OnInspectorGUI()
{if (Event.current.type == EventType.ContextClick){GenericMenu menu = new GenericMenu();menu.AddItem("重置", false, ResetValues);menu.ShowAsContext();Event.current.Use();}
}
  • 典型场景:组件右键菜单
  • 特点:自动定位到鼠标位置

6. DropDown - 指定位置菜单

void OnGUI()
{if (GUILayout.Button("选项")){Rect btnRect = GUILayoutUtility.GetLastRect();GenericMenu menu = new GenericMenu();menu.AddItem("高", false, SetQualityHigh);menu.AddItem("中", false, SetQualityMedium);menu.AddItem("低", false, SetQualityLow);menu.DropDown(btnRect);}
}
  • 适用场景:工具栏下拉菜单
  • 位置控制:精确显示在触发控件下方

7. allowDuplicateNames - 重复项控制

GenericMenu menu = new GenericMenu();
menu.allowDuplicateNames = true;// 允许添加同名但功能不同的菜单项
menu.AddItem("工具/优化", false, OptimizeA);
menu.AddItem("工具/优化", false, OptimizeB);
  • 默认值false(禁止重名)
  • 特殊场景:需要同名不同功能的菜单项
  • 风险:可能导致用户混淆

完整工作流示例

[MenuItem("Tools/场景工具")]
static void ShowWindow()
{var window = GetWindow<SceneToolsWindow>();window.titleContent = new GUIContent("场景工具");
}void OnGUI()
{if (GUILayout.Button("对象操作")){GenericMenu menu = new GenericMenu();// 添加创建子菜单menu.AddItem("创建/立方体", false, CreateCube);menu.AddItem("创建/球体", false, CreateSphere);menu.AddSeparator("创建/");menu.AddItem("创建/灯光", false, CreateLight);// 添加选择相关操作bool hasSelection = Selection.activeGameObject != null;if (hasSelection){menu.AddItem("选择操作/删除", false, DeleteSelected);menu.AddItem("选择操作/复制", false, DuplicateSelected);}else{menu.AddDisabledItem(new GUIContent("选择操作/删除"));menu.AddDisabledItem(new GUIContent("选择操作/复制"));}// 添加设置项menu.AddSeparator("");menu.AddItem("设置/高品质", QualitySettings.level == 0, SetHighQuality);menu.AddItem("设置/中品质", QualitySettings.level == 1, SetMediumQuality);menu.AddItem("设置/低品质", QualitySettings.level == 2, SetLowQuality);// 显示菜单Rect btnRect = GUILayoutUtility.GetLastRect();menu.DropDown(new Rect(btnRect.x, btnRect.yMax, 0, 0));}
}

效果

方法对比指南

特性AddItemAddDisabledItemAddSeparator
交互性可点击不可交互无交互
视觉状态正常/选中灰色分隔线
回调支持✔️
参数传递✔️
使用频率

最佳实践建议

  1. 菜单组织原则

    // 按功能分组
    menu.AddItem("编辑/复制", false, Copy);
    menu.AddItem("编辑/粘贴", false, Paste);
    menu.AddSeparator("编辑/"); // 组内分隔
    menu.AddItem("编辑/撤销", false, Undo);
    
  2. 动态菜单生成

    // 根据场景对象动态生成
    foreach (var obj in FindObjectsOfType<Light>())
    {menu.AddItem($"灯光/{obj.name}", false, () => SelectLight(obj));
    }
    
  3. 菜单项状态反馈

    // 使用选中标记表示状态
    menu.AddItem("视图/显示网格", showGrid, ToggleGrid);
    
  4. 性能优化

    // 避免在循环中重复创建菜单
    GenericMenu menu = new GenericMenu();
    for (int i = 0; i < 1000; i++)
    {menu.AddItem($"选项/{i}", false, () => SelectOption(i));
    }
    
http://www.xdnf.cn/news/16396.html

相关文章:

  • 酒店智能门锁SDK新V门锁系统接口函数[2025版]Delphi 7.0——东方仙盟硬件接口库
  • 学习游戏制作记录(剑投掷技能)7.26
  • 中文语音识别与偏误检测系统开发
  • Java基础-文件操作
  • Spring boot Grafana优秀的监控模板
  • 生猪产业新生态:结构调整与种养结合,筑牢农业强国根基
  • HashMap(JDK1.7、JDK1.8)原理与结构分析与synchronizedMap()
  • 【LeetCode刷题指南】--队列实现栈,栈实现队列
  • C 语言详解:特性、应用与发展
  • GRE和MGRE综合实验
  • DMDSC安装部署教程
  • 基于cooragent的旅游多智能体的MCP组件安装与其开发
  • Android Jetpack 组件库 ->Jetpack Navigation (下)
  • 从治理到共情——平台伦理的乡村共建之路
  • 在 C# 中,问号 ? 的一些作用
  • HTML初学者第五天
  • 启动式service
  • 强化学习(第三课第三周)
  • 在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
  • Kubernetes 配置管理
  • odoo代码分析(一)
  • 认识泛型、泛型类和泛型接口
  • 大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(2):LangChain + LlamaIndex 实现
  • Java学习第七十七部分——JVM运行时数据区
  • Java同步锁性能优化:15个高效实践与深度解析
  • 7月26号打卡
  • C++/CLI与标准C++的语法差异(一)
  • ASP.NET Core MVC中taghelper的ModelExpression详解
  • Spring Boot 3 如何整合 MinIO 实现分布式文件存储?
  • MyBatis-Plus 通用 Service 详解:IService 与 CRUD 操作全解析