这篇梳理一个真实 ARPG 项目里围绕 GAS 的数据资产体系:施法资产、攻击产物资产(近战环 / 飞行物)、GameplayEffect 配置规范,以及 AbilitySet 与标签关系映射。
设计要点:能力本身是空壳,所有"参数 + 数值 + 引用关系"都丢进 DataAsset,让程序员、关卡设计师、平衡策划各自有清晰的工作面。

加载顺序:SpellAsset → RingAssets + FlightAssets(并行),全部经由内部 AssetManager 异步加载返回 FStreamableHandle。
| 属性名 | 类型 | 说明 |
|---|
SpellName | FText | 技能显示名称(本地化) |
HitGameplayCues | FGameplayTagContainer | 命中目标时播放的 GameplayCue 集合 |
StartGameplayCues | FGameplayTagContainer | 技能激活时播放的 Cue |
EndGameplayCues | FGameplayTagContainer | 技能结束时播放的 Cue |
| 属性名 | 类型 | 说明 |
|---|
SpellFlights | TArray<TSoftObjectPtr<USpellFlightAsset>> | 该技能关联的所有飞行物(软引用,异步加载) |
SpawnFlightOnStart | bool | true 时激活立即生成(否则等 AnimNotify) |
FlightAnimNotifyTagOverrides | TMap<FGameplayTag, FGameplayTag> | AnimNotify → SpellFlight 的标签重定向 |
| 属性名 | 类型 | 说明 |
|---|
CostAmmo | int32 | 弹药消耗量 |
CostStaminaPercent | float | 体力消耗百分比(0.0–1.0) |
| 属性名 | 类型 | 说明 |
|---|
SpellDamageFXTypeTag | FGameplayTag | 默认伤害特效类型(决定血迹/火花类型) |
WeaponIDTagsForDamageFXTypeTag | TMap<FGameplayTagContainerKey, FGameplayTag> | 基于武器标签容器的 FX 类型覆盖 |
| 属性名 | 类型 | 说明 |
|---|
DismemberBonesOnKilling | TArray<FName> | 致命一击时强制肢解的骨骼(空 = 由 RingAsset 决定) |
| 属性名 | 类型 | 说明 |
|---|
ParryWindowTags | FGameplayTagContainer | 招架窗口期标签 |
CounterAttackTag | FGameplayTag | 弹反成功后触发的反击 |
| 属性名 | 类型 | 说明 |
|---|
AlertRadius | float | 技能使用时警戒范围半径(cm) |
CombatPhaseTag | FGameplayTag | 触发该技能的战斗阶段标签 |
抽象基类,不可直接实例化。集中描述"一次攻击的伤害、碰撞、效果"。
| 属性 | 类型 | 说明 |
|---|
HitStopTime | float | 命中停顿时长(秒) |
StaggerTag | FGameplayTag | 触发受击硬直的标签 |
DismemberBone | FName | 触发肢解的骨骼名称 |
BreakThresholdMultiplier | float | Break 属性阈值乘数 |
KnockOutTag | FGameplayTag | 触发击倒效果的标签 |
HitDirection | EHitDirectionType | 方向计算方式:AttackerToVictim / RuntimeLocationTrace / VectorInAttackerSpace |
HitDirectionVector | FVector | 与 VectorInAttackerSpace 模式配合的本地空间方向向量 |
BulletPhysicsParam | FBulletPhysicsParam | 弹孔/物理子弹参数 |
| 属性 | 类型 | 说明 |
|---|
TargetTagQuery | FGameplayTagQuery | 目标必须满足的标签查询 |
MaxRadius | float | 最大作用半径(cm,0 = 无限制) |
MaxAngle | float | 相对攻击者朝向的最大角度(度) |
bCanHitSelf | bool | 是否可命中自身 |
bCanHitFriendly | bool | 是否可命中友方 |
bCanHitNeutral | bool | 是否可命中中立目标 |
ApplicationChance | float | 效果应用概率(0.0–1.0) |
| 属性 | 类型 | 说明 |
|---|
EffectClass | TSubclassOf<UGameplayEffect> | 要应用的 GE 类 |
SetByCallerOverrides | TMap<FGameplayTag, float> | 覆盖 GE 的 SetByCaller 幅度 |
DamageFXTypeOverride | FGameplayTag | 覆盖该效果的伤害特效类型 |
| 属性 | 类型 | 说明 |
|---|
TraceShape | ETraceShape | Sphere / Box / Capsule |
TraceRadius | float | 球形/胶囊形半径(cm) |
TraceHalfExtent | FVector | 盒形检测半扩展 |
TraceChannel | ECollisionChannel | 检测使用的碰撞通道 |
MaxHitCount | int32 | 单次检测最大命中目标数 |
| 属性 | 类型 | 说明 |
|---|
AttackDefinitionName | FName | 攻击定义唯一标识 |
AttackDescriptionTags | FGameplayTagContainer | 描述该攻击特性的标签 |
TargetEffectClass | TSubclassOf<UGameplayEffect> | 主要伤害 GE 类 |
SetByCallerMagnitudes | TMap<FGameplayTag, float> | 传给 GE 的 SetByCaller 数值 |
CollisionTraceInterfaceParam | FCollisionTraceInterfaceParam | AOE 范围检测参数 |
AttackDirectionType | EHitDirectionType | 攻击方向计算方式 |
BloodFXDirectionType | EHitDirectionType | 血迹特效方向计算方式 |
HitReactionTag | FGameplayTag | 触发受击动画反应 |
SpecialFightResultParam | FSpecialFightResultParam | 特殊战斗结果 |
GameplayCues | FGameplayTagContainer | 命中时触发的 Cue 集合 |
ForceFeedback | TSoftObjectPtr<UForceFeedbackEffect> | 手柄震动资产 |
PrimaryEffects | TArray<FSpellEffectSetting> | 主要效果 |
SecondaryEffects | TArray<FSpellEffectSetting> | 次要效果 |
BuffEffects | TArray<FSpellEffectSetting> | Buff 效果 |
CasterEffects | TArray<FSpellEffectSetting> | 施法者自身效果 |
AbilityTriggerSettings | TArray<FSpellEffectAbilitySetting> | 命中后触发的额外能力 |
TargetFilter | FFightTargetFilter | 目标过滤器 |
继承自 USpellProductAsset。
| 属性 | 类型 | 说明 |
|---|
SocketTraceName | FName | 骨骼 Socket 名称(武器 tip/base) |
SocketTraceInterval | float | 追踪帧间隔(秒,0 = 每帧) |
CollisionBindings | TArray<FSpellRingCollisionBinding> | 碰撞绑定列表,每项关联一对 Socket 与检测参数 |
bUseBoxTrace | bool | true = 盒型,false = 球形 |
BoxExtent | FVector | 盒型半扩展 |
SphereRadius | float | 球形半径(cm) |
| 属性 | 类型 | 说明 |
|---|
MaxHitCountPerTarget | int32 | 对同一目标的最大命中数(-1 无限) |
HitInterval | float | 对同一目标的重复命中间隔(秒) |
bCheckObstacle | bool | 是否检测障碍物 |
ObstacleChannel | ECollisionChannel | 障碍检测通道 |
| 属性 | 类型 | 说明 |
|---|
PeriodicEffects | TArray<FSpellEffectSetting> | 环存在期间按时间间隔应用的效果 |
PeriodicInterval | float | 应用间隔(秒) |
| 属性 | 类型 | 说明 |
|---|
HitStopDuration | float | 命中停顿(毫秒) |
HitStopAffectsSelf | bool | 是否影响施法者 |
HitStopAffectsTarget | bool | 是否影响目标 |
资产名:DA_Katana_LightAttack_01_Ring
[基础]
AttackDefinitionName: Katana_Light_01
AttackDescriptionTags: Attack.Melee.Light
[碰撞]
SocketTraceName: weapon_tip
SphereRadius: 15.0 cm
MaxHitCountPerTarget: 1
HitInterval: 0.5 s
[主效果]
TargetEffectClass: GE_MeleeDamage
SetByCallerMagnitudes:
- Damage.Physical: 80.0
- Damage.BreakDamage: 20.0
[特殊结果]
HitStopDuration: 80 ms
StaggerTag: Gameplay.Stagger.Light
[目标过滤]
bCanHitFriendly: false
ApplicationChance: 1.0
继承自 USpellProductAsset。
| 属性 | 类型 | 说明 |
|---|
CollisionTraceDefinitions | TArray<FCollisionTraceDefinition> | 飞行物主动碰撞检测定义(可多段) |
OneTimeTargetingPreset | TSoftObjectPtr<UTargetingPreset> | 命中时执行的一次性范围查询 |
bUseProjectileMovement | bool | 是否使用 ProjectileMovementComponent |
| 属性 | 类型 | 说明 |
|---|
Speed | float | 初速度(cm/s) |
MaxSpeed | float | 最大速度(cm/s,0 = 不限制) |
Lifetime | float | 最大存活时长(秒) |
GravityScale | float | 重力缩放(0 = 无重力) |
bHomingEnabled | bool | 是否启用追踪 |
HomingAcceleration | float | 追踪加速度(cm/s²) |
SpawnBackwardLength | float | 生成时向后偏移量(cm) |
LaunchDelay | float | 激活后延迟发射时间(秒) |
| 属性 | 类型 | 说明 |
|---|
FlightMesh | TSoftObjectPtr<UStaticMesh> | 显示网格 |
FlightVFX | TSoftObjectPtr<UNiagaraSystem> | 飞行轨迹粒子 |
StartGameplayCue | FGameplayTag | 生成时播放的 Cue |
HitGameplayCue | FGameplayTag | 命中时播放的 Cue |
bInvisible | bool | 不可见飞行物(仅碰撞,无视觉) |
| 属性 | 类型 | 说明 |
|---|
PenetrateSettings.MaxPenetrateCount | int32 | 最大穿透数(0 不穿透) |
PenetrateSettings.bPenetrateDestructible | bool | 是否穿透可破坏物 |
PenetrateSettings.PenetrateTagRequirement | FGameplayTagQuery | 穿透目标必须满足的标签 |
| 属性 | 类型 | 说明 |
|---|
SpellFlightFragments | TArray<FSpellFlightFragment> | 消亡时生成的子飞行物(散弹/碎片) |
SummonedActorClass | TSubclassOf<AActor> | 命中时召唤的 Actor(如陷阱) |
资产名:DA_Revolver_BasicShot_Flight
[运动]
Speed: 5000 cm/s
Lifetime: 3.0 s
GravityScale: 0.3
bHomingEnabled: false
[碰撞]
CollisionTraceDefinitions: [{Sphere, R=5cm, Damage}]
[伤害]
TargetEffectClass: GE_BulletDamage
SetByCallerMagnitudes:
- Damage.Physical: 120.0
- Damage.PoiseBreak: 15.0
[表现]
FlightMesh: SM_Bullet
StartGameplayCue: GC.Revolver.MuzzleFlash
HitGameplayCue: GC.Revolver.HitImpact
[穿透]
PenetrateSettings.MaxPenetrateCount: 0
| 类型 | 持续 | 适用 | 推荐目录 |
|---|
| Instant | 瞬时 | 伤害、一次性资源消耗 | Content/<root>/GE/Damage/ |
| Duration | 固定时长 | 护盾、临时增益 | Content/<root>/GE/Buff/ |
| Infinite | 永久(手动移除) | 被动 Buff、装备效果 | Content/<root>/GE/Passive/ |
GE 名称:GE_MeleeDamage
Duration Policy: Instant
[Modifiers]
Attribute: AttributeSetBase.MetaDelta
Modifier Op: Add
Magnitude: SetByCaller
SetByCaller Tag: Damage.Physical
SetByCaller 默认值: -100.0 (负值 = 减少属性)
[Tags]
Asset Tags: GameplayEffect.Damage.Physical
重要: 伤害 GE 的 Modifier 目标属性必须是 MetaDelta,而不是 Health 等最终属性。MetaDelta 是所有属性集的中间缓冲,在 PostGameplayEffectExecute 中被读取并应用到实际属性上,从而实现 Clamp 和额外逻辑。
GE 名称:GE_DefenseUp_10s
Duration Policy: Has Duration
Duration Magnitude: 10.0 s
Period: 0
[Modifiers]
Attribute: AS_Defense.DefenseRating
Modifier Op: Multiply
Magnitude: Scalable Float = 1.5 (+50% 防御)
[Tags]
Asset Tags: GameplayEffect.Buff.Defense
Applied Tags: OwnedTagsCategory.BuffState.DefenseUp
GE 名称:GE_Passive_StaminaRegen
Duration Policy: Infinite
Period: 1.0 s
bExecutePeriodicEffectOnApplication: true
[Modifiers]
Attribute: AS_Stamina.MetaDelta
Modifier Op: Add
Magnitude: SetByCaller
SetByCaller Tag: Stamina.RegenAmount
默认值: 5.0
GE 名称:GE_Cost_Stamina
Duration Policy: Instant
[Modifiers]
Attribute: AS_Stamina.MetaDelta
Modifier Op: Add
Magnitude: SetByCaller
SetByCaller Tag: Cost.Stamina
默认值: -20.0
由 UGameplayAbilityProject::CheckCost() 在激活前验证:Stamina 不足时技能无法激活,激活时通过 ApplyGameplayEffectToSelf 实际扣除。
| 标签 | 含义 | 典型值范围 |
|---|
Damage.Physical | 物理伤害量 | 50–500 |
Damage.BreakDamage | 破防伤害 | 10–100 |
Damage.PoiseBreak | 架势破坏 | 5–50 |
Damage.StaggerDamage | 硬直积累 | 10–80 |
Cost.Stamina | 体力消耗(负值) | 10–50 |
Cost.Ammo | 弹药消耗(由 CustomCost 处理) | 1–10 |
Heal.Health | 回复生命 | 20–200 |
Stamina.RegenAmount | 每次体力回复 | 3–10 |
UDataAsset,把一组要整体授予角色的 GAS 资源打包:
| 字段 | 类型 | 说明 |
|---|
GrantedGameplayAbilities | TArray<FAbilitySet_GameplayAbility> | 要授予的能力 |
GrantedGameplayEffects | TArray<FAbilitySet_GameplayEffect> | 要授予的被动 GE |
GrantedAttributes | TArray<FAbilitySet_AttributeSet> | 要添加的属性集 |
| 字段 | 类型 | 说明 |
|---|
AbilityClass | TSubclassOf<UGameplayAbility> | 能力类 |
AbilityLevel | int32 | 初始等级(默认 1) |
InputTag | FGameplayTag | 绑定的输入标签 |
资产名:DA_AbilitySet_Katana
[能力]
1. AbilityClass: BP_GA_Katana_LightAttack
AbilityLevel: 1
InputTag: InputTag.Weapon.Katana.LightAttack
2. AbilityClass: BP_GA_Katana_HeavyAttack
AbilityLevel: 1
InputTag: InputTag.Weapon.Katana.HeavyAttack
3. AbilityClass: BP_GA_Katana_Dodge
AbilityLevel: 1
InputTag: InputTag.Movement.Dodge
[被动]
1. EffectClass: GE_Passive_KatanaStanceBonus
Level: 1
[属性集]
1. AttributeSetClass: AS_Katana
| 字段 | 类型 | 说明 |
|---|
AbilityTag | FGameplayTag | 受规则约束的能力标签 |
AbilityTagsToBlock | FGameplayTagContainer | 激活时阻止这些标签的能力 |
AbilityTagsToCancel | FGameplayTagContainer | 激活时取消这些标签的能力 |
ActivationRequiredTags | FGameplayTagContainer | 激活时要求角色拥有 |
ActivationBlockedTags | FGameplayTagContainer | 角色拥有这些标签时阻止激活 |
资产名:DA_TagRelationship_PlayerCombat
[规则 1 - 大招互斥]
AbilityTag: AbilityTagCategory.Player.Ougi
AbilityTagsToBlock: AbilityTagCategory.Player.Attack, AbilityTagCategory.Player.Dodge
AbilityTagsToCancel: AbilityTagCategory.Player.Attack
ActivationRequiredTags: OwnedTagsCategory.State.InCombat
ActivationBlockedTags: OwnedTagsCategory.SpecState.Dead, OwnedTagsCategory.State.Stunned
[规则 2 - 闪避打断普攻]
AbilityTag: AbilityTagCategory.Player.Dodge
AbilityTagsToCancel: AbilityTagCategory.Player.LightAttack
ActivationBlockedTags: OwnedTagsCategory.State.Stunned, OwnedTagsCategory.SpecState.Dead
1. 创建 SpellAsset
路径:Content/<root>/Spell/<WeaponType>/
命名:DA_<WeaponType>_<AttackName>_Spell
→ 配置蒙太奇引用、Cue、飞行物引用
2. 创建 SpellRingAsset(近战)
路径:Content/<root>/SpellRing/<WeaponType>/
命名:DA_<WeaponType>_<AttackName>_Ring
→ 配置 Socket、碰撞半径、目标 GE 类
或 创建 SpellFlightAsset(远程)
路径:Content/<root>/SpellFlight/<WeaponType>/
命名:DA_<WeaponType>_<AttackName>_Flight
→ 配置速度、存活时长、命中 GE 类
3. 创建 GameplayEffect
路径:Content/<root>/GE/
命名:GE_<WeaponType>_<AttackName>_Damage
→ MetaDelta Modifier + SetByCaller 标签
4. 在 SpellRing/SpellFlight 中引用 GE
5. 在 Ability Blueprint 中引用 SpellAsset
6. 在 AbilitySet 中注册 Ability
| 资产类型 | 前缀 | 示例 |
|---|
| SpellAsset | DA_ | DA_Katana_LightAttack_Spell |
| SpellRingAsset | DA_ | DA_Katana_LightAttack_Ring |
| SpellFlightAsset | DA_ | DA_Revolver_BasicShot_Flight |
| GameplayEffect | GE_ | GE_KatanaDamage_Physical |
| AbilitySet | DA_ | DA_AbilitySet_Katana |
| TagRelationship | DA_ | DA_TagRelationship_PlayerCombat |
- 在 SpellProductAsset 的
SetByCallerMagnitudes 中定义基础伤害值 - GE 中声明对应 SetByCaller 标签但不设默认值(强制由调用者传入)
- 技能执行流通过
MakeOutgoingGameplayEffectSpec + AssignTagSetByCallerMagnitude 传递 - 数值调整只需修改 SpellProductAsset,无需重编译
- SpellAsset → SpellFlightAsset:必须
TSoftObjectPtr<> + 异步加载 - SpellRingAsset → GE 类:可硬引用(Ring 激活前 SpellAsset 已加载)
- Mesh / Niagara / Sound 资产:全部软引用,由 AssetManager 按需加载
这套数据资产体系最大的好处在于:程序员只维护类与字段,关卡/策划只维护 DataAsset 实例——能力数量增长不再需要程序员持续介入。