本文为B站系列教学视频《使用 UnrealEnginPython 插件进行UE4中的Python开发》——《Day 02 使用 Matplotlib 绘制贴图》的学习笔记,UP主为腾讯游戏策划、虚幻社区贡献者 世欺子。
本节课将使用 UnrealEnginePython
插件来制作红、绿、蓝三色立方体,并根据它们被 “玩家人物” 碰撞的次数来实时更新一个在 “平面” 上展示的 “饼状图” 。
2.1 绘制用于展示“饼状图”的平面
-
在内容浏览器中
Content
目录下单击鼠标右键,在弹出的菜单中选择 “新建文件夹”,将新建的文件夹命名为 “PlottingGraphsTutorial
”,用来保存后面用到的所有资产。
-
在内容浏览器的
..\Content\PlottingGraphsTutorial
目录下单击鼠标右键,在弹出的菜单栏中选择 “蓝图类”(Blueprint Class),然后在 “选取父类” 对话框中选择 “Actor
”,将新创建的 Actor 类命名为 “BP_Plotter
”,表示这是一个用于展示“饼状图”的平面。
-
在内容浏览器中双击 “
BP_Plotter
”,弹出 “BP_Plotter
” 资产编辑窗口,拖拽该窗口到 “ThirdPersonMap
”选项卡的右边,以便于在 “BP_Plotter
” 资产编辑窗口和编辑器主界面之间快速切换。在 “BP_Plotter
” 资产编辑器窗口的 “组件”(Component)面板单击“+添加”(+Add Component)按钮,在弹出的菜单中选择 “平面”(Plane),然后在右侧 “细节” 面板的 “变换”(Transform)选项卡下将此平面的 “缩放”(Scale)设置为 (10.0, 10.0, 1.0)。
-
在 “组件”(Component)面板中拖拽 “
Plane
” 到 “DefaultSceneRoot
” 上,使其成为根组件。单击“+添加”(+Add Component)按钮,在弹出的菜单中选择 “Python
”,然后在右侧 “细节” 面板的 “Python
” 选项卡下将 “Python Module
” 设置为 “Plotter
”,将 “Python Class
” 设置为 “PlotComponent
”。最后单击工具栏的“编译” 按钮,编译好以后,“编译”按钮上会显示一个绿色的“√”,这表示当前操作无误,然后单击其右边的 “保存” 按钮,保存 “BP_Plotter
” Actor类。
-
在左下方 “我的蓝图” 面板 “事件调度器”选项卡右边点击 “+” 按钮,添加 “
OnGraphDataUpdated
” 事件,然后再右侧 “细节” 面板的 “Inputs” 选项卡右边点击 “+” 按钮,添加 “Actor” 类型的 Input,命名为 “Platform
”。最后单击工具栏的 “编译” 和 “保存” 按钮。
-
为 “
BP_Plotter
” 的 “Plane” 组件添加一个简单的 “材质”。切换到 “ThirdPersonMap
”选项卡,在内容浏览器的..\Content\PlottingGraphsTutorial
目录下单击鼠标右键,在弹出的菜单栏中选择 “材质”,将新创建的材质命名为 “M_Graph
”。
-
双击 “
M_Graph
”,在 “材质图表” 编辑器中的空白处单击鼠标右键,新增一个 “TextureSampleParameter2D
” 节点,命名为“Graph
”,然后从该节点的 “RGB
” 引脚处拖拽出一条线,连接 “M_Graph
” 材质结果节点 的 “自发光颜色”(Emissive Color)引脚。最后单击工具栏的 “保存” 按钮。
-
在左侧 “细节” 选项卡 “材质”(Material)选项下将 “着色模型”(Shading Model)设置为 “无光照”(Unlit)。注意,这里如果没有进行设置,后面在进行测试的时候,平面上无法显示扇形图。
-
切换到 “
BP_Plotter
”选项卡,在 “组件” (Components)面板双击 “Plane
”组件,在右侧 “细节” 面板 “材质” 选项卡下将 “元素0” 的材质替换成 “M_Graph
”。
2.2 绘制红、绿、蓝三立方体
-
在内容浏览器的
..\Content\PlottingGraphsTutorial
目录下单击鼠标右键,在弹出的菜单栏中选择 “蓝图类”(Blueprint Class),然后在 “选取父类” 对话框中选择 “Actor
”,将新创建的 Actor 类命名为 “BP_PlotterPlatform
”。双击 “BP_PlotterPlatform
” 进入资产编辑器窗口,在 “组件” (Components)面板添加三个 “立方体” (Cube) ,分别命名为 “Red
”、“Green
”和“Blue
”,然后在 “我的蓝图” 面板添加三个 “整数” 变量,分别命名为 “RedCounter
”、“GreenCounter
” 和 “BlueCounter
”。
-
选中 “组件” (Components)面板的 “
Red
”、“Green
”和“Blue
”,在 “细节” 面板 “碰撞”(Collision)选项卡下的 “碰撞预设值” 改为 “OverlapAll
” 。分别选择 “Red
”、“Green
”和“Blue
”,在 “变换” 选项卡下将它们的 “位置”(Location)分别改为(-200, 0, 0)、(0, 0, 0) 和 (200, 0, 0) 。
-
为 “
BP_PlotterPlatform
” 的三个方块添加对于的颜色。切换到 “ThirdPersonMap
”选项卡,在内容浏览器的..\Content\PlottingGraphsTutorial
目录下创建的 “M_Color
”。
-
双击 “
M_Color
”。在 “材质图表” 编辑器 “M_Color
” 材质结果节点 的 “基础颜色” 引脚上单击鼠标右键,在弹出的菜单中选择 “提升为参数”,此时会生成一个 “基础颜色” 节点,将其改名为 “Color
”。然后点击“保存”。
-
在左侧 “参数” 选项卡下点击 “保存子项”,在弹出的窗口中将子项命名为 “
M_Color_Red
”;重复操作,再创建子项 “M_Color_Green
” 和 “M_Color_Blue
”。
-
双击 “
M_ColorRed
”。进入 “材质图表” 编辑器,在右侧 “参数 选项卡” 对调整 “RGB
” 的值为 “红色”。对“M_ColorGreen
” 和 “M_Color_Blue
” 的操作同理。
-
分别为 “
BP_PlotterPlatform
” 的三个立方体组件设置对应的颜色材质。
2.3 创建 “碰撞” 和 “饼状图” 更新事件蓝图
-
新建 Python 脚本 “
Plotter
”,将UP主在https://gitee.com/kprimo/UEPython_Tutorial/blob/master/Content/Scripts/Plotter.py# 中提供的脚本代码复制过去,代码逐行详解见视频UP主的讲解。
-
双击内容浏览器中的 “
BP_PlotterPlatform
”,在 “组件”(Components)面板中选择 “Red
” 组件, 然后在“细节”面板中单击 “组件结束重叠时”(On Component End Overlap)后面的 “+
” 按钮,此时“事件图表”会出现一个碰撞事件节点。
或者切换到“事件图表”面板,在“组件”(Components)面板中选择 “Red
” 组件,然后单击鼠标右键,在弹出的菜单中展开 “为Red添加事件” 选项,然后再展开 “碰撞”(Collision)子选项,选择 “添加On Component End Overlap”。
-
将左侧变量 “
RedCounter
” 拖拽至事件图表面板空白处,在弹出的菜单中选中 “获取RedCounter
”,此时面板上会出现一个 “获取RedCounter
” 节点,从该节点的输出项引脚处拖拽出一条线连接 “increment int
” 节点(在弹出的菜单中搜索 “++” 可以快速找到),然后将 “添加On Component End Overlap (Red)” 事件的输出项引脚与 “++” 节点的输入项引脚相连。这样就可以实现当玩家角色碰每次到红色立方体时,碰撞次数计数变量 “RedCounter
” 的值加1。
-
对于绿色、蓝色立方体计数变量 “
GreenCounter
” 和 “BlueCounter
” 的操作也类似。
-
新建函数 “
Notify Plotter
” 用于调用 “BP_Plotter
” 的 事件调度器 “OnGraphDataUpdated
”。从 “Notify Plotter
” 节点的输出项引脚拖拽出一条线,连接 “Get All Actors Of Class
” 节点。将 “获取类的所有 Actor”(Get All Actors Of Class) 节点的 “Actor Class
” 选项设置为 “BP_Plotter
”,然后从该节点的 “Out Actors
” 引脚处拖拽出一条线,连接 “Get (复制)" 节点。接着,从 “Get (复制)" 节点的输出项引脚拖拽出一条线,连接 “调用 On Graph Data Updated” 节点,再从 “调用 On Graph Data Updated” 节点的 “Platform
” 引脚处拖拽出一条线,连接 “self
” 节点。最后将 “获取类的所有 Actor”(Get All Actors Of Class) 节点的输出项与 “调用 On Graph Data Updated” 节点的输入项节点相连。
-
实现每碰撞一次执行一次 “
Notify Plotter
”。分别从三个 “increment int
” 节点输出项引脚拖拽出一条线,分别连接三个 “Notify Plotter
” 节点,然后 “编译”、“保存”。
-
创建 “
BP_Plotter
” “Plane
” 组件实时更新蓝图。打开 “BP_Plotter
” “Plane
” 组件的 “Construct Script
” 选项卡,从 “Construct Script
” 节点的输出项引脚拖拽出一条线,连接 “创建动态材质实例 (Plane)”(Create Dynamic Material Instance) 节点。
2.4 放置资产至场景中并进行测试
- 回到 “****”编辑器主界面,从内容浏览器中分别将 “
BP_Plotter
” 和 “BP_PlotterPlatform
” 拖拽至场景中,放置在合适的位置
- 点击工具栏的 “播放”(▶)按钮启动运行。可以看到 “
BP_Plotter
” 平面上能正常展示 “玩家”碰撞 “BP_PlotterPlatform
” 三色方块次数比例的扇形图。