Unity | 菜单组件使用总结

IMGUI - GenericMenu 类

效果:

限制:只能在 IMGUI 中使用,不能在 UI Toolkit 中使用。不能控制菜单的宽度。

文档:docs.unity3d.com/ScriptRefer...

使用 UnityEditor 中的 GenericMenu 类。为了让 Menu 出现在点击的位置,使用 GUILayoutUtility.GetLastRect() 来获取位置。

C# 复制代码
using UnityEditor;
void OnGUI() {
    if (GUILayout.Button("···"))
    {
        GenericMenu menu = new GenericMenu();
        menu.AddItem(new GUIContent("Update"), false, () => { OnInstall(config); });
        menu.AddSeparator("");
        menu.AddItem(new GUIContent("Remove"), false, () => { OnRemove(config); });
        var lastRect = GUILayoutUtility.GetLastRect() ;
        menu.DropDown(lastRect);
    }
}

关于展示方法:

  • public void ShowAsContent()

    • 右键点击的时候菜单出现在鼠标位置
  • public void DropDown(Rect position)

    • 在指定的位置展示菜单

UI Toolkit - GenericDropdownMenu

效果:

文档:Class GenericDropdownMenu | UI Toolkit | 1.0.0-preview.18

限制:仅在 UI Toolkit 中使用。 用法:DropDown 方法中传入希望出现的位置。通过 VisualElement 的 worldBound.position 获取合适的位置。

C# 复制代码
using UnityEngine.UIElements;
public class LauncherWindow : EditorWindow {
    private void CreateGUI() {
        GenericDropdownMenu menu = new GenericDropdownMenu();
        menu.AddItem("Update", false, () =>
        {
            Debug.Log("Update");
        });
        menu.AddItem("Remove", false, () =>
        {
            Debug.Log("Remove");
        });
        
        dropdown.clicked += () =>
        {
            var pos = dropdown.worldBound.position;
            menu.DropDown(new Rect(new Vector2(pos.x - 96, pos.y - 76), new Vector2(96, 100)), dropdown, true);
        };
    }
}

UI Toolkit - 事件 Contextual menu events

效果:

限制:只有使用右键点击才能弹出菜单!不能控制位置。只能在 UI Toolkit 中使用。

使用:

  • 设置 ContextualMenuManipulator 的回调函数和目标元素
  • 在目标元素被右键点击时,触发回调函数
  • 在回调函数的 menu 参数中,对菜单添加选项和点击选项时的回调函数
C# 复制代码
// 右键点击 element 的时候弹出菜单

void InstallManipulator(VisualElement element)
{
    ContextualMenuManipulator m = new ContextualMenuManipulator((e) =>
    {
        e.menu.AppendAction("Update", (menuItem) =>
        {
            Debug.Log("Update");
        }, DropdownMenuAction.AlwaysEnabled);
        e.menu.AppendAction("Remove", (menuItem) =>
        {
            Debug.Log("Remove");
        }, DropdownMenuAction.AlwaysEnabled);
    }) ; 
    m.target = element ; 
}

文档:docs.unity3d.com/Manual/UIE-...

C# 复制代码
// 修正文档里的错误写法:DropdownMenu.MenuAction -> DropdownMenuAction
void InstallManipulator(VisualElement element)
{
    ContextualMenuManipulator m = new ContextualMenuManipulator(MyDelegate);
    m.target = element;
}

void MyDelegate(ContextualMenuPopulateEvent e)
{
    // Modify event.menu
e.menu.AppendAction("My action", DisplayProperties, DropdownMenuAction.AlwaysEnabled);
}

void DisplayProperties(DropdownMenuAction menuItem)
{
    // ...
}

UI Toolkit - ToolbarMenu

限制:不止有弹出菜单,上图「Menu Text」部分也是包含在组件里的。

C# 复制代码
using UnityEditor.UIElements;
class LauncherWindow : EditorWindow {
    private void CreateGUI() {
        var menuContainer = root.Q<VisualElement>("Menu");
        var toolbarMenu = new ToolbarMenu() { text = "Menu Text" };
        
        toolbarMenu.menu.AppendAction("Menu item 1", (a) => { Debug.Log("Menu item 1 clicked"); });
        toolbarMenu.menu.AppendAction("Menu item 2", (a) => { Debug.Log("Menu item 2 clicked"); });
        toolbarMenu.menu.AppendAction("Menu item 3", (a) => { Debug.Log("Menu item 3 clicked"); });
        
        menuContainer.Add(toolbarMenu);
    }
}
相关推荐
Thomas_YXQ10 小时前
Unity3D Lua集成技术指南
java·开发语言·驱动开发·junit·全文检索·lua·unity3d
Thomas_YXQ16 小时前
Unity3D IK解算器技术分析
开发语言·搜索引擎·unity·全文检索·unity3d·lucene
Thomas游戏开发2 天前
Unity3D Audio Mixer自定义调制教程
前端框架·unity3d·游戏开发
Thomas游戏开发3 天前
Unity3D动态遮挡剔除技术详解
前端·unity3d·游戏开发
Thomas_YXQ5 天前
Unity3D ILRuntime与Scripting Backend整合指南
服务器·开发语言·unity·unity3d
程序员茶馆6 天前
【unity】Vulkan模式下部分Android机型使用VideoPlayer组件播放视频异常问题
游戏·unity·游戏引擎·图形渲染·unity3d·游戏开发
Thomas_YXQ9 天前
Unity3D 测试驱动开发(TDD)框架设计
java·开发语言·驱动开发·全文检索·unity3d·lucene·tdd
Thomas游戏开发19 天前
Unity3D事件驱动架构设计指南
前端框架·unity3d·游戏开发
古力德22 天前
Unity中造轮子:定时器
c#·unity3d
Mapmost24 天前
【数据融合实战手册·进阶篇】模型融合总出错?先看看这些“对齐”了没!
unity3d