Unreal-Blueprint
UE 的强大,在于其提供了很多开箱即用的模板,我们的日常开发工作也是一样,当我们将工作都模板化之后,就能保证效率和质量了。工作从选择模板开始。
多用,多琢磨,多尝试,熟能生巧。
我得搞一个自己的常用蓝图函数和组合操作的 Demo 库。
TODO LIST
- 把 FPS 的课程看完,操作完
- 玩 Content Examples 和 Blueprint 两个官方 Demo 项目
- 构建常用的函数库
- 编写常用 Demo 蓝图
- 了解下 VR 的开发
Concept Map

原则
- 蓝图是事件驱动的(Event Based/ Event Driven),编写蓝图,应该按照基于
事件驱动的顺序去设置,即先设置事件,再设置对象。 - 蓝图和 Unity 的 Prefab 一定程度上有点类似,先可以类比理解下。
C++与蓝图的区别
参考 B 站的这个视频:
https://www.bilibili.com/video/BV11o4y1C7aW?spm_id_from=333.999.0.0
文字版:
https://zhuanlan.zhihu.com/p/450520990
二者应该结合起来用,而不是二选一。
所以经常可以看到,我们创建一个 C++类,就会马上创建一个基于此 C++类的蓝图类。
定位
核心代码用 C++,胶水整合代码用蓝图。蓝图可以做但不适合做复杂逻辑。
蓝图感觉就是 流水账式的过程化编程。
优点
- 门槛低
- 类、属性、方法划分会比较合理,因为做了编辑器组件级别的物理隔离拆分
缺点
- 可读性低
- 可扩展性低
当复杂度上升后,会成为一团乱麻。
思考
有没有一键格式化蓝图?
有没有关于蓝图的设计规范?有,详见下文。
蓝图工作流
- 创建一个带有组件的 Actor
- 蓝图/添加脚本(Blueprint/Add Script)
- 将它们拖拽到任意场景关卡中,创建其实例
- 或使用 Spawn Actor from Class 在运行时进行实例化
- 新的蓝图类继承某个现有的蓝图类,在它的基础上增强
- 可以使用 Child Actor
继承关系


