五个核心概念
GAS 的学习曲线主要来自概念多,但核心只有五个,记住这五个就能读懂 90% 的代码。
1. AbilitySystemComponent(ASC)—— 基础设施
每个"可参与 gameplay 的对象"(角色、可破坏物)身上挂一个 UAbilitySystemComponent。它是整套系统的调度中心:管属性、管技能、管标签、管效果。所有 GAS 的入口都从 ASC 开始。
// 典型挂法(角色头文件)
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Abilities")
UAbilitySystemComponent* AbilitySystemComponent;
2. Attributes(属性)—— 数据
属性用 UAttributeSet 定义,是一组 FGameplayAttributeData(当前值 + 基础值):
UCLASS()
class UMyAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly, Category="Health")
FGameplayAttributeData Health; // 当前血量
UPROPERTY(BlueprintReadOnly, Category="Health")
FGameplayAttributeData MaxHealth; // 上限
};
关键设计:属性分"当前值"和"基础值"。Buff 加的 50 点上限改的是基础值;当前值另外维护。这套语义贯穿后面所有内容。
3. GameplayTags(标签)—— 状态语言
标签是一个层次化的名字,如 State.Stunned、Cooldown.Skill.Fireball、DamageType.Fire。GAS 用标签而不是枚举或布尔表达状态:
- "是否眩晕" = 是否有
State.Stunned标签; - "冷却中" = 是否有对应 Cooldown 标签;
- "是否施法" = 是否有
State.Casting。
标签可被 Ability、Effect、ASC 动态添加/移除,且天然支持网络同步。
4. GameplayEffect(GE)—— 改变属性的唯一通道
想加血、扣血、加 Buff?全部通过 GE。GE 是一个数据资产,描述"对谁的什么属性做多少修改、持续多久、能否叠加"。
GE_PotionHeal(回血药水)
├─ Duration: Instant(立即生效)
├─ Modifier: Health +50
└─ 适用标签: 无
为什么不直接 Health -= 30?因为 GE 通道让每条修改都可追溯、可复制、可预测、可回滚。手写 Health -= 30 在多人游戏里就是灾难的开始。
5. GameplayAbility(GA)—— 行动单元
技能、攻击、互动、闪避——每个"行动"是一个 GA。它封装了:触发条件、冷却、花费(蓝量/连击点)、执行逻辑(C++/蓝图)、网络行为(本地预测 + Server 权威)。
UCLASS()
class UGA_Fireball : public UGameplayAbility
{
GENERATED_BODY()
public:
// 冷却 GE、花费 GE、施法蒙太奇等全部可配
UPROPERTY(EditDefaultsOnly) TSubclassOf<UGameplayEffect> CostGE;
};
五者的关系
ASC(大厅)
├─ AttributeSet:属性(血、蓝、攻击力…)
├─ GameplayTags:当前状态(眩晕、冷却中…)
├─ GameplayEffects:正在生效的修改(Buff/Debuff/DoT)
└─ GameplayAbilities:可执行的行动(火球、闪避…)
└─ 触发时 → 施加 GE → 修改属性 / 加标签
一句话总结:ASC 是舞台,属性是数据,GE 是唯一改数据的通道,GA 是行动,标签是它们之间沟通的语言。
本章小结
- 五个核心:ASC(调度)、属性(数据)、标签(状态语言)、GE(唯一修改通道)、GA(行动单元)。
- 属性分当前值/基础值;状态用标签表达而非布尔。
- 手改属性是 GAS 项目的头号禁忌——必须走 GE。
