使用GAS
启用插件Gameplay Ability。
在*.Build.cs中的PublicDependencyModuleNames.AddRange(new string[]后面的大括号里添加”GameplayAbilities” , “GameplayTags” , “GameplayTasks”。
AbilitySystem组件
要使用gas需要在该角色里面添加组件AbilitySystem组件。
在c++类中添加能力系统组件
#include "AbilitySystemComponent.h"
#include "AbilitySystemInterface.h"
class MYCPPLEARN_API AMyCharacterBase : public ACharacter , public IAbilitySystemInterface
{
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Abilities")
class UAbilitySystemComponent* AbilitySystemComponent;
UAbilitySystemComponent* GetAbilitySystemComponent()const override;
}
再到构造函数里添加
AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
再实现函数
UAbilitySystemComponent* AMyCharacterBase::GetAbilitySystemComponent()const
{
return AbilitySystemComponent;
}
Gameplay Ability(GA)
Gameplay Ability(GA)标识了游戏中一个对象(Actor)可以做的行为或技能。 能力(Ability)可以是普通攻击或者吟唱技能,可以是角色被击飞倒地,还可以是使用 某种道具,交互某个物件,甚至跳跃、飞行等角色行为也可以是Ability。
快速创建GA:右键内容管理器,蓝图-Gameplay技能蓝图。
如果能够释放技能,首先需要拥有技能。调用 Give Ability 函数,赋予Character一个技能。可使用蓝图节点:give ability。
释放技能主动调用
- Try Activate Ability
- Try Activate Ability by Class
- Try Activate Ability by Tag
如果使用Try Active Ability,需要在调用 Give Ability 时,记录它的返回值 Gameplay Ability Spec Handle,然后应用于 Try Active Ability 的参数中;如果使用Try Active Ability By Class,可以新建一个继承于 Gameplay Ability 类的蓝图类,然后在 In Ability to Activate 中就可以添加刚刚新创建的蓝图类,然后就能释放技能了,这是最为简单的使用方式。
一般GA要做的事有:
- 设置GA的Tag、CD、Cost等属性。
- 获取必要信息,主要通过Get Actor Info。如果是通过Event调用的GA(使用Activate Ability From Event节点作为输入),还可以通过Gameplay Event Data获取。
- 编写逻辑,如播放动画、应用GE、应用冲量等。
- 一定不要忘了EndAbility。
被动调用
可在GA的类默认设置的触发器设置。
Trigger的触发方式有三种,分别是:
- Gameplay Event: 当Owner收到一个带有Tag的Gameplay Event时调用一次GA,此时Owner不会拥有对应的Tag。
- Owner Tag Added: 当Owner获取对应Tag的时候调用一次GA。
- Owner Tag Present: 当Owner拥有Tag时调用GA,失去Tag时移除。
一般使用第一种方法,并配合SendGameplayEventToActor节点使用。
类默认设置标签
Ability Tags:该GA的标签。
Cancel Abilities with Tag:激活该GA时,打断其他拥有所选标签的GA。
Block Abilities with Tag:激活该GA时,阻止激活拥有所选标签的GA(已经激活的不会被中断)。
Activation Owned Tags:激活该GA时,赋予ASC所选GA。
Activation Required Tags:激活GA时,ASC需要的标签。
Activation Blocked Tags:激活GA时,ASC不能有的标签。
Source Required Tags:激活GA时,Source需要的标签。
Source Blocked Tags:激活GA时,Source不能有的标签。
Target Required Tags:激活GA时,Target 需要的标签。
Target Blocked Tags:激活GA时,Target 不能有的标签。
冷却
可在GA类默认设置选择指定的GE。GE需要为Has Duration类型。然后在组件里选择标签赋予目标actor。然后在添加到继承里添加一个标签。最后需要在对应GA蓝图里调用节点CommitAbility(会同时触发冷却与开销)或者CommitAbilityCooldown(只会触发冷却效果)
开销
可在GA类默认设置选择指定的GE。该GE需要为实时Instant类型,有一个或多个修饰符Modifier去修改对应的属性。
Task
GA是在一帧内完成的,如果想要实现类似Wait的异步逻辑需要使用Task。
SendGameplayEventToActor
搭配Wait Gameplay Event使用,可以使用Payload传入数据。
Attribute Set(AS)
AttributeSet负责定义和持有属性,并且管理属性的变化。在没有插件的辅助下,AttributeSet只能由C++创建。
创建
创建一个C++类继承自AttributeSet。
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "MyAttributeSet.generated.h"
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
/**
*
*/
UCLASS()
class MYCPPLEARN_API UMyAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attibute")
FGameplayAttributeData HealthValue;
ATTRIBUTE_ACCESSORS(UMyAttributeSet, HealthValue);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attibute")
FGameplayAttributeData MaxHealthValue;
ATTRIBUTE_ACCESSORS(UMyAttributeSet, MaxHealthValue);
};
然后在AbilitySystem组件指定该AS。
通过数据表格初始化AS
新建数据表格,选取行结构选择AttributeMetaData。每一行的行命名为类名.变量名。填写基础值即可初始化变量。最小值、最大值功能无作用。最后在AbilitySystem组件里选择该数据表格即可。
通过GE初始化
在修饰符里属性选择对应变量,修改器操作改为重载,填写一个值。然后在角色事件图标的事件开始运行时调用节点ApplyGameplayEffectToSelf即可。
蓝图中获取数据
节点:从能力系统组件获取浮点属性。
限制最小值最大值
需要重写函数
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
然后在源文件中实现该函数
void UMyAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
Super::PreAttributeChange(Attribute, NewValue);
if (Attribute == GetHealthValueAttribute())
{
NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxHealthValue());
}
}
广播数值变化
在c++角色类的头文件中添加
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangeEvent, float, NewHealth);
public:
UPROPERTY(BlueprintAssignable, Category = "Ability")
FOnHealthChangeEvent HealthChangeEvent;
void OnHealthChanged(const FOnAttributeChangeData& Data);
源文件实现该函数,并将它在eventbeginplay里注册到能力系统组件
void AMyCharacterBase::OnHealthChanged(const FOnAttributeChangeData& Data)
{
HealthChangeEvent.Broadcast(Data.NewValue);
}
//需要添加头文件#include"MyAttributeSet.h"
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UMyAttributeSet::GetHealthValueAttribute()).AddUObject(this, &AMyCharacterBase::OnHealthChanged);