标签的组织与命名规范
标签好用,但没有命名规范的标签系统会变成新的混乱。这是我们项目在踩过坑后定的规范,供参考。
根命名空间划分
| 根 | 用途 | 例 |
|---|---|---|
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(区分玩家/敌人) |
三条硬规则
- 标签全英文、点分层级、首字母大写:
State.Stunned而不是state.stunned; - 叶子标签表达具体含义:
Cooldown.Skill.Fireball.3s——把"多久"写进叶子,配置里一眼可辨; - 子标签不重复父级含义:
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 并开启"未登记警告",禁止运行时拼字符串生成标签。
