首页 > 游戏 > 虚幻4 RPG游戏——技能系统 使用流程(二)

虚幻4 RPG游戏——技能系统 使用流程(二)


4.创建技能类

首先我们来了解一下技能模块的UGameplayAbility类,它是模块中的技能类。这个类派生自UObject,所以这个类的实例是角色可以释放的某个技能。这个类中定义了一些重要函数,全部与技能的释放逻辑有关:

CanActivateAbility( ) //技能能否被激活

TryActivateAbility( ) //尝试激活技能

CallActivateAbility( ) //激活技能前要做的工作

ActivateAbility( ) //激活技能

CommitAbility( ) //提交技能

CancelAbility( ) //取消技能

EndAbility( ) //终止技能

开发者可以在项目中创建自定义技能类,只要继承这个UGameplayAbility类就可以。


上图中自定义的技能类中用到了两个结构体:FRPGGameplayEffectContainer和FRPGGameplayEffectContainerSpec,有了这两个结构体就知道了技能的目标是谁,向目标施加的技能效果是什么了。其中FRPGGameplayEffectContainer结构体是用来持有技能施加的目标采用什么计算方法和技能要应用哪些效果,FRPGGameplayEffectContainerSpec持有目标数据句柄和要施加在目标上的技能效果的句柄。在FRPGGameplayEffectContainerSpec中有个数组这个数组中存放的对象类型为FGameplayEffectSpecHandle。FGameplayEffectSpecHandle是一个拥有指向技能效果共享指针的结构体。


5.创建技能标签

这里需要介绍一下虚幻4的标签系统GameplayTags。虚幻4共有两个标签系统:一个是在Actor或Component中使用的Tag系统和另一个是GameplayTags系统,这里要用到的是第二个标签系统(GameplayTags),在虚幻4中使用标签系统的目的是用来过滤数据。

你可以通过预先设置好的标签去标记某些项目资源,然后再通过GameplayTags函数按照一定的条件查询某个资源是否被特定标签标记了,比如角色可以拥有哪些类型的武器,根据角色拥有的武器判断当前可以释放哪些技能,或是哪些敌人是可被伤害的。

虚幻中的资源要能被GameplayTag标记,需要实现IGameplayTagAssetInterface接口,这个接口中提供了一些函数,用来获得资源拥有的标签和查询某个资源是否拥有指定的标签。


创建GameplayTag的方式是打开工程文件夹,在Config中创建DefaultGameplayTags.ini文件。


打开文件写入以下内容,其中第一项内容是配置Tag可以从配置文件导入,后面带有+号的每一项就是自定义标签列表,这里可以设置各种项目需要的标签。标签命名采用多层命名方式,每一层之间用“.”相连。


有了这个配置文件,打开项目设置窗口就可以看到项目中可用的标签了,后面在蓝图开发部分将使用这些标签来标记项目资源。


由于标签使用了“.”来嵌套多层名称,查询时既可以精确(Exact)查找标记,也可以找查找包含某个父标记的所有标记。

6.创建技能任务类

技能任务(UAbilityTask)用来定义在技能释放逻辑中执行的一个操作,比如播放一个动画蒙太奇。技能任务类的一个重要作用是要在类中定义并声明一些蓝图分配的、动态多播委托,这些委托也是这个任务的输出项(OUTPUT)。任务中的Activate()函数用来开始执行任务。

开发者可以继承UAbilityTask类来创建自定义任务类,比如这个:播放动画蒙太奇并等待返回事件任务类(URPGAbilityTask_PlayMontageAndWFE)。这个任务里面包含了两个小任务:播放动画蒙太奇(PlayMontageAndWait)和等待动画结束返回事件(WaitForEvent)。


这个类文件中定义了一个带有两个参数的动态多播委托FRPGPlayMontageAndWaitForEventDelegate,有了这个委托以后在URPGAbilityTask_PlayMontageAndWFE任务类中声明5个事件,分别用来绑定动画蒙太奇结束的不同状态对应要执行的回调函数,而回调函数需要在后面的技能蓝图中进行绑定。

任务类中需要重写Activate()函数, Activate()函数的作用是给RPGAbilitySystemComponent技能组件添加GameplayEventTagContainerDelegate委托和给动画实例绑定蒙太奇结束要调用的BlendingOutDelegate委托和MontageEndedDelegate委托。


未完待续...

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/yx/235791.html