python入门教程编辑器
UE4Python脚本编辑器扩展
Python+编辑器扩展
1. 各种菜单的扩展
1.1 主菜单内添加⼀个⼦菜单
mainMenu = menus.find_menu('LevelEditor.MainMenu') // 到主菜单
ownerName = _name()
# 该名称⽤于标识⼀个菜单下的分区名,如果menu的sectionName⼀致,它们会被放在⼀起
sectionName = 'PythonTools'
3dmax入门学习免费subMenuName = 'MenuTest'
subMenuLabel = 'MenuTest1'
subMenuTip = 'This is menutest1'
menus.add_sub_menu(ownerName, sectionName, subMenuName, subMenuLabel, subMenuTip)
# 刷新窗⼝
想要查看ue编辑器内的各个sectionname,可以在EditorPreference中的Misc中打开相应配置,打开⼀个菜单时会刷新对应的widget,如果想要窗⼝全部刷新则可以执⾏如下python命令
py ().refresh_all_widgets()
1.2 菜单项下添加⼀个按钮
menus = ()
# 根据上⾯的subMenuName到⽬标菜单
targetMenu = menus.find_menu('LevelEditor.MainMenu.MenuTest')
menuEntry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.MENU_ENTRY)
menuEntry.set_label('Test Button 1')
导轨滑块是怎么驱动的menuEntry.set_string_command(unreal.ToolMenuStringCommandType.PYTHON, '', 'print('this is button 1')')
sectionname = ''
targetMenu.add_menu_entry(sectionname, menuEntry)
按钮的命令:
unreal.ToolMenuStringCommandType.PYTHON,后⾯的字符串为python代码;
unreal.ToolMenuStringCommandType.COMMAND,后⾯的字符串为cmd命令,如使⽤py xxx.py执⾏脚本;
等同于输出⽇志中的python控制台和cmd控制台的py命令;
1.3 为ToolBar添加按钮
# 和上⾯的两个区别,⾸先是targetMenu,然后是Entry的类型
targetMenu = menus.find_menu('LevelEditor.ToolEditorToolBar')
menuEntry = unreal.ToolMenuEntry(type=unreal.MultiBlockType.TOOL_BAR_BUTTON)
1.4 内容浏览器右键菜单扩展
targetMenu = ('ContentBrowser.FolderContextMenu')
entry = unreal.ToolMenuEntry(type=unreal.MultiBlockType,MENU_ENTRY)
# 选中的资源
_selected_objects()
1.5 关卡视⼝中actor右键菜单
assets = _selected_level_actors()
for actor in assets:
但是可以修改bp的默认值,如下所⽰:
我们需要调⽤_default_object来获取CDO(Class Default Object),然后使⽤set_editor_property来完成功能;
bp_class = unreal.load_class(None, '/Game/NewBlueprint.NewBlueprint_C')
cdo = _default_object(bp_class)
cdo.set_editor_property('var', 102)
cdo.call_method('TestFunc', (actor,))
上述列出的问题虽然python内不能解决,但是能够通过蓝图扩展来完成;
基于python的扩展依然还只是在pie中使⽤;
2. 基础实践
2.1 ⽇志系统
unreal.log() : python中的print也会在内部通过unreal.log()来处理
unreal.log_warning()
unreal.log_error()
2.2 处理资源
如果需要在项⽬中处理资源,必须使⽤Unreal Python API来完成,⽽不能使⽤Python内置模块来处理磁盘资源⽂件,⽐如资源的移动,如果不适⽤unreal的api则会导致引⽤失效,所以要尽量使⽤unreal.EditorAssetLibrary或unreal.AssetTools
layer怎么记忆尽可能使⽤虚幻类型
⽐如数学类等,要尽可能使⽤Unreal API提供的类型,如unreal.Vector()
2.3 使⽤json配置来管理各种扩展
os.open/read/write
import json
json.dumps/loads
3.其它常⽤api
3.1 资源相关
资源相关的api都在这个库⾥:unreal.EditorAssetLibrary
资源的保存:save_asset()
3.2 ⼯程路径
系统库:unreal.SystemLibrary
获取项⽬路径:get_project_directory()
4.结合pyqt5的进阶实践
本想使⽤ue4的api来打开⼀个⽂件对话框,但是没有到,⽹上有⼀些使⽤C++的扩展;
因此就想到了pyqt5也可以完成,⽽且ue4也可以调⽤python,这样就不⽤在C++层处理了,但是这只能⽤于编辑器模式下;
4.1 打开⼀个⽂件对话框
import unreal
import os
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QDesktopWidget, QFileDialog, QLabel) class Example(QFileDialog):
def __init__(self):
super().__init__()
self.open_folder()
def open_folder(self):
path = ExistingDirectory(self, u'选择⽂件夹', _project_directory())
print(path)
app = QApplication(sys.argv)
快速搭建web服务器ex = Example()
5. 常见问题
php多线程并发5.1 Python missing classes from unreal module
⼀些模块没有到是因为我们需要安装对应的插件
我们可以使⽤如下⽅式可以遍历到unreal下所有的⼦模块
import unreal
moduels = dir(unreal)
for module in modules:
print(module)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。