Gameplay 标签深入
Gameplay Tags In Depth
Gameplay 标签 (Gameplay Tags) 是用 . 分层的用户定义标签,必须登记到标签字典(项目设置 .ini、数据表或 C++ 原生标签宏)。对象用 FGameplayTagContainer 持有多个标签并以 HasTag/HasAny/HasAll 判断(注意空集合语义),复杂条件用 FGameplayTagQuery 的叶/根表达式组合并配置在资产里。它是 GAS、AI 和各类玩法状态的通用词汇表;大项目可限制标签编辑权限,并用 IGameplayTagAssetInterface 免 Cast 取标签。
标签是什么
官方:Gameplay 标签 (Gameplay Tags) 是用户定义的字符串,作为概念性的层级标签;可以像检查布尔或标志位一样用它驱动玩法。用 . 分隔任意层级,如 Event.Movement.Dash,Event 最宽泛、Dash 最具体。可表达属性(Character.Enemy.Zombie)、状态/能力(Movement.Mode.Swimming)、事件(GameplayEvent.RequestReset)。(Gameplay Tags)
与 bool/枚举相比,层级带来的核心能力是「父标签匹配子标签」:问「是否有 Character.Enemy」时,持有 Character.Enemy.Zombie 的对象也算(层级匹配语义为通识,官方页只描述了层级结构与容器函数)。在 Gameplay 能力系统 中,能力的阻挡/取消/激活条件以及 GE 授予的状态都是标签。
定义标签的三种方式
| 方式 | 细节 | 适合 |
|---|---|---|
| 项目设置 | 开 Import Tags From Config,读 Config/DefaultGameplayTags.ini 与 Config/Tags/*.ini;用 Gameplay Tag Manager 增删改;可拆多个源 .ini 方便协作;手改 .ini 需重启编辑器 | 设计师日常维护 |
| 数据表 | 行类型 GameplayTagTableRow,可从 csv/json 导入,编辑器运行中可改 | 批量导入 |
| C++ 原生标签 | NativeGameplayTags.h:UE_DECLARE_GAMEPLAY_TAG_EXTERN(.h)+ UE_DEFINE_GAMEPLAY_TAG / _COMMENT(.cpp);UE_DEFINE_GAMEPLAY_TAG_STATIC 仅本文件可见;需在 Build.cs 加 GameplayTags 模块 | 代码中引用的标签(编译期安全) |
(Gameplay Tags)官方推荐参考 Lyra 的 LyraGameplayTags.h/.cpp。Build.cs 依赖见 模块、插件与构建系统。
// .h
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Walking);
// .cpp
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Walking, "Movement.Mode.Walking", "Default Character movement tag");
容器 (FGameplayTagContainer)
对象通常有多个标签,所以一般用容器而不是单个 FGameplayTag:AddTag、RemoveTag、AppendTags;条件函数 HasTag、HasAny、HasAll。空容器作参数时返回 false,HasAll 这类 All 函数除外(空集合中没有“缺失”的标签,所以为真)。(Gameplay Tags)
用集合语言表示(记对象标签集为 ,查询集为 ):,——所以 时 HasAny 为假、HasAll 为真(集合表述为对官方规则的形式化)。
查询 (FGameplayTagQuery)
把多个条件组合成一个可配置的表达式:
- 叶表达式:Any Tags Match、All Tags Match(查询为空返回 true)、No Tags Match(查询为空返回 true);
- 根表达式:Any / All / No Expressions Match(对子表达式求值;无子表达式时 All 与 No 返回 true)。(Gameplay Tags)
例如「是敌人 且 (眩晕 或 冻结) 且 不是 Boss」可以写成一个 All Expressions Match,里面嵌套三个子表达式——在资产里配置而不是在代码里写一串 if。
flowchart TD Q[All Expressions Match] --> A[All Tags Match: Character.Enemy] Q --> B[Any Tags Match: State.Stunned, State.Frozen] Q --> C[No Tags Match: Character.Boss]
工程化
- 编辑权限:Advanced Gameplay Tags 中设置 Restricted Config Files 与拥有者;非拥有者修改会弹警告;受限标签不能在编辑器删除,只能改 .ini。
- IGameplayTagAssetInterface:实现
GetOwnedGameplayTags,不用 Cast 就能取任意对象的标签,并提供蓝图可调用方法(LyraALyraTaggedActor)。(Gameplay Tags)
坑
- 标签名是数据,重命名会让引用它的资产与代码失效;代码引用的标签建议用原生标签宏声明(通识)。
- 别把标签当作带数值的状态(层数、计时),那应交给 GAS 的属性或 GE 堆叠(通识,见 Gameplay 能力系统)。
出处
- Gameplay Tags UE 5.8 文档