标签的组织与命名规范

标签好用,但没有命名规范的标签系统会变成新的混乱。这是我们项目在踩过坑后定的规范,供参考。

根命名空间划分

根 用途 例
State.* 对象当前状态 State.Stunned、State.Dead
Cooldown.* 冷却槽位 Cooldown.Skill.Fireball
Cost.* 花费类型 Cost.Mana、Cost.Charge
DamageType.* 伤害类型 DamageType.Fire、DamageType.Physical
Effect.* 效果分类(正面/负面) Effect.Buff、Effect.Debuff
Ability.* 技能类别(用于互斥/分类) Ability.Spell、Ability.Attack
Caster.* 施法者元信息 Caster.Player(区分玩家/敌人)

三条硬规则

  1. 标签全英文、点分层级、首字母大写:State.Stunned 而不是 state.stunned;
  2. 叶子标签表达具体含义:Cooldown.Skill.Fireball.3s——把"多久"写进叶子,配置里一眼可辨;
  3. 子标签不重复父级含义:Effect.Buff.Shield 而不是 Effect.Buff.BuffShield。

在 ini 里登记(防拼写错)

把标签写进 DefaultGameplayTags.ini:

[/Script/GameplayTags.GameplayTagsSettings]
FastReplication=true
+GameplayTagList=(Tag="State.Stunned", DevComment="眩晕,阻挡所有技能释放")
+GameplayTagList=(Tag="State.Burning", DevComment="燃烧,与点燃互斥")

登记的标签在编辑器补全列表里出现,写错的标签(如 State.Stunded)在蓝图里一眼可见。GAS 有"未登记标签"警告,开启它。

动态创建标签?(别)

RequestGameplayTag("State.Stunned") 本身是常量查找;不要"运行时拼字符串生成标签"(如 FString::Printf),那样既慢又绕开了编辑器校验。所有标签应在 ini 登记或至少在蓝图的标签列表里选过一次。

团队协作:标签的"谁拥有"问题

建议把标签 ini 文件和项目文档放在一起,新增标签 = 提交记录里写明含义。我们项目的做法:所有 GameplayTag 新增走一张"标签登记表",有含义、有归属人。没这条规范,三个月后没人记得 State.Weird 是什么。

本章小结

  • 根命名空间划分:State / Cooldown / Cost / DamageType / Effect / Ability / Caster。
  • 三条硬规则:全英文点分、叶子表达具体含义、子不重复父。
  • 标签登记进 ini 并开启"未登记警告",禁止运行时拼字符串生成标签。