找回密码
 立即注册
查看: 377|回复: 0

Unreal Python工具开发【2】:拓展编辑器菜单入口

[复制链接]
发表于 2022-9-3 18:53 | 显示全部楼层 |阅读模式
作者 @ocarina 2022-07-18
首先介绍Unreal Python工具开发的入手方法,和开发中遇到的常用的开发模块API。适应项目中的需求变化进行快速开发。同时会独立整理涉及到的软件工程、计算机语言设计等相关知识。
目录

快速启动python开发环境
Part1:蓝图控件调用脚本
Part2:拓展编辑器菜单入口
[Part3:启动自动加载]
[Part4:UI管理]

快速启动Python开发环境

开发工具:VsCode + Unrela Engine
注意事项:
文档编写所用引擎版本Unreal4.27\Unreal5.0 Unreal默认支持Python 版本为Python3.7.7 Unreal Python工具不支持游戏Runtime运行启动插件:
Editor Scripting Utilities Python Editor Script Plugin
官方启动文档:Unreal Scripting the Editor using Python
官方Python API文档:Unreal Python API

快速调用Python工具:

内容适宜范围:不熟悉UE python开发,希望快速在引擎内组织、调用python脚本测试,想要了解UE提供的接口。
python工具我们将通过制作Plugin Module (UE模块参考文档:Modules)形式接入引擎。这样可以在启动引擎时编译你的工具,并将开发的工具以插件的形式接入引擎,有较好的通用性,开发、使用和发布上更方便。
在虚幻引擎中有很多中方法调用脚本(见文档),考虑到开发迭代和易上手的需要,本文将围绕两种方法进行介绍:
蓝图控件调用本地脚本编辑器调用
蓝图:使用蓝图控件调用python,优点是插件可以完全通过蓝图脚本来制作交互界面和组织交互逻辑、非常快捷地进入测试开发。 对于熟悉蓝图、不熟悉UE接口的开发者大概需要10分钟就可以解决前期工作,快速入手。 编辑器调用: 通过编辑器接入引擎,使用更加便利、同时支持独立窗口(Qt)、需要编写逻辑入口。如果有C++插件开发经验,也可很快接入,用Python减少开发的工作量。

Part2:拓展菜单入口

有时我们希望能够在引擎中的菜单上放置按钮激活Python脚本,比起输入命令行执行脚本更加便利使用。Unreal也提供了相关接口用于扩展Unreal编辑器菜单,以下介绍几种常用的接口,分别对应了菜单上不同位置的扩展。通过熟悉一下几个接口,我们可以将其放置到自己的脚本中使用。


  • MainMenu
编辑器中的位置:


扩展代码示例:
import unreal
menus = unreal.ToolMenus.get()

menu_name = "LevelEditor.MainMenu" menu = menus.find_menu(menu_name)
# NOTE 生成类型改为 Toolbar 的按钮
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.TOOL_BAR_BUTTON) entry.set_label("Customs Btn")

# NOTE 注册执行的命令
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print("MainMenu entry 触发测试")') menu.add_menu_entry('File',entry)

# NOTE 添加刷新才能立刻看到添加的效果
menus.refresh_all_widgets()2. LevelEditorToolBar
编辑器中的位置:


扩展代码示例:
import unreal
menus = unreal.ToolMenus.get()
menu_name = "LevelEditor.LevelEditorToolBar" menu = menus.find_menu(menu_name)

# NOTE 生成类型改为 Toolbar 的按钮
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.TOOL_BAR_BUTTON) entry.set_label("Custom Btn")

# NOTE 注册执行的命令
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print("LevelEditorToolBar entry 触发测试")') menu.add_menu_entry('File',entry)

# NOTE 添加刷新才能立刻看到添加的效果
menus.refresh_all_widgets()3. FolderContextMenu
编辑器中的位置:


扩展代码示例:
import unreal
menus = unreal.ToolMenus.get()

menu_name = "ContentBrowser.FolderContextMenu" menu = menus.find_menu(menu_name)

entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY) entry.set_label("测试 entry")
# NOTE 注册执行的命令
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print("FolderContextMenu entry 触发测试")') menu.add_menu_entry('AssetContextSourceControl',entry)

menus.refresh_all_widgets()4. AssetContextMenu
编辑器中的位置:



扩展代码示例:
import unreal
menus = unreal.ToolMenus.get()

menu_name = "ContentBrowser.AssetContextMenu" menu = menus.find_menu(menu_name)

entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY) entry.set_label("测试 entry")
# NOTE 注册执行的命令
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print("AssetContextMenu entry 触发测试")') menu.add_menu_entry('AssetContextSourceControl',entry)

menus.refresh_all_widgets()5. AddNewContentMenu
编辑器中的位置:




扩展代码示例:
import unreal
menus = unreal.ToolMenus.get()
menu_name = "ContentBrowser.AddNewContextMenu"
menu = menus.find_menu(menu_name)
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY) entry.set_label("测试 entry")
# NOTE 注册执行的命令
typ = unreal.ToolMenuStringCommandType.PYTHON
entry.set_string_command(typ, "", 'print("AddNewContextMenu entry 触发测试")') menu.add_menu_entry('AssetContextSourceControl',entry)
menus.refresh_all_widgets()
本部分主要参考了同事的文章。 Unreal Python 进阶菜单扩展

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 12:25 , Processed in 0.092525 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表