虚幻引擎UE5专用服务器游戏开发-20 添加基础能力类与连招能力

摘要:本文介绍了虚幻引擎GameplayAbilitySystem(GAS)框架中技能系统的实现方法。主要内容包括如何创建GameplayAbility子类GA_Combo,重写ActivateAbility函数实现技能激活逻辑,使用CommitAbility检查资源条件,以及通过EndAbility处理技能结束。同时说明了如何在AbilitySystemComponent中添加技能数组,并使用GiveAbility方法授予角色初始能力。最后指出这些操作应在服务器端实施,并提供了角色类中的调用示例。

Gameplay Ability

Gameplay Ability类概览。

1.创建类:

基于CGameplayAbility创建子类:GA_Combo

2.在GA_Combo类里重写函数:

Source/Crunch/Public/GAS/GameplayAbility/GA_Combo.h:

public:
	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
	
这是一个虚幻引擎Gameplay Ability System (GAS)框架中用于激活技能的核心虚函数重写声明。该函数在技能被激活时调用,主要功能包括:

函数参数说明:

  • Handle:技能规格的唯一标识符

  • ActorInfo:包含施法者相关信息的结构体

  • ActivationInfo:技能激活相关信息

  • TriggerEventData:触发技能的事件数据

典型实现流程:

  • 首先调用CommitAbility检查资源/冷却条件

  • 执行技能核心逻辑(如应用GameplayEffect、播放动画等)

  • 最后调用EndAbility结束技能

注意事项:

  • 需要先检查CommitAbility返回值

  • 必须调用EndAbility来正确结束技能

  • 可以在派生类中扩展特定功能(如被动技能处理)

相关扩展:

  • 被动技能通常需要重写此函数并绑定结束回调监听

  • 交互系统(如Lyra)会在此函数中处理交互逻辑

  • 可通过GameplayTag配置输入激活方式

(1)检查两件事: 技能是否冷却中 \  法力是否足够

virtual bool CommitAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, OUT FGameplayTagContainer* OptionalRelevantTags = nullptr);

这是虚幻引擎GAS框架中用于提交技能资源/冷却的核心函数声明。该函数通常在技能激活前调用,用于检查并消耗技能所需的资源条件。

主要功能特点:

  1. 返回值‌:返回bool类型,表示资源/冷却条件是否满足

    • true:条件满足,可以激活技能
    • false:条件不满足,应取消技能激活
  2. 典型使用场景‌:

    • ActivateAbility函数中首先调用该函数进行条件检查
    • 失败时应调用CancelAbility终止技能
    • 成功后可继续执行技能逻辑
  3. 参数说明‌:

    • Handle:技能规格的唯一标识符
    • ActorInfo:包含施法者信息的结构体
    • ActivationInfo:技能激活相关信息
    • OptionalRelevantTags:输出参数,可返回相关GameplayTag
  4. 实现建议‌:

    • 通常与ActivateAbilityEndAbility配合使用形成完整生命周期
    • 派生类可重写该函数实现自定义资源检查逻辑
    • 被动技能可能需要特殊处理该函数的调用时机
	if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
	{
		EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
		return;
	}

(2)条件不满足,取消技能施法

/** Native function, called if an ability ends normally or abnormally. If bReplicate is set to true, try to replicate the ending to the client/server */
	virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled);

这是虚幻引擎GAS系统中处理技能结束的核心虚函数声明,主要功能包括:

参数说明‌:

  • Handle:标识技能实例的唯一句柄
  • ActorInfo:包含施法者相关信息的结构体
  • ActivationInfo:记录技能激活状态的数据
  • bReplicateEndAbility:控制是否同步结束状态到网络客户端/服务端
  • bWasCancelled:标识技能是被取消还是正常结束

典型实现要点‌:

  • 必须调用父类的EndAbility确保基础清理逻辑执行
  • 被动技能通常需要在此函数中解除事件绑定
  • 自动移除技能时可配合OnGiveAbility实现完整生命周期管理

派生类扩展建议‌:

  • 可结合EWarriorAbilityActivationPolicy枚举实现不同的结束策略
  • 通过bWasCancelled参数区分正常结束和强制取消的情况
  • 网络同步时需正确处理bReplicateEndAbility参数

(3)条件满足时,触发事件或者打印:

void UGA_Combo::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
	const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{
	Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
	if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
	{
		EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
		return;
	}

	UE_LOG(LogTemp, Warning, TEXT("UGA_Combo::ActivateAbility"));
}

