他山之石,可以攻玉
Unreal在4.2x版本开始添加了通过Tool Menu 为引擎添加菜单的功能,用户可以通过Python在指定的Tool Menu Anchor位置添加菜单项。
TAPython在v1.0.10中添加了对Tool Menu Anchor的支持,这样可以将菜单和选项添加到任何Tool Menu 可以添加的位置。
举例¶
Component 右键菜单¶
例如下面的代码,就可以将一个菜单项添加到Component的右键菜单中。这里使用的Tool Menu Anchor是"Kismet.SubobjectEditorContextMenu"。
MenuConfig.json
"Kismet.SubobjectEditorContextMenu": {
"HasSection": false,
"items": [
{
"name": "Kismet.SubobjectEditorContextMenu",
"command": "print(unreal.PythonBPLib.get_selected_components())", "icon": { "style": "ChameleonStyle", "name": "Resources.PythonChameleonIcon_40x_png" }
}]
},
每个使用Tool Menu Anchor的菜单项在MenuConfig.json都是独立的。其他与"OnMainMenu"
和"OnSelectFolderMenu"
是平级的。
当然,除了直接执行Python命令,也可以通过"ChameleonTools"字段,指定点击后打开的Chameleon Tool。所以在其他菜单项中可用的字段,在这里也都一样有效。
值得一提的是,当我们在Toolbar中通过Tool Menu Anchor添加菜单项的时候,默认添加的Section header,会让按钮看起来很奇怪,所以这里我们通过"HasSection": false
,来屏蔽这个Section header。
TIP
当不写"HasSection"字段时,默认为true,即添加Section header
刷新Tool Menu¶
Tool Menu Anchor 是Unreal Engine内置的功能,它的注册实际与TAPython的其他菜单项的实际不同。使用Tool Menu Anchor的字段添加的菜单项,现在无法做到随时的自动dong刷新,所以需要手动刷新。这里我们使用了一个Cmd调试命令TAPython.RefreshToolMenus
来刷新Tool Menu。如上图,我们在修改了MenuConfig.json后,可以通过在Console中输入TAPython.RefreshToolMenus
来刷新Tool Menu。
TIP
这是一个Cmd调试命令,不是Python命令哦
TAPython.RefreshToolMenus
Tool Menu Anchor 大全¶
我在UE5.1中通过脚本扫了一下所有的Tool Menu Anchor,下面是我整理的一个列表,供参考。
可用的Tool Menu Anchor包括但不限于以下这些:
- AssetEditor.AnimationBlueprintEditor.MainMenu
- AssetEditor.AnimationEditor.MainMenu
- AssetEditor.SkeletalMeshEditor.ToolBar
- AssetEditor.StaticMeshEditor.ToolBar
- ContentBrowser.AddNewContextMenu
- ContentBrowser.AssetContextMenu
- ContentBrowser.AssetContextMenu.AimOffsetBlendSpace
- ContentBrowser.AssetContextMenu.AnimBlueprint
- ContentBrowser.AssetContextMenu.AnimMontage
- ContentBrowser.AssetContextMenu.AnimSequence
- ContentBrowser.AssetContextMenu.BlendSpace
- ContentBrowser.AssetContextMenu.BlendSpace1D
- ContentBrowser.AssetContextMenu.CameraAnim
- ContentBrowser.AssetContextMenu.DatasmithScene
- ContentBrowser.AssetContextMenu.PoseAsset
- ContentBrowser.AssetContextMenu.SkeletalMesh
- ContentBrowser.AssetContextMenu.SkeletalMesh.CreateSkeletalMeshSubmenu
- ContentBrowser.AssetContextMenu.Skeleton.CreateSkeletalMeshSubmenu
- ContentBrowser.AssetContextMenu.SoundWave
- ContentBrowser.AssetContextMenu.StaticMesh
- ContentBrowser.AssetContextMenu.World
- ContentBrowser.AssetViewOptions
- ContentBrowser.AssetViewOptions.PathViewFilters
- ContentBrowser.DragDropContextMenu
- ContentBrowser.FolderContextMenu
- ContentBrowser.ItemContextMenu.PythonData
- ContentBrowser.ToolBar
- ControlRigEditor.RigHierarchy.ContextMenu
- ControlRigEditor.RigHierarchy.DragDropMenu
- Kismet.SubobjectEditorContextMenu
- Kismet.SCSEditorContextMenu
- LevelEditor.ActorContextMenu.AssetToolsSubMenu
- LevelEditor.ActorContextMenu.LevelSubMenu
- LevelEditor.InViewportPanel
- LevelEditor.LevelEditorSceneOutliner.ContextMenu.LevelSubMenu
- LevelEditor.LevelEditorToolBar
- LevelEditor.LevelEditorToolBar.AddQuickMenu
- LevelEditor.LevelEditorToolBar.User
- LevelEditor.LevelViewportToolBar.Options
- LevelEditor.LevelViewportToolBar.View
- LevelEditor.MainMenu
- LevelEditor.MainMenu.Build
- LevelEditor.MainMenu.File
- LevelEditor.MainMenu.Help
- LevelEditor.MainMenu.Select
- LevelEditor.MainMenu.Tools
- LevelEditor.MainMenu.Window
- LevelEditor.StatusBar.ToolBar
- MainFrame.MainMenu.Asset
- MainFrame.MainMenu.Tools
- MainFrame.MainMenu.Window
- StatusBar.ToolBar.SourceControl