穷凶极恶虚幻蓝图
穷凶极恶虚幻蓝图
- 坦 白 从 宽 抗 拒 从 严
- 蓝图是傻逼,我也是傻逼
专业术语
- 实例:所有在
场景Level
里实际存在的物体个体,如:“小明”,意义是所指 - 类/蓝图类:封装到内容浏览器里的抽象的概念,如:“学生”,意义是能指
- 实例永远是类/蓝图类的派生,“小明”永远是“学生”的派生
蓝图种类
关卡蓝图
- 关卡蓝图相当于
面向过程(POP)
式的编程 - 一个
关卡Level
只能有一个关卡蓝图 - 关卡蓝图可以对场景里的
物体实例(包括蓝图类)
进行操纵
蓝图类
- 蓝图类相当于
面向个体(OOP)
式的编程 - 蓝图类可以在
Content内容浏览器
里右键创建(Blueprint Class) - 创建时需要选择一个父类,如果要放在场景里,至少要继承自Actor
- 蓝图类也可以通过C++类派生
- 蓝图类也可以通过实例(包括蓝图实例)转换:
- 1:先选择所有需要封装到蓝图类的实例
- 2:点击
Details窗口
右上角的构建蓝图按钮 - 3:在弹出的窗口里编辑蓝图名称与路径
- 4:选择
Harvest Component封装组件
,将所有选中实例转换为蓝图的组件 - 5:选择继承的父类
- 6:确定
蓝图基础
- 蓝图节点的数据与执行是从左至右进行的,节点的左边是输入区,右边是输出区
MyBlueprint窗口
MyBlueprint窗口
是最重要的窗口,在这可以创建一些基本蓝图结构:- Garph图表
- 图表下会显示其包含的事件
- Function方法(函数)
- Macro宏
- Variable变量
- Event Dispatcher事件与委托
- Garph图表
- 在蓝图里按右键呼出
Palette节点菜单
,也可以在Window窗口
里打开菜单窗口
Garph图表
- 图表就是蓝图片段,不过是将蓝图拆开,能够方便查看和管理罢了
Variable变量
- 在给新建的变量设置初始值时,需要编译一次才能设置
- 在
Details细节面板
里的Variable Type变量类型里可以更改类型 - 在
MyBlueprint窗口
里,变量最右边的眼睛可以点击,睁眼暴露闭眼不暴露
- 变量拖入蓝图中会选择
Get
还是Set
Function方法
- 方法有方法自身的蓝图,蓝图里必须有
方法节点
和返回节点
,可以设置参数与返回值 - 带返回值的方法没有执行引脚,无返回值的方法有执行引脚
- 在
MyBlueprint窗口
里,默认的ConstructionScript
就是构造函数
快捷键
alt
切断连接ctrl
桥接引脚ctrl + W
复制节点
引脚类型
白色箭头引脚:执行引脚
- 白色流程线由一个执行引脚引出
- 后面会跟上一大串
void
无返回值的方法,这些方法的执行受执行顺序的影响 - 一个节点只能连一个输入执行,但可以输出多个执行
彩色圆形引脚:数据引脚
- 布尔型:深红色
- 整型:青色
- 浮点型:草绿色
- 字符串:玫红色
- 一般结构体:深蓝色
- 三维向量结构体:黄色
- 三维旋矩结构体:浅紫色
- 方位矩阵结构体:橙色
- 物体类型:湖蓝色
- 枚举类型与字节类型:深绿色
Boolean Integer Float String Structure
Vector Rotator Transform Actor Enumeration
彩色菱形引脚:引用引脚
红色方形引脚:事件引脚
数据类型转换
- 蓝图内的数据类型转换是自动完成的,例如下列转换节点
测试节点
Print String
打印字符串节点- 相当于
GEngine->AddOnScreenDebugMessage()
方法
事件节点
- 搜索关键词:
Event
- 节点菜单里搜索
Event
可以快速放置事件节点 - 事件节点题头是红色的,没有输入的执行引脚,只有输出的
- 事件节点在不同蓝图中有所限制,渊源是c++代码里的事件方法
- 事件节点是指令的发起者
- 常用的事件节点有:
BeginPlay
初始化事件,游戏开始后第一帧调用一次Tick
更新事件,游戏开始后每一帧都调用EndPlay
结束事件,游戏结束那一帧调用一次Destroyed
销毁事件,实例被销毁时调用一次Input
输入事件,事件名为按键名- 在蓝图类中输入,必须要争取到player controller玩家控制器的同意(Enable Input)
Collision
碰撞事件,有碰撞与覆盖之分Mouse Input
鼠标交互事件
流程控制
- 搜索关键词:
Flow Control
Delay延时
- 执行到
Delay
节点时会将执行阻塞Duration
秒钟 - 快捷键:
D+鼠标左键
Delay
有两种版本:
Branch分流
- 根据布尔值
Condition
来判断执行True
还是执行False
- 快捷键:
B+鼠标左键
Do X次数限制
Do X
能限制执行的次数,通过Reset
来重置限制- 快捷键:
O+鼠标左键
(Do Once)N+鼠标左键
(Do N) Do X
系列有三种:
FlipFlop开关式
- 能让执行信号折返于
A
和B
之间
Gate门限
Gate
能通过多个执行引脚控制总执行的通过与否MultiGate
则类似于更加灵活的Flip Flop
- 快捷键:
G+鼠标左键
(Gate)M+鼠标左键
(MultiGate)
Sequence拆分
- 将一条执行线拆成多条,并按顺序执行
- 快捷键:
S+鼠标左键
Loop循环
- 循环有三种:For循环、带Break的For循环、While循环
数组
- 搜索关键词:
Array
访问元素
- Get有两种,区别是输出的引脚形状不同
- 对值的引用的修改可以忽视形参实参的限制
获取方法
- 重要的方法有:
Length
获取长度Is Empty
是否为空
执行方法
- 重要的方法有:
Add
添加元素Clear
清除元素Insert
插入元素Remove
移除元素
数组遍历
- 两种方法来遍历数组:
- 快捷键:
F+鼠标左键
(For Each Loop)
结构体
定义结构体
- 结构体可以在
Content内容浏览器
里右键创建(Structure)
- 在设置窗口里添加并设置结构体里的元素与初始值
拆开与重组
- 所有的结构体都适用
Break
方法与Make
方法
蓝图与访问
关卡蓝图获取关卡实例
- 先在场景中选择一个
Actor
实例(假设叫“BP_Test_1”)
- 到关卡蓝图里右键选择
Create a Reference
创建实例引用
- 进行各种Get和Set操作
蓝图类获取关卡实例
- 当然是使用
Get All
系列了
Get All
系列成员:
- 还可以在蓝图类中创建某类型的变量,暴露后在场景实例中指认
- 如果不指认就使用此变量造成空指针异常,蓝图不会崩溃会报错,而C++会崩溃
碰撞
关卡蓝图中(实例)碰撞事件引用
- 使用实例引用时可以选择创建基于该引用的事件
蓝图类中(组件)碰撞事件引用
- 对组件右键可以获取其委托的事件,并放到蓝图中
碰撞事件
On(Actor/Component)BeginOverlap
进入覆盖(触发)On(Actor/Component)EndOverlap
离开覆盖(触发)On(Actor/Component)Hit
碰撞
射线
- 射线通道在ProjectSettings里的Collision里设置
常用射线函数有:
- TraceByChannel通道检测
- TraceByProfile文件检测
- TraceForObjects物体组检测
套用上面的常用函数,射线检测还有形状之分:
- Line线型
- Box盒型
- Capsure胶囊体型
- Sphere球型
套用前面两者,射线检测还有数量之分:
- Single单射线检测(省略Single)
- Multi多射线检测
套用前面三者,打个比方:多射线球形文件检测 = MultiSphereTraceByProfile
时间轴
Timeline
节点能创建一个可编辑的时间轴节点- 双击该节点进入编辑界面
- 在编辑界面中可以新建多个不同类型的轨道,轨道名对应节点输出类型
- 同时时间轴能在
My Blueprint窗口
找到
界面
- 创建一个UI文件
Widget Blueprint
- 在任何蓝图里都能将UI文件加入到视口显示
- 多个UI文件可以互相覆盖显示
类降级
- 通过
Cast
方法进行类的临时降级处理(俗称“做儿子”) - 这里做个示例:
- 新建
BP_ActorParent
类继承自Actor
- 新建
BP_ActorSon1
和BP_ActorSon2
都继承自BP_ActorParent
- 假使
BP_ActorParent
是游戏的底层类 - 若蓝图类
Son1
中定义一个Son2
类型的暴露变量来访问场景中的Son2
类型实例 - 不如直接定义一个
parent
类型的变量来直接赋值 - 但是父类无法直接调用子类的成员或重写方法,这时就使用
类降级Cast
的方法来做
- 新建
自定义事件
自定义事件定义
- 在蓝图中右键搜索
Add Custom Event
来定义事件
自定义事件调用
- 输入
Call
关键字来调用触发事件的方法
- 使用Execute Console Command指令行能远程调用事件
- 蓝图类可以通过此方式调用关卡蓝图内逻辑
- 但是关卡蓝图不能通过此方式调用蓝图类内逻辑
委托机
- 在
My Blueprint窗口
里可以新建委托机Event Dispatcher
- 委托机的作用是同时控制多个事件的执行
委托机命令
- 委托机拖入场景中有几种命令:
Call
触发委托机Bind
将事件绑定到委托机Unbind
事件解绑Unbind All
解绑所有Event
快速创建一个自定义事件Assign
在创建一个自定义事件的同时,绑定到委托机
委托机触发
- 委托机就能解决关卡蓝图调用蓝图类逻辑的问题
- 下图即在关卡蓝图里调用蓝图类实例的委托机的方法
- UI按钮响应也能通过委托机来做
委托机绑定函数
- 使用
CreateEvent
来更灵活地绑定委托机
接口
定义接口
- 创建蓝图接口文件
Blueprint Interface
- 在接口里定义函数
蓝图类实现接口
- 在需要调用的类里的
Class Settings
里添加接口调用 - 判断一个类是否实现了接口,使用
Does Implement Interface
节点
使用接口
- 通过搜索
Call
来呼出接口函数和事件
- 在其他蓝图内调用此蓝图类里实现接口的方法
- 在该实现接口的蓝图类的
My Blueprint窗口
里能发现可重写的接口方法事件,见下图 - 双击重写方法,或者右键该方法选择
Convert Function To Event
转换成事件 - 重写方法是局部的,而转换的事件不是
- 可以在任何地方调用此函数
当其他蓝图类访问该蓝图类身上的接口方法事件时,该蓝图类内的事件就会执行
多个蓝图类实现同一个接口,每个蓝图中可执行不同的方法
委托机与接口的差异
- 委托机只能在一个蓝图类中被定义使用,其他蓝图类可以调用该蓝图类的委托机中绑定的事件
- 接口能跨蓝图类使用,其他蓝图类可以调用实现接口的任意蓝图类中的接口事件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Iamsleepingnow 世界!