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);
}
}