本文总结一下在UI Toolkit中使用Unity编辑器的Contextual Menu,译为上下文或右键菜单。
什么是Contextual Menu?
Contextual Menu(上下文菜单)是在Unity编辑器中点击右键时出现的菜单,跟平时操作WIN一样,当用户右键单击标签时显示一组选项。

UI Toolkit提供了一种将上下文菜单添加到你自己的UI中的机制,下面是实现方法。
如何实现上下文菜单
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public sealed class ExampleWindow : EditorWindow
{
public void CreateGUI()
{
var element = new VisualElement();
element.style.backgroundColor = Color.red;
element.style.width = 100;
element.style.height = 100;
// 生成上下文操纵器
var manipulator = new ContextualMenuManipulator(evt =>
{
// 菜单
evt.menu.AppendAction("Example Menu", action => Debug.Log("Execute Example"));
// 禁用的菜单
evt.menu.AppendAction("Disabled Menu", action => Debug.Log("Disabled Menu"),
DropdownMenuAction.Status.Disabled);
// 分隔符
evt.menu.AppendSeparator();
// 选中菜单
evt.menu.AppendAction("Checked Menu", action => Debug.Log("Checked Menu"),
DropdownMenuAction.Status.Checked);
// 如何使用用户数据(任意数据)
evt.menu.AppendAction("Menu with User Data",
action => Debug.Log(action.userData),
action => DropdownMenuAction.Status.Normal
, "This is user data");
});
// 当你为操纵器的目标设置可视化时,
// 右键单击此VisualElement时,将显示上下文菜单
manipulator.target = element;
rootVisualElement.Add(element);
}
[MenuItem("Window/Example")]
private static void Open()
{
GetWindow<ExampleWindow>();
}
}
ContextualMenuManipulator
通过创建一个target
视觉元素并将其分配给其属性,右键单击该视觉元素时将显示上下文菜单。
创建的上下文菜单有:
- Example Menu
- Disabled Menu
- Checked Menu
- Menu with User Data
检查示例最终结果
接下来,检查上面创建的最终结果是否正确。从窗口 → 示例打开窗口并右键单击红色元素,将得到下面的结果。

动态添加菜单
ContextualMenuPopulateEvent
允许在右键单击注册的UI时打开上下文菜单时接收回调。通过使用它并编写以下内容,可以动态添加或覆盖已注册UI的上下文菜单。
element.RegisterCallback<ContextualMenuPopulateEvent>(evt =>
{
// 将菜单添加到由元素打开的ContextualMenu中
evt.menu.AppendAction("Runtime Example Menu", action => Debug.Log("Execute Example"));
// 你也可以删除和覆盖菜单
//evt.menu.ClearItems();
//evt.menu.RemoveItemAt(0);
});
…
以上是关于Contextual Menu上下文菜单的全部内容。如果你有任何反馈,请随时在本页面下方留言。