五分钟跑起最小 GAS 项目

不讲完所有概念,直接动手。目标是:角色按 1 键,回 50 点血,UI 上能看到血量变化。

第 1 步:启用插件

Edit → Plugins → 搜索 Gameplay Abilities,启用(Built-in,需"蓝图 / C++ 项目"里勾选引擎源码可不行,普通项目开 Built-in 插件即可;GAS 是引擎自带插件)。

第 2 步:角色挂 ASC(C++)

// AMyCharacter 头文件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Abilities", meta=(AllowPrivateAccess="true"))
UAbilitySystemComponent* AbilitySystemComponent;

// .cpp 构造函数
AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
AbilitySystemComponent->SetIsReplicated(true);
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);

// 或实现 IAbilitySystemInterface 接口

蓝图角色也可以:Add Component → AbilitySystemComponent(无需 C++)。

第 3 步:属性集(AttributeSet)

最小例可以先不建属性集——直接用 GE 操作"虚拟属性"不方便,最简演示仍建议建一个(UMG 绑定要用):

UMyAttributeSet : public UAttributeSet
    FGameplayAttributeData Health;      // 当前血
    FGameplayAttributeData MaxHealth;  // 上限

构造函数里 Health.SetBaseValue(100.f); Health.SetValue(100.f); 等。

第 4 步:一个加血 GE

内容浏览器新建 Blueprint Class → 父类 GameplayEffect,命名 GE_HealPotion:

  • Duration Policy: Instant(立即)
  • Modifiers: + Health 50(ScalableFloat 或属性曲线)

第 5 步:一个回血 GA

新建 GameplayAbility 蓝图 GA_Heal,事件图表:

Event ActivateAbility
   → Apply Gameplay Effect to Owner(GE_HealPotion)
   → EndAbility(CommitAbility 之后)

在 ASC 上"授予"(Grant Ability)这个 GA,或用 GiveAbility 在 BeginPlay。

第 6 步:按键触发

角色蓝图中:Enhanced Input 的 IA_Heal → TryActivateAbility(GA_Heal)。

跑起来:按 1 → 血量 +50。如果开了多人监听服务器,第二个人能看到回血同步。

常见的"为什么没反应"

症状 原因
GA 无任何反应 没 Grant 到 ASC,或 GA 的 Input 绑定没设置
GE 应用但血量没变 属性集的 Base/Current 没初始化;或 Modifier 目标属性选错
客户端看不到变化 ASC 的 Replication Mode 不对(单人/多人类角色有讲究)
第二次按不生效 GA 的 Cooldown 配了但 GE 未应用;看一下 GA 的 CooldownGameplayEffectClass

运行成功后

这个闭环虽然小,但结构完整:GA(行动)→ GE(修改通道)→ 属性(数据)→ 同步。接下来三章分别展开属性与 GE(第 3 章)、GA 与任务(第 4 章)。整套书都在这个闭环上加东西,不会突然失控。

本章小结

  • 最小闭环六步:开插件 → 挂 ASC → 属性集 → GE → GA → 按键触发。
  • 四个"没反应"的排查方向:授权、初始化、同步模式、冷却 GE。
  • 学 GAS 的正确姿势是不断扩展这个闭环,而不是一次学完所有特性。