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_YXQ13 天前
Unity3D项目为什么要使用FairyGUI
开发语言·unity·游戏引擎·unity3d·游戏开发
nicepainkiller13 天前
Flutter 内嵌 unity3d for android
flutter·unity3d
Thomas_YXQ1 个月前
Unity3D ngui和ugui区别与优缺点详解
服务器·游戏·unity·unity3d·游戏开发
Thomas_YXQ1 个月前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
Thomas游戏开发1 个月前
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前端框架·unity3d·游戏开发
大眼睛姑娘1 个月前
unity运行状态下移动、旋转、缩放控制模型
unity3d
lin zaixi()1 个月前
手把手教你写Unity3D飞机大战(2)天空盒布置
unity3d
Thomas_YXQ2 个月前
Unity3D中管理Shader效果详解
开发语言·游戏·unity·unity3d·游戏开发
羊羊20352 个月前
线性代数:Matrix2x2和Matrix3x3
线性代数·数学建模·unity3d
天人合一peng2 个月前
Unity hub登录时一直无法进入license
unity3d