- 前言
- 使用过程范例
- 1. 创建蓝图接口
- 2. 定义接口函数
- 3. 定义监听者类
- 4. 发消息
- 测试运行
之前写过一篇《UE4基础:用蓝图构建出一个GameMode中的游戏事件通信系统》,当时老王想基于GameMode和传统继承的方式实现一个消息分发系统。这两天看了一些教程发现,之前的方法是挺笨的。实现蓝图间通信的标准办法应该是通过“蓝图接口”。学过C#和Java的同学对这种实现方法应该不陌生。
其实我是想实现一个和Godot一样,可以通过组来分发消息的系统,但是由于UE4的蓝图不能定义泛型函数,也不能使用不定类型参数,也不能用字符串调用函数,所以那种通用的事件分发系统是实现不了的。本例只是我的中多个事件分发系统的中的一个。它的作用是向当前游戏场景中的所有Actor通知一些Gameplay事件,比如:主角发了一个超级必杀,场景中的所有NPC(Actor)都要掉血等等。
网络上很多教程举的例子都是用蓝图通信实现一个“主角开个门儿”什么的,初学者总会疑惑“这个功能不用蓝图接口也能实现啊”。实际上蓝图接口的意义在于:1.可以一对多甚至多对多的消息广播,2.并且实现接收消息的对象和发送消息的对象解耦合(实际上就是观察者模式啦)。
使用过程范例 1. 创建蓝图接口一个蓝图接口文件就对应C#中一个接口,里面可以定义多个函数。
本例中接口名字为:BI_GameEventListener
给接口添加一个名为"OnGameEventReceived"函数,并且定义一个String
类型的参数。
从Actor
派生一个NPC
类 ,并让其实现BI_GameEventListener
如果主角发了大招则NPC掉血
接口中的函数可以当作事件使用
摆了4个NPC到场景中
这里是重点了:先通过Get All Actors with Interface
方法获取场景中所有实现了BI_GameEventListener
的Actor
,然后通过遍历的方式把消息发送给每个对象。
主角发一个大招,4个NPC都会掉血。