基础语法
变量
快捷键:Ctrl-Get,Alt-Set
如果想基于某个属性创建新的变量,可以在该属性节点上,右键鼠标
Expose on Spawn
勾上后,才能在关卡蓝图中编辑,否则是不会在关卡蓝图中出现该属性的,就不可编辑了。
流程控制
switch
for
序列节点(Sequence)
分支节点(Branch)
运算符
数学表达式(Math Expression)
弊端:性能很低,不适合复杂运算。
数据结构
了解了节点的数据结构,我们就知道可以对节点做哪些修改,进而知道其能力范围。
Actor -> Component
数组
make array
Set
Map
函数
怎么定义
参数
返回结果
怎么调用
在具体的蓝图中,先获取 Game Mode 父类(如果函数是定义在 Actor 中,应该就是获取 Actor 父类吧),然后转为具体子类,再调用该方法。
事件
一般会给物体加一个框,比如 box、sphere 等等,用于进行碰撞检测。
然后再给这个物体对应的蓝图添加一个变量,用于标注其状态,比如门和灯的开关。这个变量可以设置为对象引用,比如给开关蓝图增加一个 MyLight 变量,该变量设置为对象引用,引用到灯对象。
然后给 box/sphere 设置事件,触发这些状态变量的改变。
自定义事件
蓝图编辑界面右键
Flip Flop:2 种状态之间轮流切换
碰撞(Collision Event)
注意要设置组件的 CollisionPresets 为 OverlapAllDynamic,否则碰撞不生效。
Trace
Sphere Trace
用户输入
Edit-> Project Setting -> Engine -> Input 里面,可以添加用户输入按键。
注意,复制第三人称角色的蓝图,并修改后,要重新设置 Game Mode 的 Default Pawn Class,并且保存+编译,使其使用修改后的第三人称角色。
Game Mode 和第三人称角色的蓝图位于同一个目录。
插值
lerp
关卡蓝图(Level Blueprint)
是控制整个关卡的蓝图。
如果要添加背景音乐,就可以在关卡蓝图中处理。
生成 Actor 实例:Spawn Actor From Class
文本格式化
Format Text
1 | |
自定义组件
通过 Get Owner,让组件拥有者可以调用自定义组件的功能。
蓝图通信
直接通信
开关灯的案例
对象引用:Object Reference
自定义事件
tag
可以直接将对象拖入关卡蓝图
接口调用
1、定义一个蓝图接口 BPI
2、给具体的蓝图实现该接口(在蓝图界面右侧,Intterfaces 下点击 Add 按钮添加)
3、扩展角色,增加 Trace 检测
4、扩展角色,增加用户输入监听
5、当用户按下某个按键后,执行 Trace 检测
6、给 Trace 检测到的蓝图发送 BPI 接口的 Message(Trace 到的内容,要 break,然后选择 Hit Actor)
7、在具体蓝图中触发 BPI,执行操作(比如打开电视机)
事件调度器/广播(Event Dispatcher)
可以将不同蓝图进行解耦。
这个也是基于 BPI 来实现的。
具体蓝图组件,是放在 Event BeginPlay 事件中
这个广播好像没有范围,是全关卡范围的。
UI Widget
必须要加入关卡蓝图(Add To Viewport)才能生效。
Latent Function
类似 setTimeout();
可以通过 delay 或者 set timer 实现。
Timeline
用曲线控制动画
双击 Timeline 节点可以编辑
点击设置 2 个点后,按住 shift 鼠标拖动选中,然后右键可以选择函数。
记得勾选使用关键帧
LERP(线性插值)节点
动态材质实例(Dynamic Material Instance)
在蓝图的构造函数脚本中创建 Create Dynamic Material Instance,将其 return value 设置为一个变量的值,然后在 Event Graph 中通过该值设置
Build
教程:
https://www.cnblogs.com/a-small-Trainee/p/13064218.html
丢失场景的问题
https://blog.csdn.net/qq_21153225/article/details/107309661
快捷键
物品操作
移动:W
旋转:E
缩放:R
全选所有同类物体:选中一个,然后 shift+E
场景操作
前后左右平移:按下鼠标左/右键,操作 WASD
上下移动:鼠标中键拖动
旋转:按下鼠标左/右键拖动
单坐标轴快速移动:选中你想移动的 actor,按住 ctrl+RMB(鼠标右键)拖动鼠标可在 x 轴上移动,LMB 是 y 轴,左右键一起按下是 z 轴
蓝图编辑
删除连线:Alt+鼠标左键
蓝图调试
F9
导航区域可视化
拖入 Nav Mesh Bounds Volume 后,要先执行一次 Build,然后按 P,就可以出现绿色的范围了。
怪物视线可视化
小键盘 4,可惜我没有小键盘。
常用操作
播放中选中物体
播放中按下 Pause,然后 F8,就可以选择具体的蓝图了。
添加效果
常见问题
Game Mode 和 Actor 的职责划分
打开项目后,之前编辑的内容没了
看看是否绑定在某个地图上了,在 Content Browser 中切换到该地图即可。
Integer 转换为自定义枚举值
先 Integer 自动转换为 Byte
然后 Byte 转换为自定义枚举值
注意一定要记住你的自定义枚举值的名称,方便搜索。
蓝图 VS. Prefab
工作流不同,蓝图基于组件嵌套的理念;Unity 的 Prefab 组件之间是零散并列的,缺少分组的概念。
蓝图属性有默认值和关卡可编辑的功能
宏 VS. 事件 VS. 函数
共同特点:都有输入参数
不同点:
- 宏:有输出参数,并可以有多个执行路径。仅作用于当前蓝图,不能从另外一个蓝图调用。
- 事件:没有输出参数。可以从其他蓝图调用,并可以有“委托”引用。他们支持
时间轴。 - 函数:有输出参数,可以从其他蓝图调用。函数不支持潜在操作,比如 Delay。
蓝图转 C++源码
- 打开任意一个蓝图资源以确保 Blueprint Editor 模块被加载好。
- 打开 Edit -> Editor Preference
- 搜索 Generate Native Code
- 设置快捷键
然后就可以通过设置的快捷键,将蓝图转为 C++代码了。
但是,这玩意儿基本不可用啊,变量名都是自动生成的,可读性不好,也没有注释。
目前我设置的是 Alt + C
规范
腾讯光子工作室的蓝图规范:
https://zhuanlan.zhihu.com/p/83138044
Gamemakin(一个游戏公司)的 UE 规范:
https://github.com/Allar/ue5-style-guide
这个文档有中文版,还有对应的 Lint 插件,可以从商城下载。
教程
视频教程:
https://www.bilibili.com/video/BV1xK4y1P7be?zw
深入 UE 蓝图开发:
https://www.zhihu.com/column/blueprints-in-depth
视角控制:
https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LevelEditor/Viewports/ViewportControls/
蓝图技巧:
https://zhuanlan.zhihu.com/p/85574206
Demo 赏析
大一学生做的射击游戏 Demo:
这个 Demo 应该是结合了 C++程序做的,细节上有不少可以参考的设计(比如瞄准镜、镜头摇晃、奔跑的动作、UI 界面等)。