GAS插件介绍(入门篇) | 伍德 大钊 - 观看笔记

文章字数:2383

概述

Gameplay Ability System (GAS) 是Unreal Engine中用于构建复杂技能系统的框架。它提供了一套完整的解决方案来处理游戏中的技能、效果、属性和状态管理。GAS特别适合需要复杂技能交互的游戏,如MOBA、MMORPG和动作游戏。

核心概念

Gameplay Tags (标签系统)

Gameplay Tags是GAS的基础构建块,用于标识游戏中的各种状态和效果。与传统的布尔值或枚举相比,Tags具有层级结构,支持更灵活的查询和匹配。

Tags的特点:

  • 层级结构:支持父子关系(如State.StunState.Silence都继承自State
  • 字符串基础:易于配置和修改
  • 运行时管理:无需重新编译即可修改
  • 高效的查询:引擎优化了Tag的查找性能

Tags的应用场景:

  • 状态标识(眩晕、沉默、霸体等)
  • 技能类型分类
  • 效果免疫和交互规则

Ability System Component (ASC)

ASC是GAS的核心组件,需要添加到任何需要使用技能系统的Actor上。

配置步骤:

  1. 在项目的.Build.cs文件中添加模块依赖:
cpp
1
2
3
PublicDependencyModuleNames.AddRange(new string[] {
    "GameplayAbilities", "GameplayTags", "GameplayTasks"
});
  1. 在角色类中添加ASC组件和接口:
cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
UCLASS()
class YOUR_API AYourCharacter : public ACharacter, public IAbilitySystemInterface
{
    GENERATED_BODY()
    
public:
    AYourCharacter();
    
    // 实现AbilitySystem接口
    virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
    
    // ASC组件
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Abilities")
    UAbilitySystemComponent* AbilitySystemComponent;
    
protected:
    virtual void BeginPlay() override;
};
  1. 初始化ASC和赋予初始技能:
cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void AYourCharacter::BeginPlay()
{
    Super::BeginPlay();
    
    if (AbilitySystemComponent) {
        for (auto& Ability : InitialAbilities) {
            if (Ability) {
                AbilitySystemComponent->GiveAbility(FGameplayAbilitySpec(Ability));
            }
        }
    }
}

Gameplay Ability (GA)

Gameplay Ability代表角色可以执行的具体技能或动作。

Ability的生命周期:

  1. CanActivate - 检查技能是否可以释放(CD、资源、条件等)
  2. Activate - 激活技能
  3. Commit - 提交消耗(蓝量、体力等)
  4. Execute - 执行技能逻辑
  5. End - 技能结束

Ability蓝图示例结构:

  graph TD
    A[Ability激活] --> B[播放蒙太奇动画]
    B --> C[等待命中事件]
    C --> D{是否命中目标?}
    D -->|是| E[应用Gameplay Effect]
    D -->|否| F[技能结束]
    E --> F

Gameplay Effect (GE)

Gameplay Effect用于实现技能的具体效果,如伤害、治疗、状态改变等。

Effect的三种类型:

  1. Instant - 立即生效(如直接伤害)
  2. Duration - 持续一段时间(如持续伤害Buff)
  3. Infinite - 无限持续,需要手动移除(如被动技能)

Effect的配置要素:

  • Modifiers - 属性修改器
  • Granted Tags - 授予的Tags
  • Immunities - 免疫规则
  • Stacking - 堆叠规则

实战示例

基础攻击技能实现

1. 创建攻击Ability

  • 配置输入绑定(如按键1)
  • 设置阻塞Tags防止技能连发
  • 添加蒙太奇动画播放

2. 创建受击Effect

  • 类型:Duration(0.1秒受击硬直)
  • 授予Tag:State.Hit
  • 配置受击动画播放

3. 创建伤害Effect

  • 类型:Instant
  • Modifier:减少目标生命值
  • 消耗Effect:减少自身体力值

格挡技能实现

1. 格挡Ability配置:

  graph LR
    A[按下格挡键] --> B[激活格挡Ability]
    B --> C[添加格挡Tag: State.Blocking]
    C --> D[播放格挡动画]
    D --> E[松开按键结束]
    E --> F[移除格挡Tag]

2. 伤害免疫配置: 在伤害Effect中配置Application Tag Requirements:

  • Not State.Blocking - 只有当目标没有格挡Tag时才造成伤害

连招系统实现

技能取消机制:

cpp
1
2
3
4
5
// 在Ability中配置取消Tags
CancelAbilitiesWithTag.AddTag("Ability.Positive");

// 在连招技能中配置被取消Tags
BlockAbilitiesWithTag.AddTag("Ability.Positive");

高级功能

属性系统 (Attribute Set)

Attribute Set用于定义和管理角色的各种属性。

属性定义示例:

cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
UCLASS()
class YOUR_API UYourAttributeSet : public UAttributeSet
{
    GENERATED_BODY()
    
public:
    UPROPERTY(BlueprintReadOnly, Category = "Attributes")
    FGameplayAttributeData Health;
    ATTRIBUTE_ACCESSORS(UYourAttributeSet, Health)
    
    UPROPERTY(BlueprintReadOnly, Category = "Attributes")  
    FGameplayAttributeData MaxHealth;
    ATTRIBUTE_ACCESSORS(UYourAttributeSet, MaxHealth)
    
    // 属性变化回调
    virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
    virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
};

属性修改流程:

  sequenceDiagram
    participant GE as Gameplay Effect
    participant AS as Attribute Set
    participant Character
    
    GE->>AS: 应用属性修改
    AS->>AS: PreAttributeChange (验证)
    AS->>AS: 实际修改属性值
    AS->>Character: PostGameplayEffectExecute (通知)
    Character->>Character: 更新UI/状态

技能预测 (Prediction)

GAS支持客户端预测,提供更流畅的联网体验:

预测支持的功能:

  • 技能激活
  • 属性修改
  • Gameplay Cues(特效、音效)
  • 蒙太奇播放

效果堆叠 (Stacking)

堆叠配置选项:

  • 堆叠类型:按来源堆叠或按目标堆叠
  • 堆叠限制:最大堆叠层数
  • 溢出处理:拒绝新层或刷新持续时间
  • 过期策略:逐层过期或全部过期

最佳实践

项目规划建议

1. Tag系统设计

  • 提前规划Tag的层级结构
  • 建立统一的命名规范
  • 使用Tag编辑器进行可视化管理

2. Ability组织结构

  • 按功能划分Ability类别(攻击、防御、移动等)
  • 建立基础的Ability父类减少重复代码
  • 使用DataTable配置技能数值

3. 性能优化

  • 避免在Tick中执行复杂逻辑
  • 合理使用预测功能
  • 注意网络同步的数据量

开发工作流

策划与程序协作:

  • 策划:配置Tags、Effects、动画蒙太奇
  • 程序:实现复杂的Ability逻辑、自定义Task节点
  • 美术:提供动画资源和特效

配置驱动开发:

  graph TB
    A[策划配置Tags和Effects] --> B[程序实现Ability逻辑]
    B --> C[美术提供资源]
    C --> D[整合测试]
    D --> E[迭代优化]

调试和问题排查

常用调试技巧

1. Tag状态查看

cpp
1
2
3
4
5
// 在控制台显示当前Tags
ShowDebug AbilitySystem

// 查看特定Ability的状态
AbilitySystem.DebugAbility <AbilityName>

2. Effect调试

cpp
1
2
3
4
5
// 显示当前激活的Effects
AbilitySystem.DebugEffect

// 查看属性修改历史
AbilitySystem.DebugAttribute

常见问题解决

技能无法激活:

  • 检查CD和资源消耗配置
  • 验证Blocking Tags设置
  • 确认网络权限(服务器端技能)

效果不生效:

  • 检查Tag Requirements配置
  • 验证Immunity设置
  • 确认Attribute Set正确配置

学习资源

官方文档

示例项目

  • Action RPG - 单机版GAS示例
  • Shooter Game - 包含网络同步的示例

社区资源

  • Unreal Engine论坛GAS板块
  • 相关技术博客和视频教程

总结

GAS提供了强大而灵活的技能系统框架,通过合理的规划和设计,可以大大提升游戏开发的效率和质量。掌握GAS需要理解其核心概念和设计哲学,结合实际项目需求进行适当的定制和扩展。

关键要点:

  • Tags是系统的基石,良好的Tag设计至关重要
  • 理解Ability的生命周期和交互机制
  • 合理使用预测功能提升网络游戏体验
  • 建立适合团队的工作流程和规范

通过本指南的学习,您应该能够理解GAS的核心概念并开始在实际项目中使用这一强大的框架。

参考信息

本文包含一些 AIGC 辅助生成内容,由作者人工校对整理后发布
本文采用 CC BY-NC-SA 4.0协议,如果对您有帮助或存在意见建议,欢迎在下方评论交流。
本页面浏览次数 加载中...
本页面访客数 加载中...

加载中...