参考来源:https://blog.l0v0.com/posts/cad78e0d.html

这里推荐下智商帝的博客,干货多多。

在程序主菜单下添加自定义菜单

s1.png

import unreal

# Get the main menu class
menus = unreal.ToolMenus.get()
menu_name = 'LevelEditor.MainMenu'
menu = menus.find_menu(menu_name)

# Custom menu parameters
owner = menu.get_name()
section_name = 'PythonTools'
name = 'lingyunFX'
label = 'lingyunFX'
tool_tip = 'This is some python toolset.'

# Add and refresh
menu.add_sub_menu(owner, section_name, name, label, tool_tip)
menus.refresh_all_widgets()

为菜单添加按钮

s2.png

import unreal

# Get the menu class
menus = unreal.ToolMenus.get()
menu_name = "LevelEditor.MainMenu.lingyunFX"
menu = menus.find_menu(menu_name)

# Set the button type and label
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY)
entry.set_label('TEST BUTTON 01')

# Set button command
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print "this is test button"')

# Add and refresh
section_name = ''
menu.add_menu_entry(section_name, entry)
menus.refresh_all_widgets()

section_name 这个参数后面会说到它,其实是一个定位的作用。

关于add_sub_menu和add_menu_entry的参数,可以查看官方文档:

https://docs.unrealengine.com/en-US/PythonAPI/class/ToolMenu.html

(吐槽一下简陋的官方文档,就给了个参数名)

添加工具架按钮

import unreal

# Get the menu class
menus = unreal.ToolMenus.get()
menu_name = "LevelEditor.LevelEditorToolBar"
menu = menus.find_menu(menu_name)

# Set the button type and label
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.TOOL_BAR_BUTTON)
entry.set_label("Test Button")

# Set button command
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print "Hello World!"')

# Add and refresh
section_name = 'Settings'
menu.add_menu_entry(section_name, entry)
menus.refresh_all_widgets()

s3.png

这里就可以看到section_name参数的意义,它会将按钮放置在Settings集的最后。

如果想把按钮放在其它地方,就得先知道控件的名称。

如何知道这些控件的名字,在这里开启:

s4.png

开启后重启Unreal就可以看到,如下图所示:

s5.png

右键菜单扩展

s6.png

这里想把按钮放到Source Control类别下,所以需要去查看控件名。

通过上面的方法可以看到,名称为:PathContextSourceControl

s7.png

找到控件名,则可以用代码实现效果:

import unreal

# Get the menu class
menus = unreal.ToolMenus.get()
menu_name = "ContentBrowser.FolderContextMenu"
menu = menus.find_menu(menu_name)

# Set the button type and label
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY)
entry.set_label("Right Click Test")

# Set button command, add button
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print "entry test"')
menu.add_menu_entry('PathContextSourceControl', entry)

右键菜单是点击的时候实时刷新的,所以这里不需要再调用refresh_all_widgets()

(完)


From zero to hero