目录
一,Defining Gameplay Tags
二,Using Defined Gameplay Tags
三,Advanced Topics
Setting Tag Editing Restrictions
Streamlining Tag Access in C++
Gameplay Tags 是用户定义的字符串,充当概念性的分层标签;可应用于项目中的对象,并对其求值以驱动你的Gameplay实现,类似于检查布尔值或标记;
可使用它们传达许多不同的概念,包括:
Character.Enemy.Zombie
;Movement.Mode.Swimming
;GameplayEvent.RequestReset
; Gameplay Tags 有任意数量的分层级别,以 .
字符分隔表示;如,标签 Event.Movement.Dash
有三个级别,其中 Event
是层级中最宽泛的标识符,而 Dash
是最具体的;
一,Defining Gameplay Tags
必须将Gameplay Tags添加到标签字典,以便虚幻引擎识别它们;可以使用以下某种方法添加(或删除)标签:
以上所有方法都在 项目设置(Project Settings) 的 GameplayTags 分段中下设置;
Adding Tags in Project Settings
定义新Gameplay Tags的最简单方式是,直接在 项目设置(Project Settings) 中添加;
.ini
文件中的所有Gameplay Tags,包括 Config/DefaultGameplayTags.ini
以及 Config/Tags
中的所有标签;Config/Tags
中创建新的源 .ini
文件来存储Gameplay Tags;为项目的各个方面创建单独的源文件,可能对于大型项目的组织和协作很有用;.ini
文件; 可重命名、删除、复制标签或向其添加新的子标签,方法是在列表中右键点击它并从快捷菜单中选择相应选项;若标签的来源不是 .ini
文件,则不能在 Gameplay Tag Manager 窗口中重命名或删除;
注,可以使用文本编辑器编辑标签 .ini
源文件,但必须重启编辑器才能加载更改;
Importing Tags from Data Table Assets
可使用行类型 GameplayTagTableRow
从 Data Table 资产导入Gameplay Tags;使用此方法可以:
.csv
或 .json
文件作为数据表导入来添加标签;要从数据表导入标签,请在 Project Settings 中执行以下操作:
Defining Tags with C++
可使用 NativeGameplayTags.h
中定义的宏,来通过C++定义Gameplay Tags:
UE_DECLARE_GAMEPLAY_TAG_EXTERN
:在 .h
文件中用于声明 .cpp
文件中定义的标签;UE_DEFINE_GAMEPLAY_TAG
:在 .cpp
文件中用于定义 .h
文件中声明的标签,不带提示文本注释;UE_DEFINE_GAMEPLAY_TAG_COMMENT
:在 .cpp
文件中用于定义 .h
文件中声明的标签,带有提示文本注释;UE_DEFINE_GAMEPLAY_TAG_STATIC
:在 .cpp
文件中用于定义仅对定义文件可用的标签;不同于其他 DEFINE
宏,这不应该与 DECLARE
宏调用配对;注,必须将 GameplayTags
模块添加到项目的 Build.cs
文件,才能在C++中访问Gameplay Tags功能;
//Example Implementation
// In .h file
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Walking);
// In .cpp file
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Walking, "Movement.Mode.Walking", "Default Character movement tag");
二,Using Defined Gameplay Tags
经过定义后,可将标签应用于对象并对标签求值,以在项目中驱动Gameplay;
Applying Tags to Objects
注,可直接使用Gameplay Tag(FGameplayTagFGameplayTagFGameplayTag)类型变量,但对象往往有多个标签,因此经常需要Gameplay Tag Containers;
Evaluating Tags with Conditional Functions
可基于对象的标签来驱动Gameplay实现;要对存储在对象的Gameplay Tag Containers中的标签求值,可以使用各种条件函数,如:
除了 HasAll
之类的 All
函数之外,使用空的Gameplay Tag Containers作为输入参数调用条件函数会返回false;这是因为,容器中的所有标签在源集内都没有缺失;
Gameplay Tag Queries
Gameplay Tag Query(FGameplayTagQuery)类型变量组合了条件函数,以更直白精简的方式建立复杂逻辑;
Gameplay Tag查询支持以下表达式:
此外,查询支持基于子表达式求值的以下根表达式:
三,Advanced Topics
Setting Tag Editing Restrictions
可限制用户对Gameplay Tag进行编辑(在任意层级级别);
要限制编辑,请在 Project Settings 的 Advanced Gameplay Tags > Advanced 下进行以下设置:
.ini
文件列表,这些标签与具有编辑权限的 所有者(Owners) 列表配对;如有用户(非列表中的所有者)尝试编辑受限制的标签,将弹出警告消息,要求用户确认自己已获得所有者的编辑授权;如用户无法确认,则不会做出编辑;
注,受限制的标签在创建之后,不能在编辑器中删除;要删除受限制的标签,必须直接编辑 .ini
文件;
Streamlining Tag Access in C++
可使用 IGameplayTagAssetInterface 改进Gameplay标签实现;该接口提供了以下优势:
实现该接口并重载 GetOwnedGameplayTags 函数,就能创建一种能够被蓝图访问的方法,来为 Gameplay Tag Container 填充与该对象关联的标签;在大部分情况下,这意味着将基类中的标签复制到新容器中,但实现可以从多个容器收集标签,或调用蓝图函数以访问蓝图声明的标签或对象需要的任意内容;