五分钟跑起最小 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 的正确姿势是不断扩展这个闭环,而不是一次学完所有特性。
