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节点(结束技能)或者在外部取消技能

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

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

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

相关推荐
冷雨夜中漫步4 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919106 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_7 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934737 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble7 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟7 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖7 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472468 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ8 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto