28.UE5游戏框架,事件分发器,蓝图接口
3-3 虚幻游戏框架拆解,游戏规则基础_哔哩哔哩_bilibili
目录
1.游戏架构
2.事件分发器
2.1UI控件中的事件分发器
2.2Actor蓝图中的事件分发器
2.2.1动态决定Actor的分发事件
2.2.2父类中定义事件分发器,子类实现事件分发器
2.3组件蓝图中实现事件分发器
3.蓝图接口
1.游戏架构
大概记住流程就行了,理解最重要
2.事件分发器
理解事件分发器,需要从两个角度出发:
1.事件分发器的(声明者)调用者(声明事件分发器,并决定调用事件的时机,但不负责事件内部逻辑)
2.事件分发器的实现者(不决定什么时候调用事件,只负责实现事件逻辑)
事件分发器的声明者和调用者通常是一个对象,且和事件分发器的实现者往往是分离的,因为如果一个蓝图即是(声明者)调用者又实现者,那么事件分发器往往不如直接声明、实现、调用一个函数直接。
事件分发器主要有三种使用场景::
1.UI控件中:
让自己设计的UI控件能够实现一些功能:点击功能,值变更功能等等。
(声明者)调用者:UI控件负责调用时机
实现者:使用UI控件的人,负责事件的具体实现逻辑
2.Actor蓝图中:
2.1在程序运行时,动态的给Actor分发事件(Actor定义时负责调用时机,运行时负责事件实现)
2.2父类中定义事件分发器,子类实现事件分发器
3.组件蓝图中:
组件负责定义事件的调用时机,使用组件的负责实现具体的事件逻辑
2.1UI控件中的事件分发器
设计通用按钮,并让通用按钮拥有点击事件,案例可参考20.UE5UI预构造,开始菜单,事件分发器_ue5 菜单-CSDN博客
2.2Actor蓝图中的事件分发器
2.2.1动态决定Actor的分发事件
案例:
例如现在有一款养宠物的游戏,有两个难度,普通,困难。
当难度时普通时,饥饿值为0后,5秒之后宠物死亡。
当难度为困难时,饥饿值为0后,宠物直接死亡。
首先创建蓝图Actor,命名为我的宠物,添加饥饿值变量,并在事件开始时声明一个每5秒扣除5点饥饿值的定时器事件,当生命值归零后调用事件分发器中的,当饥饿小于0的事件。我的宠物作为事件分发器的声名者和调用者。
本来应该在游戏实例中添加游戏难度,并且绑定不同难度的当饥饿小于0时的实现逻辑。但是为了方便演示,就在我的玩家控制器中进行演示了。
按1为普通难度,当饥饿小于0时,就延迟5秒死亡
按2,就是困难难度,当饥饿小于0的时候,直接死亡
2.2.2父类中定义事件分发器,子类实现事件分发器
还有一种情况就是在父类中定义事件分发器,子类中实现事件分发器
案例:我的宠物中有一个子蓝图,为骆驼,当饥饿值归零时,可以无视游戏难度,依旧坚持5秒钟死亡
创建我的宠物子蓝图,并命名为:骆驼
骆驼这个宠物,在开始事件中,分配当饥饿小于0的事件
回到我的控制器蓝图,按3创建骆驼,这个时候无论游戏难度是多少,骆驼都能坚持5秒死亡。
这个案例主要是理解,在游戏运行中动态分配事件,以及子类分配父类的事件(类似重载)。
2.3组件蓝图中实现事件分发器
创建我的组件蓝图
为组件添加事件分发器
那么所有添加了我的组件的蓝图,都可以实现我的组件事件蓝图。
3.蓝图接口
接口就好像电脑上的USB接口一样, 接口只管定义尺寸和规格(参数输入),所有手机厂商,U盘厂商,鼠标键盘厂商都需要按照这个尺寸和规格设计接口才能接入到电脑上,但是具体的实现功能不同,比如说手机的USB线可以传输数据和充电,U盘可以快速读写,鼠标键盘可以通过USB和电脑进行交互等等。
接口只管定义规格,具体接口的实现方式交给蓝图Actor进行实现。
案例:
实现一个功能,按数字键盘1,让场上所有的灯光打开。
创建蓝图接口
在接口中添加一个函数,函数有一个输入,浮点类型的开灯几秒
创建灯光
创建Actor蓝图,命名为我的灯,添加点光源组件,并设置强度和颜色
将点光源的默认可视设置为关闭
在我的灯蓝图中,打开类设置,添加接口,我的接口
设置灯的可视性,并延迟,打开灯几秒后,进行可视性的关闭
接下来实现,按1打开灯
打开我的控制器蓝图
获取场景中所有实现了:我的接口的Actor,并遍历出所有的Actor,并调用打开灯的接口,开灯事件可以设置为5秒。
将我的灯拖入场景中,运行游戏,按数字键1,灯光打开,并在5秒中后关闭