Loading...
Loading...
Compare original and translation side by side
.agents/ue-project-context.md.agents/ue-project-context.mdUAbilitySystemComponent| Pillar | Class | Purpose |
|---|---|---|
| Abilities | | Logic for what happens when activated |
| Effects | | Data-driven stat mutations (instant, duration, infinite) |
| Attributes | | Float properties representing character stats |
UAbilitySystemComponent| 核心模块 | 类 | 用途 |
|---|---|---|
| 能力 | | 定义能力激活时的执行逻辑 |
| 效果 | | 基于数据的属性变更(即时、持续、永久) |
| 属性 | | 代表角色属性的浮点型属性集合 |
GameplayAbilities.uproject[ProjectName].Build.csPublicDependencyModuleNames.AddRange(new string[]
{
"GameplayAbilities", "GameplayTags", "GameplayTasks"
});.uprojectGameplayAbilities[ProjectName].Build.csPublicDependencyModuleNames.AddRange(new string[]
{
"GameplayAbilities", "GameplayTags", "GameplayTasks"
});references/gas-setup-patterns.mdreferences/gas-setup-patterns.mdIAbilitySystemInterface#include "AbilitySystemInterface.h"
UCLASS()
class AMyCharacter : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override
{ return AbilitySystemComponent; }
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "GAS")
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
};IAbilitySystemInterface#include "AbilitySystemInterface.h"
UCLASS()
class AMyCharacter : public ACharacter, public IAbilitySystemInterface
{
GENERATED_BODY()
public:
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override
{ return AbilitySystemComponent; }
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "GAS")
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
};// In BeginPlay or PossessedBy on the server:
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);| Mode | When to Use |
|---|---|
| AI or non-player actors; no GE replication to simulated proxies |
| Player-controlled characters (owner gets full info, others get minimal) |
| Non-player games or debugging; all GEs replicate to all clients |
// 在服务器端的BeginPlay或PossessedBy函数中调用:
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);| 模式 | 使用场景 |
|---|---|
| AI或非玩家角色;不向模拟代理复制GameplayEffect |
| 玩家控制角色(拥有者获取完整信息,其他客户端获取最小信息) |
| 非玩家游戏或调试场景;所有GameplayEffect复制到所有客户端 |
PossessedByOnRep_PlayerStateASC->InitAbilityActorInfo(OwnerActor, AvatarActor)references/gas-setup-patterns.mdPossessedByOnRep_PlayerStateASC->InitAbilityActorInfo(OwnerActor, AvatarActor)references/gas-setup-patterns.md#include "Abilities/GameplayAbility.h"
UCLASS()
class UMyFireballAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
UMyFireballAbility();
virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData) override;
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled) override;
// Ability Tasks — async building blocks for latent abilities:
// UAbilityTask_WaitTargetData — waits for targeting (crosshair/AoE confirm)
// UAbilityTask_WaitGameplayEvent — waits for a GameplayEvent tag (e.g., anim notify)
// UAbilityTask_WaitDelay — simple timer
// UAbilityTask_PlayMontageAndWait — montage with callbacks (see ue-animation-system)
// See references/ability-task-reference.md for full list and custom task pattern.
// CancelAbility — called by CancelAbilitiesWithTag or ASC->CancelAbility(Handle)
// Internally calls EndAbility with bWasCancelled=true. Override to add cleanup:
virtual void CancelAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateCancelAbility) override;
// Custom activation guard — return false to block activation beyond tag checks
virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, /*...*/) const override;
// Must call Super first. Add custom checks (resource availability, cooldown state).
protected:
UPROPERTY(EditDefaultsOnly, Category = "GAS")
TSubclassOf<UGameplayEffect> DamageEffect;
};#include "Abilities/GameplayAbility.h"
UCLASS()
class UMyFireballAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
UMyFireballAbility();
virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData) override;
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled) override;
// Ability Tasks — 用于实现延迟能力的异步构建块:
// UAbilityTask_WaitTargetData — 等待目标选择(准星/范围确认)
// UAbilityTask_WaitGameplayEvent — 等待GameplayEvent标签(例如动画通知)
// UAbilityTask_WaitDelay — 简单计时器
// UAbilityTask_PlayMontageAndWait — 带回调的动画蒙太奇(参考ue-animation-system)
// 完整列表和自定义任务模式请查看references/ability-task-reference.md。
// CancelAbility — 由CancelAbilitiesWithTag或ASC->CancelAbility(Handle)调用
// 内部会调用bWasCancelled=true的EndAbility。重写该方法以添加清理逻辑:
virtual void CancelAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateCancelAbility) override;
// 自定义激活校验 — 返回false可在标签检查之外阻断能力激活
virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, /*...*/) const override;
// 必须先调用Super,再添加自定义检查(资源可用性、冷却状态)。
protected:
UPROPERTY(EditDefaultsOnly, Category = "GAS")
TSubclassOf<UGameplayEffect> DamageEffect;
};void UMyFireballAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
// 1. Commit: validates and applies cost + cooldown
if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
return;
}
// 2. Apply effect / spawn projectile / etc.
FGameplayEffectSpecHandle Spec = MakeOutgoingGameplayEffectSpec(DamageEffect, GetAbilityLevel());
FGameplayAbilityTargetDataHandle TargetData =
UAbilitySystemBlueprintLibrary::AbilityTargetDataFromActor(
ActorInfo->AvatarActor.Get());
ApplyGameplayEffectSpecToTarget(Handle, ActorInfo, ActivationInfo, Spec, TargetData);
// 3. End (instant abilities end immediately; latent abilities wait for tasks)
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}CommitAbilityCommitAbilityCostCommitAbilityCooldownvoid UMyFireballAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
// 1. 提交:验证并应用消耗与冷却
if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
return;
}
// 2. 应用效果/生成投射物等
FGameplayEffectSpecHandle Spec = MakeOutgoingGameplayEffectSpec(DamageEffect, GetAbilityLevel());
FGameplayAbilityTargetDataHandle TargetData =
UAbilitySystemBlueprintLibrary::AbilityTargetDataFromActor(
ActorInfo->AvatarActor.Get());
ApplyGameplayEffectSpecToTarget(Handle, ActorInfo, ActivationInfo, Spec, TargetData);
// 3. 结束能力(即时能力立即结束;延迟能力需等待任务完成)
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}CommitAbilityCommitAbilityCostCommitAbilityCooldownUMyFireballAbility::UMyFireballAbility()
{
// InstancedPerActor - one instance per actor; cheapest for persistent abilities
// InstancedPerExecution - new instance each activation; safe for concurrency
// NonInstanced - CDO runs the ability; no per-execution state
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
// LocalPredicted - client runs immediately, server validates (player abilities)
// ServerOnly - authority only, no prediction
// LocalOnly - local client only (UI, cosmetic)
// ServerInitiated - server activates, clients run non-authoritative predicted copy
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
}UMyFireballAbility::UMyFireballAbility()
{
// InstancedPerActor - 每个Actor一个实例;对持久化能力来说性能最优
// InstancedPerExecution - 每次激活创建新实例;并发场景下更安全
// NonInstanced - 使用CDO运行能力;无每次执行的独立状态
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
// LocalPredicted - 客户端立即执行,服务器验证(玩家能力推荐)
// ServerOnly - 仅权威端执行,无预测
// LocalOnly - 仅本地客户端执行(UI、 cosmetic效果)
// ServerInitiated - 服务器激活,客户端运行非权威预测副本
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
}// Grant (server/authority only):
FGameplayAbilitySpecHandle Handle = ASC->GiveAbility(
FGameplayAbilitySpec(UMyFireballAbility::StaticClass(), 1 /*Level*/));
ASC->TryActivateAbility(Handle); // by handle
ASC->TryActivateAbilityByClass(UMyFireballAbility::StaticClass()); // by class
ASC->TryActivateAbilitiesByTag( // by tag
FGameplayTagContainer(FGameplayTag::RequestGameplayTag("Ability.Skill.Fireball")));// 授予能力(仅服务器/权威端可调用):
FGameplayAbilitySpecHandle Handle = ASC->GiveAbility(
FGameplayAbilitySpec(UMyFireballAbility::StaticClass(), 1 /*等级*/));
ASC->TryActivateAbility(Handle); // 通过句柄激活
ASC->TryActivateAbilityByClass(UMyFireballAbility::StaticClass()); // 通过类激活
ASC->TryActivateAbilitiesByTag( // 通过标签激活
FGameplayTagContainer(FGameplayTag::RequestGameplayTag("Ability.Skill.Fireball")));// Tags this ability grants to its owner while active:
ActivationOwnedTags.AddTag(FGameplayTag::RequestGameplayTag("Ability.Active.Casting"));
// Tags that prevent this ability from activating:
ActivationBlockedTags.AddTag(FGameplayTag::RequestGameplayTag("State.Stunned"));
// Cancel other active abilities with these tags on activation:
CancelAbilitiesWithTag.AddTag(FGameplayTag::RequestGameplayTag("Ability.Active.Melee"));// 能力激活时授予所有者的标签:
ActivationOwnedTags.AddTag(FGameplayTag::RequestGameplayTag("Ability.Active.Casting"));
// 阻止该能力激活的标签:
ActivationBlockedTags.AddTag(FGameplayTag::RequestGameplayTag("State.Stunned"));
// 激活时会取消其他拥有以下标签的活跃能力:
CancelAbilitiesWithTag.AddTag(FGameplayTag::RequestGameplayTag("Ability.Active.Melee"));| Policy | Behavior |
|---|---|
| Executes once; modifies attribute base value permanently |
| Active for set duration; uses |
| Active until |
| 策略 | 行为 |
|---|---|
| 执行一次;永久修改属性的基础值 |
| 在设定时长内生效;使用 |
| 持续生效,直到调用 |
FGameplayEffectContextHandle Ctx = ASC->MakeEffectContext();
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(UMyDamageEffect::StaticClass(), Level, Ctx);
// SetByCaller: inject runtime magnitude using a tag key
Spec.Data->SetSetByCallerMagnitude(
FGameplayTag::RequestGameplayTag("SetByCaller.Damage"), 75.f);
ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get()); // self
ASC->ApplyGameplayEffectSpecToTarget(*Spec.Data.Get(), TargetASC); // target
ASC->RemoveActiveGameplayEffect(ActiveHandle); // by handle
ASC->RemoveActiveGameplayEffectBySourceEffect(
UMyDamageEffect::StaticClass(), nullptr); // by classreferences/gameplay-effect-reference.mdUGameplayEffectExecutionCalculationFGameplayEffectContextHandle Ctx = ASC->MakeEffectContext();
FGameplayEffectSpecHandle Spec = ASC->MakeOutgoingSpec(UMyDamageEffect::StaticClass(), Level, Ctx);
// SetByCaller:使用标签键注入运行时数值
Spec.Data->SetSetByCallerMagnitude(
FGameplayTag::RequestGameplayTag("SetByCaller.Damage"), 75.f);
ASC->ApplyGameplayEffectSpecToSelf(*Spec.Data.Get()); // 应用到自身
ASC->ApplyGameplayEffectSpecToTarget(*Spec.Data.Get(), TargetASC); // 应用到目标
ASC->RemoveActiveGameplayEffect(ActiveHandle); // 通过句柄移除
ASC->RemoveActiveGameplayEffectBySourceEffect(
UMyDamageEffect::StaticClass(), nullptr); // 通过类移除UGameplayEffectExecutionCalculationreferences/gameplay-effect-reference.md// MyHealthSet.h
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
// Convenience macro - define in your project headers
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
UCLASS()
class UMyHealthSet : public UAttributeSet
{
GENERATED_BODY()
public:
UMyHealthSet();
// Called BEFORE any modification - use for clamping current value
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
// Called AFTER instant GE executes - react to changes (death, events)
virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Health")
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UMyHealthSet, Health)
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category = "Health")
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UMyHealthSet, MaxHealth)
protected:
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldHealth);
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth);
};.cppvoid UMyHealthSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UMyHealthSet, Health, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UMyHealthSet, MaxHealth, COND_None, REPNOTIFY_Always);
}
void UMyHealthSet::OnRep_Health(const FGameplayAttributeData& OldHealth)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UMyHealthSet, Health, OldHealth);
}
// PreAttributeChange: clamp CURRENT value before any modification
void UMyHealthSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
Super::PreAttributeChange(Attribute, NewValue);
if (Attribute == GetHealthAttribute())
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
}
// PostGameplayEffectExecute: react AFTER instant GE modifies base value (damage, death)
void UMyHealthSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
Super::PostGameplayEffectExecute(Data);
if (Data.EvaluatedData.Attribute == GetHealthAttribute())
{
SetHealth(FMath::Clamp(GetHealth(), 0.f, GetMaxHealth()));
if (GetHealth() <= 0.f) { /* trigger death */ }
}
}// MyHealthSet.h
#include "AttributeSet.h"
#include "AbilitySystemComponent.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 UMyHealthSet : public UAttributeSet
{
GENERATED_BODY()
public:
UMyHealthSet();
// 在属性修改前调用 - 用于限制当前值的范围
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
// 即时GameplayEffect执行后调用 - 响应属性变化(死亡、事件触发)
virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Health")
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UMyHealthSet, Health)
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category = "Health")
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UMyHealthSet, MaxHealth)
protected:
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldHealth);
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth);
};.cppvoid UMyHealthSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UMyHealthSet, Health, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UMyHealthSet, MaxHealth, COND_None, REPNOTIFY_Always);
}
void UMyHealthSet::OnRep_Health(const FGameplayAttributeData& OldHealth)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UMyHealthSet, Health, OldHealth);
}
// PreAttributeChange: 在任何修改前限制当前值的范围
void UMyHealthSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
Super::PreAttributeChange(Attribute, NewValue);
if (Attribute == GetHealthAttribute())
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
}
// PostGameplayEffectExecute: 即时GameplayEffect修改基础值后响应(伤害、死亡)
void UMyHealthSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
Super::PostGameplayEffectExecute(Data);
if (Data.EvaluatedData.Attribute == GetHealthAttribute())
{
SetHealth(FMath::Clamp(GetHealth(), 0.f, GetMaxHealth()));
if (GetHealth() <= 0.f) { /* 触发死亡逻辑 */ }
}
}// In PlayerState or Character constructor:
// Option 1: CreateDefaultSubobject (auto-registered as subobject)
HealthSet = CreateDefaultSubobject<UMyHealthSet>(TEXT("HealthSet"));
// Option 2: Runtime (authority only) — create and register as subobject:
UMyHealthSet* NewSet = NewObject<UMyHealthSet>(this);
AbilitySystemComponent->AddSpawnedAttribute(NewSet);
// Read attribute value:
float CurrentHealth = AbilitySystemComponent->GetNumericAttribute(
UMyHealthSet::GetHealthAttribute());UAttributeSetUHealthSetUOffenseSet// 在PlayerState或Character的构造函数中:
// 选项1: CreateDefaultSubobject(自动作为子对象注册)
HealthSet = CreateDefaultSubobject<UMyHealthSet>(TEXT("HealthSet"));
// 选项2: 运行时注册(仅权威端)—— 创建并注册为子对象:
UMyHealthSet* NewSet = NewObject<UMyHealthSet>(this);
AbilitySystemComponent->AddSpawnedAttribute(NewSet);
// 读取属性值:
float CurrentHealth = AbilitySystemComponent->GetNumericAttribute(
UMyHealthSet::GetHealthAttribute());UAttributeSetUHealthSetUOffenseSetConfig/DefaultGameplayTags.ini// MyGameplayTags.h
#include "NativeGameplayTags.h"
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Ability_Fireball)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_State_Stunned)
// MyGameplayTags.cpp
UE_DEFINE_GAMEPLAY_TAG_COMMENT(TAG_Ability_Fireball, "Ability.Skill.Fireball", "Fireball ability")
UE_DEFINE_GAMEPLAY_TAG_COMMENT(TAG_State_Stunned, "State.Stunned", "Actor is stunned")Config/DefaultGameplayTags.ini// MyGameplayTags.h
#include "NativeGameplayTags.h"
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Ability_Fireball)
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_State_Stunned)
// MyGameplayTags.cpp
UE_DEFINE_GAMEPLAY_TAG_COMMENT(TAG_Ability_Fireball, "Ability.Skill.Fireball", "火球术能力")
UE_DEFINE_GAMEPLAY_TAG_COMMENT(TAG_State_Stunned, "State.Stunned", "Actor处于眩晕状态")"A.1".MatchesTag("A") == trueMatchesTagExactFGameplayTagContainer Tags;
Tags.HasTag(FireballTag); // parent-aware match
Tags.HasTagExact(FireballTag); // exact only
Tags.HasAny(OtherContainer);
Tags.HasAll(OtherContainer);
// Query ASC:
ASC->HasMatchingGameplayTag(TAG_State_Stunned);
ASC->GetOwnedGameplayTags(); // FGameplayTagContainer
// Listen for changes:
ASC->RegisterGameplayTagEvent(TAG_State_Stunned, EGameplayTagEventType::NewOrRemoved)
.AddUObject(this, &AMyCharacter::OnStunnedTagChanged);"A.1".MatchesTag("A") == trueMatchesTagExactFGameplayTagContainer Tags;
Tags.HasTag(FireballTag); // 支持父标签匹配
Tags.HasTagExact(FireballTag); // 仅完全匹配
Tags.HasAny(OtherContainer);
Tags.HasAll(OtherContainer);
// 查询ASC的标签状态:
ASC->HasMatchingGameplayTag(TAG_State_Stunned);
ASC->GetOwnedGameplayTags(); // 返回FGameplayTagContainer
// 监听标签变化:
ASC->RegisterGameplayTagEvent(TAG_State_Stunned, EGameplayTagEventType::NewOrRemoved)
.AddUObject(this, &AMyCharacter::OnStunnedTagChanged);ASC->AddLooseGameplayTag(TAG_State_Stunned);
ASC->RemoveLooseGameplayTag(TAG_State_Stunned);
// Loose tags are NOT replicated by default. To replicate a loose tag,
// pass EGameplayTagReplicationState::TagOnly as the third argument:
ASC->AddLooseGameplayTag(TAG_State_Buffed, 1, EGameplayTagReplicationState::TagOnly);
ASC->RemoveLooseGameplayTag(TAG_State_Buffed, 1, EGameplayTagReplicationState::TagOnly);ASC->AddLooseGameplayTag(TAG_State_Stunned);
ASC->RemoveLooseGameplayTag(TAG_State_Stunned);
// 松散标签默认不复制。若要复制松散标签,
// 需将第三个参数设为EGameplayTagReplicationState::TagOnly:
ASC->AddLooseGameplayTag(TAG_State_Buffed, 1, EGameplayTagReplicationState::TagOnly);
ASC->RemoveLooseGameplayTag(TAG_State_Buffed, 1, EGameplayTagReplicationState::TagOnly);GameplayCue.FGameplayEffectCueGameplayCueTags// Burst (one-shot):
ASC->ExecuteGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Hit.Fire"),
ASC->MakeEffectContext());
// Persistent (add/remove pair):
ASC->AddGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));
ASC->RemoveGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));
// Poll active state:
bool bActive = ASC->IsGameplayCueActive(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));AGameplayCueNotify_ActorOnActiveWhileActiveOnRemoveAGameplayCueNotify_StaticOnExecute/Game/GAS/GameplayCues/UGameplayCueManagerGameplayCue.FGameplayEffectCueGameplayCueTags// 一次性触发:
ASC->ExecuteGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Hit.Fire"),
ASC->MakeEffectContext());
// 持久化触发(需成对调用添加/移除):
ASC->AddGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));
ASC->RemoveGameplayCue(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));
// 检查激活状态:
bool bActive = ASC->IsGameplayCueActive(FGameplayTag::RequestGameplayTag("GameplayCue.Buff.Speed"));AGameplayCueNotify_ActorOnActiveWhileActiveOnRemoveAGameplayCueNotify_StaticOnExecute/Game/GAS/GameplayCues/UGameplayCueManagerIAbilitySystemInterfaceUAbilitySystemBlueprintLibraryOnRep_PlayerStatePossessedByPreAttributeChangePostGameplayEffectExecutePreAttributeChangeAddLooseGameplayTagEGameplayTagReplicationState::TagOnlyLimitCountGetCurrentStackCountInitAbilityActorInfo(AICharacter, AICharacter)MinimalFActiveGameplayEffectsContainerInitAbilityActorInfoBeginPlayIAbilitySystemInterfaceUAbilitySystemBlueprintLibraryOnRep_PlayerStatePossessedByPreAttributeChangePostGameplayEffectExecutePreAttributeChangeAddLooseGameplayTagEGameplayTagReplicationState::TagOnlyLimitCountGetCurrentStackCountInitAbilityActorInfo(AICharacter, AICharacter)MinimalInitAbilityActorInfoFActiveGameplayEffectsContainerBeginPlayreferences/gas-setup-patterns.mdreferences/gameplay-effect-reference.mdreferences/ability-task-reference.mdreferences/gas-setup-patterns.mdreferences/gameplay-effect-reference.mdreferences/ability-task-reference.mdue-actor-component-architectureue-networking-replicationue-animation-systemue-gameplay-frameworkue-cpp-foundationsue-actor-component-architectureue-networking-replicationue-animation-systemue-gameplay-frameworkue-cpp-foundations