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);
    }
}
相关推荐
留待舞人归4 天前
【Unity3D优化】AssetBundle的压缩格式优化
游戏·unity·游戏引擎·unity3d
Thomas游戏开发7 天前
Unity3D游戏排行榜制作与优化技术详解
前端框架·unity3d·游戏开发
Thomas_YXQ7 天前
Unity3D Shader 简析:变体与缓存详解
开发语言·前端·缓存·unity3d·shader
Thomas游戏开发8 天前
Unity3D 架构师如何处理大世界地图技术详解
前端框架·unity3d·游戏开发
Thomas游戏开发9 天前
Unity3D MMORPG 任务系统的架构与设计详解
前端框架·unity3d·游戏开发
jojo的奇妙前端20 天前
unity - 排行榜 - 头像(二)
unity3d
scott.cgi22 天前
「Unity3D」在Unity中使用C#控制显示Android的状态栏
unity·unity3d·android状态栏·c#控制android状态栏·unity显示状态栏
Thomas_YXQ1 个月前
Unity3D项目开发中的资源加密详解
游戏·3d·unity·unity3d·游戏开发
Thomas_YXQ1 个月前
Unity3D 动态骨骼性能优化详解
开发语言·网络·游戏·unity·性能优化·unity3d
程序员海军1 个月前
腾讯混元3D更新:人人都可以轻松制作一个3D模型
前端·openai·unity3d