29. UE5 RPG应用GamplayAbility

前面几篇文章,总算把GE给更新完了,GE的基础应用也算讲清楚了。接下来,我们将更新GA的相应的课程了,首先,这一篇先对GA做一个简单的介绍,然后实现一下如何实现给角色应用一个GA。

简介

GamplayAbility 简称 GA,是UE引擎里的GAS内的功能组件,它的主要功能包括技能冷却时间(CD)和技能消耗的管理,同时也支持网络同步和实例支持。开发者可以在ActivateAbility事件中编写相关的技能逻辑,如角色动作、粒子效果以及角色数值的变动。根据技能是否施展成功,可以调用CommitAbility()或EndAbility()来结束技能。

GameplayAbility在UE中的类名为UGameplayAbility,它继承于UObject和IGameplayTaskOwnerInterface。UObject是所有UE对象的基类,而IGameplayTaskOwnerInterface是一个抽象类,代表玩法任务所有者接口。UGameplayAbility通过其丰富的继承关系和函数,使得开发者能够灵活地创建和管理游戏中的技能系统。

GA类主要定义攻击或者能力,它必须首先被应用给ASC,我们将在服务器上执行此操作,然后将 GA的spec复制到本地。在使用时,必须将其激活(Activated,如果只应用,不激活,将不起效果),它可以异步运行,就是可以同时触发多个技能,正常技能它是不能够异步的,我们需要使用Ability Task去实现技能异步。

创建GA

GA的配置修改是需要在蓝图中进行的,我们可以直接通过创建蓝图选择GameplayAbility去创建

但是考虑到后续要为GA增加新的功能,我们先通过GameplayAbility创建一个c++类,然后将其命名为GameplayAbilityBase,当做技能的基类,用于以后的扩展。

打开代码,我们首先找到ASC的基类,在基类增加一个函数,用于应用技能,参数传入一个技能类的数组

cpp 复制代码
void AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities);

在函数实现这里,遍历传入的数组,通过参数实例一个spec,并应用,这里为了方便测试,使用GiveAbilityAndActivateOnce函数应用,并直接激活。

cpp 复制代码
void UAbilitySystemComponentBase::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
	for(TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
		//GiveAbility(AbilitySpec); //只应用不激活
		GiveAbilityAndActivateOnce(AbilitySpec); //应用技能并激活一次
	}
}

找到角色的基础类CharacterBase,添加一个私有属性,作为角色初始的技能设置。

cpp 复制代码
private:

	UPROPERTY(EditAnywhere, Category="Attributes")
	TArray<TSubclassOf<UGameplayAbility>> StartupAbilities; //角色初始技能设置

在函数实现这里,将ASC类型转换为我们创建的ASC基类,并调用上面添加技能的函数

cpp 复制代码
void ACharacterBase::AddCharacterAbilities() const
{
	UAbilitySystemComponentBase* ASC = CastChecked<UAbilitySystemComponentBase>(GetAbilitySystemComponent());
	if(!HasAuthority()) return; //查询是否拥有网络权限,应用技能需要添加给服务器

	ASC->AddCharacterAbilities(StartupAbilities);
}

这里,技能的设置,技能的应用函数就已经实现完毕,我们现在只需要在初始化角色的时候调用角色基类身上的AddCharacterAbilities函数,即可实现技能的应用。

在英雄角色类里面,服务器端初始化函数为PossessedBy,我们在内部初始化ASC后,调用初始化技能即可。

cpp 复制代码
void AHeroCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);

	//初始化ASC的OwnerActor和AvatarActor
	InitAbilityActorInfo();

	//设置OwnerActor的Controller
	SetOwner(NewController);

	//初始化角色技能
	AddCharacterAbilities();
}

测试

功能实现了,接下来,我们要实现对功能的测试,首先打开UE,创建一个技能蓝图,基于我们之前创建的技能类

内部默认有两个函数回调,一个是技能被激活后的回调,我们可以在后面计算消耗,播放动画,以及做一些逻辑性的处理

另一个回调事件是技能结束回调,可以在技能结束时需要编辑一些逻辑处理

技能的结束需要我们手动去处理,在内部调用,是用commitAbility节点(计算技能消耗是否达标,不达标自动结束技能)EndAbility节点(结束技能)或者在外部取消技能

一下是我们实现的一个技能测试蓝图,延迟一秒结束技能,看是否正常打印

打开英雄角色蓝图,发现自定义属性这里多了一项设置技能的数组参数,将我们创建的技能蓝图设置上去

接着运行,看是否正常打印,如果正常打印,那证明技能使用测试通过。

相关推荐
东阳马生架构2 分钟前
订单初版—5.售后退货链路中的技术问题说明文档
java
小小寂寞的城7 分钟前
JAVA策略模式demo【设计模式系列】
java·设计模式·策略模式
阿猿收手吧!24 分钟前
【计算机网络】HTTP1.0 HTTP1.1 HTTP2.0 QUIC HTTP3 究极总结
开发语言·计算机网络
JAVA学习通25 分钟前
图书管理系统(完结版)
java·开发语言
abigalexy31 分钟前
深入Java锁机制
java
paishishaba32 分钟前
处理Web请求路径参数
java·开发语言·后端
七七七七0733 分钟前
C++类对象多态底层原理及扩展问题
开发语言·c++
神仙别闹34 分钟前
基于Java+MySQL实现(Web)可扩展的程序在线评测系统
java·前端·mysql
程序无bug35 分钟前
Java中的8中基本数据类型转换
java·后端