但是,释放技能前,要先将技能附加给玩家:

(4)在GAS中,添加技能数组:

Source/Crunch/Public/GAS/CAbilitySystemComponent.h:

	UPROPERTY(EditDefaultsOnly, Category="Gameplay Abilities")
	TArray<TSubclassOf<UCGameplayAbility>> Abilities;	
	
	UPROPERTY(EditDefaultsOnly, Category="Gameplay Abilities")
	TArray<TSubclassOf<UCGameplayAbility>> BasicAbilities;	
	

上述代码错误,应该是:

	UPROPERTY(EditDefaultsOnly, Category="Gameplay Abilities")
	TArray<TSubclassOf<UGameplayAbility>> Abilities;	//激活后的能力
	
	UPROPERTY(EditDefaultsOnly, Category="Gameplay Abilities")
	TArray<TSubclassOf<UGameplayAbility>> BasicAbilities;	//初始能力
	

(5)授予能力

	//授予初始能力
	void GiveInitialAbilities();

Source/Crunch/Private/GAS/CAbilitySystemComponent.cpp: 

void UCAbilitySystemComponent::GiveInitialAbilities()
{
	if (!GetOwner() || !GetOwner()->HasAuthority()) return;
	
	for (const TSubclassOf<UGameplayAbility>& AbilityClass : Abilities)
	{
		FGameplayAbilitySpec GameplayAbilitySpec = FGameplayAbilitySpec(AbilityClass, 0, INDEX_NONE, nullptr);
		GiveAbility(GameplayAbilitySpec);
	}
	for (const TSubclassOf<UGameplayAbility>& AbilityClass : BasicAbilities)
	{
		FGameplayAbilitySpec GameplayAbilitySpec = FGameplayAbilitySpec(AbilityClass, 1, INDEX_NONE, nullptr);
		GiveAbility(GameplayAbilitySpec);
	}
}

其中:

/** Version that takes an ability class */
	FGameplayAbilitySpec(TSubclassOf<UGameplayAbility> InAbilityClass, int32 InLevel = 1, int32 InInputID = INDEX_NONE, UObject* InSourceObject = nullptr);

这是虚幻引擎GAS系统中FGameplayAbilitySpec结构体的构造函数重载版本,专门用于通过技能类模板参数初始化技能规格。该构造函数主要处理以下参数:

核心参数说明‌:

  • InAbilityClass:必须继承自UGameplayAbility的模板类,用于指定技能类型
  • InLevel:默认值为1的技能等级参数
  • InInputID:绑定输入操作的ID,默认INDEX_NONE表示不绑定输入
  • InSourceObject:技能来源对象指针,默认nullptr

典型使用场景‌:

  • GiveAbility调用时构造技能规格实例
  • 通过TSubclassOf模板确保类型安全
  • UGameplayAbilitySystemComponent::GiveAbility配合实现技能授予

注意事项‌:

  • 派生类需确保TSubclassOf<T>中的T与UGameplayAbility存在继承关系
  • 输入ID需与项目的输入映射系统匹配
    • 源对象通常用于标识技能来源(如装备、Buff等)                                                        
FGameplayAbilitySpecHandle GiveAbility(const FGameplayAbilitySpec& AbilitySpec);

这是虚幻引擎GAS系统中UAbilitySystemComponent类的核心方法,用于向Actor授予游戏技能。该方法的主要功能特点如下:

参数说明‌:

  • AbilitySpec:包含技能类引用、输入绑定、等级等配置信息的结构体
  • 返回值FGameplayAbilitySpecHandle:用于后续管理该技能的唯一句柄

执行流程‌:

  • 仅在服务端有效执行,客户端调用会被忽略
  • 内部会创建技能实例并初始化状态数据
  • 自动处理网络同步和预测相关逻辑

注意事项‌:

  • 需确保AbilitySpec中的技能类已正确继承UGameplayAbility
  • 通过返回的Handle可后续进行技能取消或移除操作
  • 被动技能通常需要设置InstancingPolicyInstancedPerActor

(6)我们在哪里使用它们呢?

答案:服务器端

Source/Crunch/Private/Character/CCharacter.cpp:

void ACCharacter::ServerSideInit()
{
	CAbilitySystemComponent->InitAbilityActorInfo(this, this);	//应用能力系统组件前都要初始化
	CAbilitySystemComponent->ApplyInitialEffects();		//效果初始化
	CAbilitySystemComponent->GiveInitialAbilities();		//能力初始化
}

3.在角色蓝图里,添加GA_Combo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值