3 - 蓝图通信
光速过一遍蓝图编程,本文将光速过一遍有关蓝图通信的如下内容:
- 直接蓝图通信;
- 关卡蓝图通信;
- 事件分发器;
直接蓝图通信
直接蓝图通信是蓝图和Actor间通信的一种简单方式。它通过创建一个存储另一个Actor/蓝图类的对象引用变量,并将其作为目标输入参数让动作修改它。
例如创建一个名字为BP_LightSwitch
的蓝图,它有一个点光源类型的对象引用变量,该变量引用放置在关卡中的点光源。当玩家和该蓝图类实例重叠时,点光源的可见性将被切换。
事件图表如下:
然后需要在编辑器中放置一个点光源实例,并修改它的移动性(Mobility)为可移动的(Moveable)。再在该蓝图类实例中绑定点光源即可。
Cast To XXX节点
当我们需要访问被引用实例的子类时,需要对引用进行强制转换,这会用到Cast To XXX
节点,该节点主要有两种用途:
- 测试实例是否属于特定类型:例如给定一个
Actor
引用,看它是不是Character
类。 - 访问子类的变量和函数:假设有一个继承自
GameModeBase
类的蓝图类BP_GameModeWithScore
,现在有一个GameModeBase
类的对象引用,可以尝试用该节点将其转换为BP_GameModeWithScore
类对象引用。如果该实例引用确实是BP_GameModeWithScore
,那么该节点将会成功返回类型为BP_GameModeWithScore
类的对象引用。
上面两个例子的示例如下:
上图中出现的两个白色连接引脚被称为重新路由节点(reroute nodes),用于组织蓝图,可以在拉线的时候双击,或者在事件图表空白处右击添加。
关卡蓝图通信
关卡蓝图是UE中一种特殊类型的蓝图,游戏的每个关卡都有一个默认的关卡蓝图,它们对于创建仅在当前关卡发生的事件和操作中非常有用。
要想访问关卡蓝图,需要在关卡编辑器中展开蓝图工具栏,然后进入关卡蓝图:
接下来通过一个小例子展示关卡蓝图的使用方法,在关卡中放置一个触发框,玩家和它重叠时播放特效:
在关卡中放置一个触发框,然后选中它的状态下进入关卡蓝图,添加重叠开始时的事件:
修改Starter Content中的电火花特效蓝图,将它粒子效果组件的自动启动取消了,编译蓝图后将其放置在关卡中;
在选中该特效实例的情况下,在关卡蓝图中创建它的对象引用:
在关卡蓝图中编写相关逻辑:
结果如下:
使用事件分发器
事件分发器(Event Dispatcher)允许蓝图在事件发生时通知其他蓝图。关卡蓝图和其他蓝图类可以监听这个事件,当事件被触发时,它们可能有不同的行为。
关卡蓝图和蓝图类的通信
接下来看看关卡蓝图如何监听事件分发器。例如,创建了一个BP_Platform
蓝图,当角色与它的实例重叠时,它会调用名字为PlatformPressed
的事件分发器,关卡蓝图正在监听PlatformPressed
事件,然后生成爆炸特效。
首先需要在BP_Platform
中创建事件分发器,可以在“我的蓝图”中创建它:
这个事件分发器需要一个BP_Platform
对象引用作为输入,因此需要在它的细节面板处添加输入:
接下来就需要在玩家和BP_Platform
实例重叠时发送这个事件了,在BP_Platform
中添加如下蓝图:
最后在关卡中放置BP_Platform
实例,并在关卡蓝图中编辑它对Call Platform Pressed
事件的反馈即可:
这样就通过事件分发器实现关卡蓝图和BP_Platform
蓝图类的通信:
蓝图类间的通信
蓝图中 绑定事件(Bind Event)节点可以将一个事件绑定到另一个事件或事件分发器中,其中事件分发器可以在另一个蓝图类中。当一个事件被调用时,绑定到它的所有其他事件也会被调用。
接下来就来看一下如何通过绑定事件实现蓝图类间的通信,我们将要新建一个电火花特效蓝图子类,在它的BeginPlay
事件中绑定BP_Platform
的事件:
创建蓝图子类,新建
BP_Platform
对象引用变量:编写蓝图子类的
BeginPlay
事件逻辑:这里先检查实例中
BP_Platform
变量是否设置合法,然后绑定它的事件分发器。一旦BP_Platform
引用的Platform Pressed
事件被触发,就会触发这里定义的自定义事件Show Sparks
,显示电火花特效。在关卡中放置电火花特效蓝图子类,并设置
BP_Platform
对象引用。之后结果如下:
参考资料
- 中文翻译:《UE5蓝图可视化脚本游戏开发完全学习教程》
- 英文原版:《Blueprints Visual Scripting for Unreal Engine 5 Third Edition》