文章目录
- 总览描述
- 批次阅览
- 2.1 Using an Event Dispatcher function to call an event in the level Blueprint
- 2.2 Binding an Event Dispatcher function to a custom event
- 2.3 Binding an Event Dispathcer to a custom event on spawn
- 3.1 Basic communication using a Blueprint Interface function
- 概念总结
- 致谢:
咱们继续蓝图通信下半段章节的学习!
总览描述
打开关卡后,引入眼帘的就是针对关卡的总体性文字描述,这里翻译一下:
这个地图提供蓝图之间通信的各种方式的案例!主要包括:通过Cast直接通信、使用事件分发器、通过蓝图接口
批次阅览
2.1 Using an Event Dispatcher function to call an event in the level Blueprint
在关卡蓝图中使用一个事件分发器来调用一个事件
此示例是一个按钮蓝图通过事件分发器来触发灯泡的开和关.这个按钮调用事件分发器,它会在关卡蓝图产生一个事件触发灯的开关.
关键概念:
-
Event Dispatcher
蓝图分析:
整体上基本包括两个蓝图:按钮蓝图和灯泡蓝图,咱们分别看一下
按钮蓝图
- Actor的Component结构
它就是一个根组件带了两个组件,一个静态网格体组件,一个触发盒子组件。
- 构造函数
创建一个材质实例,提升为变量,用它设置了静态网格体的材质。
- 事件图表
主要的逻辑就是重写了触发盒子的重叠事件,设置了材质实例的State参数用于设置按钮的不同颜色,然后Call了一个Button Toggled的事件触发器函数!
重点关注一下这个Button Toggle:
它是按钮类定义的一个事件分发器, 它具有一个bool类型的输入参数.
什么是Event Dispatcher? 你可以把它理解为一个大喇叭,, Call 它就代表对着喇叭喊了一声, 至于有哪些人听到喇叭声并做出什么反馈,它并不关心。如果有人想要对这个喇叭声做出反应,它可以自主选择绑定某个按钮蓝图实例的事件分发器。
更加简洁的说, 它是一个一对多通信的好中介,解耦了发送方和接收方。发消息者只管发,并不知道有多少接收者,也不知道每个接收者收到消息后做出什么反反应 !
进入关卡蓝图
我们发现了,这里绑定了关卡中这个按钮蓝图实例的事件分发器,从而触发BP_Lighjt_Buld_Basic_2这个蓝图实例的开灯和关灯,完成逻辑!这里我们就不看灯泡蓝图相关的,重点关注事件分发器的用法!
通过上述,我们已经知道事件分发器可以Call和Bind,那么Bind是如何操作的呢?
(1)进入关卡蓝图,选中需要绑定的蓝图实例,这里选择按钮蓝图
(2)进入关卡蓝图,右键输入目标事件分发器名称,会有两种方式,一种是永久绑定,一种可以取消的灵活绑定
永久绑定:
灵活绑定:
**通过观察,我们知道:**灵活的绑定,需要新建一个自定义事件并且节点存在执行引脚。而强制绑定,则直接编写逻辑即可!根据需要自行抉择
2.2 Binding an Event Dispatcher function to a custom event
绑定事件分发器到一个自定义事件
翻译:在这个例子中,相同的按钮蓝图开始和停止一个旋转动画。这个旋转的蓝图在内部绑定了按钮的事件分发器到一个自定义时间上,而不是之前的关卡蓝图!
关键概念:
- internally Bind
蓝图分析:
图中显示主要包括2个Actor,按钮蓝图、旋转蓝图,咱们重点观察旋转蓝图是怎么内部绑定事件分发器的:
旋转蓝图
-
组件结构
根组件带一个StaticMesh组件
-
构造脚本
无 -
事件图表
我们发现,他通过直接设置按钮蓝图的Actor引用变量,调用Bind它的事件分发器Button Toggled到自己的自定义事件Toggle spinning上,完成内部绑定!
2.3 Binding an Event Dispathcer to a custom event on spawn
在spawn的时候绑定一个事件分发器到一个自定义事件
翻译一下: 这个按钮当被按压的时候会生成一个炸弹蓝图。这个按钮只会被按压一次,直到它接收到炸弹蓝图已经爆炸的事件分发器的通知!
关键概念:
-
SpawnActor
-
Cascade粒子系统组件
蓝图分析:
本次的蓝图中,默认其实只有按钮蓝图,只有运行游戏后,才会动态spawn炸弹的蓝图,spawn其实就相当于生成的意思!咱们分别看一下:
1、按钮蓝图
它的组件结构和构造脚本跟上述一样,这里不多赘述,贴下图。
(1)组件结构
这里重点关注一下,左下角变量的Spawn point变量,它是Public的也是显示3D控件属性的一个向量:
在场景中可以拖拽按钮蓝图实例的3Dwidget,从而调整这个变量的值
这样在实现一些功能的时候会很方便调节!
(2)构造脚本
(3)咱们重点关注它的事件图表,如下:
主要分两块,第一块就是触发盒子重叠逻辑,如下:
第二块就是核心函数Activate逻辑
重点看SpawnActor这个蓝图节点,在他生成炸弹蓝图实例后,就直接调用Bind对炸弹的Bomb Exploded的事件分发器进行绑定了事件Bomb Exploded_Event,也就是说,它需要在炸弹蓝图爆炸后,通知自己,然后再做某些逻辑!
让我们去看看炸弹蓝图是何时出发的?
2、炸弹蓝图
(1)组件结构
一个静态网格体作为根组件,下面挂了一个Cascade粒子系统组件作为炸弹的引信的特效!
Cascade粒子系统组件主要是UE4提供的粒子特效系统,后来UE5又引入了Niagara粒子特效系统!
(2)构造脚本
(3)事件图表
在Beginplay事件中,就执行了整个逻辑,主要分三块:设置角速度进行旋转、Timeline设置动画、设置爆炸。在设置爆炸的底数第二个节点,我们发现他调用了事件分发器,然后就销毁了自己。所以调用点在这个地方!
3.1 Basic communication using a Blueprint Interface function
使用一个蓝图接口作为基本通信
**翻译:**在这个案例中,一个按钮蓝图通过一个蓝图接口消息,激活了一组蓝图!尽管每个蓝图不是同一个类,但是实际上,他们实现了相同的蓝图接口,从而使得单一函数激活他们全部成为一种可能,而不需要对每个类进行cast转换!
关键概念:
- Blueprint Interface
蓝图分析:
如上图所示,4个蓝图Actor,一个按钮,三个被激活的对象!先看一下效果图:
靠近按钮时,同时激活了这三个对象,如何做到的呢?就是通过蓝图接口,也叫Blueprint Interface!这里先不解释,最后在总结一下
1、按钮蓝图
-
组件结构
重点看一下左下角,公开了一个Actor数组成员,它存储需要被激活的Actor。
-
构造脚本
不多赘述
- 事件图表
这里重点观察一下,咱们直接对这个数组调用了一个蓝图接口的消息,其实本质上是对数组每个成员都调用一下,那么Pushed Button从何而来?双击节点即可!
我们看到,其实他是一个名为:BPI_Player_Interactions的蓝图接口的资产,那么如何创建蓝图接口呢?
创建蓝图接口,和创建其他资产类似,找到创建一下即可,这里我们找到上述的蓝图接口
进入之后就是这样,基本上咱们就是在这里定义函数的结构(函数名、参数、返回值)
接口其实就是定义了函数的规范,并没有实现函数的内容,有需要的类可以根据需要自行实现相应接口,如何实现呢?请看后面的内容!
2、激活对象1的蓝图
组件结构和构造脚本,咱们不重点关注,重点关注一下,如何实现一个蓝图接口,根据上述的绿色数字和红框,依次点击即可!
从而实现了BPI_Player_Interactions蓝图接口的Pushed Button函数的逻辑!其他两个激活对象也是一样,这里仅截图如下:
激活对象2的蓝图接口实现:
激活对象3的蓝图接口实现:
最后咱们总结一下,蓝图接口是规范的一组函数定义的规则,它无视蓝图类的结构,通过抽象出行为,使得每个不同的蓝图得到一种行为调用的统一!
它的基本使用流程:
- 定义蓝图接口(添加函数、设定参数、设定返回值)
- 有需要的蓝图实现该接口
- 合适的地方针对蓝图实例进行调用该接口
由于3.2和3.3的案例也是同样描述蓝图接口的内容,并且案例业务逻辑偏多,咱们学习以核心思路为基准,这里不再重复赘述,有需要的同学可以自学!
概念总结
1、Event Dispatcher
2、Bind Event Dispatcher
3、SpawnActor
4、Cascade粒子系统组件
5、Blueprint Interface
这里贴一个国外虚幻大佬的关于事件分发器和蓝图接口特点的总结截图:
翻译一下:
事件分发器
- 异步通信
- 解耦类
- 模块化和便捷性
蓝图接口
- 强制结构
- 概念分割
- 减少依赖
- 减少内存使用
致谢:
今天的学习就到此为止啦,喜欢的小伙伴点点关注+赞哦!有问题及时留言!感谢大家Thanks♪(・ω・)ノ!我是火火,火一般的男人!