赞
踩
·本文为B站系列教学视频《使用 UnrealEnginPython 插件进行UE4中的Python开发》——《Day 01 初识 UnrealEnginePython》的学习笔记,UP主为腾讯游戏策划、虚幻社区贡献者 世欺子。
本节课对基于虚幻引擎(Unreal Engine
)的 Python
集成开发插件 UnrealEnginePython
进行简要介绍,接着在虚幻引擎(Unreal Engine)5.0.3 版本中安装 UnrealEnginePython
,并为插件安装 Python
第三方库 Matplotlib
,最后对 Python
集成开发环境进行测试。
在 Unreal Engine
中想要搭建深度学习、强化学习的开发环境,就需要使用 UE
中C++
的蓝图进行转写,操作起来比较麻烦;如果能在 UE
中 直接集成并使用 Python
开发,就会比较方便。想要实现这个目标,有两种方式:
UE
官方自带的 Python编辑器脚本插件(Python Editor Script Plugin
),官方文档为《使用Python脚本化运行虚幻编辑器》;UnrealEnginePython
插件,Github
主页 https://github.com/20tab/UnrealEnginePython。Python Editor Script Plugin
仅可以通过控制台调用和运行在外部 IDE
编写的 Python
代码,并且只可以在 Editor
(编辑环境)下使用Python相关代码模块,如果想要在Runtime
中也使用,则需要对其进行 dll
封装;UnrealEnginePython
内嵌了一个 IDE
,我们不需要离开 UE
到外部去编写 Python
代码,并且在 Editor
和 Runtime
都可以直接使用Python相关代码模块。摘自 UnrealEnginePython
的 Github
主页 https://github.com/20tab/UnrealEnginePython:
Unreal Engine
中(Editor & Runtime)嵌入整个 Python VM
的插件。UE
内部 API
及其反射系统,可以使用该插件编写其他插件、自动化任务以及编写单元测试和实现游戏元素。PyActor
(对应 UE
中的 Actor
类)、PyPawn
(对应 UE
中的 Pawn
类)、PyCharacter
(对应 UE
中的 Character
类)以便在游戏中将Python进行“温和”(非破坏性)的集成。Python
代码,可以从已经打包的游戏中构建一个全新的游戏。
(图源:《在Unreal Engine中使用Python开发引擎端流程工具-(一)学习路线篇》)
本人主要使用 Unreal Engine 5.0.3
和 Visual Studio 2022
进行学习,两者的安装和配置可以参阅 Unreal Engine
官方文档 《安装虚幻引擎》 以及 《设置Visual Studio》。
参阅UP主提供的开发环境配置笔记 《UE 5.0 使用 Unreal Engine Python插件进行 Runtime Python 开发》。
新建“第三人称游戏”工程项目 UEPython_Tutorial
,项目默认设置这里我选择 C++(也可以选择蓝图)、不含初学者内容。UnrealEnginePython
此版本要求使用C++工程来进行编译,蓝图工程则可以使用新建C++类的方式,新建任意C++类,来为项目添加C++代码。
前往 https://github.com/crazytuzi/UnrealEnginePython,下载 UnrealEnginePython
源代码,该版本的 UnrealEnginePython
支持 UE 4.27.2 和 UE 5.0.3 。
下载完毕后将压缩包解压,并将文件夹 UnrealEnginePython_master
重命名为 UnrealEnginePython
。
然后拷贝至 UEPython_Tutorial
项目文件夹下的 Plugins
目录(我没有在项目目录下看见 Plugins
目录于是就自己新建了一个)
关闭项目 UEPython_Tutorial
并重新打开,弹出编译窗口,选择 是(Y)
来对插件进行编译。
在 UEPython_Tutorial/Config/DefaultEngine.ini
中添加 Python
源,笔者使用 UE5
引擎自带的 Python
源(代码如下)。
[Python]
Home=../../../Engine/Binaries/ThirdParty/Python3/Win64
使用此配置就可以考虑将 Runtime
下调用的 pip
包也一并安装到引擎目录下的 Python
中。
Runtime 和 Editor
- 具体的流程架构,需要分离好Editor和Runtime Data,Editor依赖于Runtime Data,但Runtime Data不能依赖于Editor。 —— 《基于行为树的MOBA技能系统:技能系统与可视化节点技能编辑器》
- Runtime:任何编译目标都会加载该模块;Editor:只在编辑器下加载该模块;LoadingPhase:描述什么时候加载该模块,这个比较重要,依赖其他模块的模块应该在依赖模块之后加载,不然就会报错找不到对应模块。——《虚幻引擎编译系统总结》
- 《EHostType::Type》
- Editor、Development、Runtime的区别:Edit和Development是并行关系都依赖RunTime文件可以用RunTime文件下的库,但是Edit和 Development不能用Runtime下的库,Runtime与发布后的Game相关。——《UE4初学问题》
打包项目时插件会自动将 UE5
引擎自带的 Python
源拷贝至打包后的 Engine/Binaries/
文件夹下,无需自己再手动拷贝 Python
环境。
此步非常关键,决定了在《使用Unreal Engine Python插件进行UE4中的Python开发》学习笔记6 打包后的项目能否正常启动。6. 查看插件是否成功安装。在 UE
窗口的 菜单栏 选择 “编辑”,然后在弹出的下拉菜单中选择 “插件”,可以看到 UnrealEnginePython_master
已经成功安装,并且 内容浏览器 的 Content
目录下面多出一个 Scripts
文件夹(存放使用 UnrealEnginePython
内置 IDE
编写的 Python
脚本)。
在 UE
窗口的 菜单栏 中选择 “窗口”,然后在弹出的下拉菜单中点击 Python Editor
打开内置的 IDE
。
在 Python Editor
窗口工具栏上点击 New
按钮新建一个 Python
脚本,此时 UE
窗口右下角会出现 “已检测到1项源内容文件的变更” 的提示消息框,可以勾选 “不再询问”,然后选择 “导入”,这样每次保存 Python
脚本时,都会实时去更新 Scripts
文件夹下的内容。
下面在 IDE
中写一段简单的代码进行测试:
def HelloWorld():
print("Hello, World!")
HelloWorld()
在 Python Editor
窗口工具栏上点击 Save
按钮保存代码。在 UE
窗口的 菜单栏 中选择 “窗口”,然后选择 “输出日志”,可以看到 “输出日志” 窗口出现在 UE
窗口下方。
4. 点击 Python Editor
窗口工具栏的 Execute
按钮执行 Python
脚本,可以看到 “输出日志” 窗口打印出 “Hello, world!”。
打开命令提示符,安装 Numpy
库和 Matplotlib
库,输入命令行:
C:\Users\Xavicii>d:
D:\>cd D:\Epic Games\UE_5.0\Engine\Binaries\ThirdParty\Python3\Win64\
D:\Epic Games\UE_5.0\Engine\Binaries\ThirdParty\Python3\Win64\>python -m pip install numpy
D:\Epic Games\UE_5.0\Engine\Binaries\ThirdParty\Python3\Win64\>python -m pip install matplotlib
注意这里的操作和教学视频中的不同:教学视频中使用的是 UE4.27
版本,并且将 Matplotlib
库直接安装在 UnrealEnginePython
插件的文件夹 \Binaries\Win64
下。而本人使用的 UE5.0.3
版本,根据UP主提供的 UE 5.0
开发环境配置笔记 《UE 5.0 使用 Unreal Engine Python插件进行 Runtime Python 开发》,需要将 Matplotlib
库直接安装在对应引擎版本的Python文件夹下,否则在运行后面的测试代码是会出现各种报错,比如找不到 Matplotlib
库、Numpy
库 import
错误等等。
复制 UP主提供在 http://cucvr.com/?/article/25 中的测试代码到 Python Editor
,测试代码的目的是在 UE
中生成图形纹理资产,以检验 Matplotlib
能否正常装载,:
'''在内存中生成纹理,绘制图形,将图形数据传输到纹理内存,将其另存为资产并打开相关的编辑器'''
import unreal_engine as ue
# EPixelFormat defines the various pixel formats for a texture/image, we will use RGBA with 8bit per channel
from unreal_engine.enums import EPixelFormat
import matplotlib
# set the Agg renderer as we do not need any toolkit
matplotlib.use('Agg')
import matplotlib.pyplot as plt
# set texture/plot dimensions and dpi, ensure dpi is a float !
width = 1024
height = 1024
dpi = 72.0
# create a new figure with the specified sizes
fig = plt.figure(1)
fig.set_dpi(dpi)
fig.set_figwidth(width/dpi)
fig.set_figheight(height/dpi)
# plot a simple graph with a label on the y axis
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
# draw the graph (in memory)
fig.canvas.draw()
# create a texture in memory (will be saved later)
texture = ue.create_transient_texture(width, height, EPixelFormat.PF_R8G8B8A8)
# copy pixels from matplotlib canvas to the texture as RGBA
texture.texture_set_data(fig.canvas.buffer_rgba())
# save the texture
texture.save_package('/Game/FirstGraphTexture')
# open its editor
ue.open_editor_for_asset(texture)
点击 Python Editor
窗口工具栏的 Execute
按钮执行 Python
脚本,可以看到“Texture2D_8”纹理图案生成并被保存到资产管理器中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。