Bootstrap Chameleon Logo

Menu Tools Anchor

他山之石,可以攻玉

Unreal在4.2x版本开始添加了通过Tool Menu 为引擎添加菜单的功能,用户可以通过Python在指定的Tool Menu Anchor位置添加菜单项。

TAPython在v1.0.10中添加了对Tool Menu Anchor的支持,这样可以将菜单和选项添加到任何Tool Menu 可以添加的位置。

Menu items created with Tool Menu Anchor

举例

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。

image_name

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

参考