文章目录
- 代码结构分析
-
- [1. `FGameplayTag::MatchesTag` 方法](#1.
FGameplayTag::MatchesTag
方法) - [2. `UBlueprintGameplayTagLibrary::MatchesTag` 静态函数](#2.
UBlueprintGameplayTagLibrary::MatchesTag
静态函数)
- [1. `FGameplayTag::MatchesTag` 方法](#1.
- 具体例子说明
-
- [例子1:层级匹配(bExactMatch = false)](#例子1:层级匹配(bExactMatch = false))
- [例子2:精确匹配(bExactMatch = true)](#例子2:精确匹配(bExactMatch = true))
- 例子3:蓝图使用
- 实际应用场景
-
- [1. 伤害系统](#1. 伤害系统)
- [2. 状态检测](#2. 状态检测)
- [3. 技能系统](#3. 技能系统)
- 错误处理
- 总结
代码结构分析
1. FGameplayTag::MatchesTag
方法
这是核心的标签匹配逻辑,用于检查一个标签是否与另一个标签匹配(支持层级关系)。
2. UBlueprintGameplayTagLibrary::MatchesTag
静态函数
这是暴露给蓝图的辅助函数,提供了精确匹配和层级匹配两种模式。
具体例子说明
假设我们有以下的 GameplayTag 层级结构:
cpp
Damage
├── Damage.Fire
│ ├── Damage.Fire.Small
│ └── Damage.Fire.Large
└── Damage.Ice
├── Damage.Ice.Small
└── Damage.Ice.Large
例子1:层级匹配(bExactMatch = false)
cpp
FGameplayTag FireDamageTag = FGameplayTag::RequestGameplayTag("Damage.Fire.Small");
FGameplayTag FireTag = FGameplayTag::RequestGameplayTag("Damage.Fire");
FGameplayTag DamageTag = FGameplayTag::RequestGameplayTag("Damage");
// 这些调用都会返回 true
bool result1 = FireDamageTag.MatchesTag(FireTag); // true - 子标签匹配父标签
bool result2 = FireDamageTag.MatchesTag(DamageTag); // true - 孙子标签匹配祖父标签
bool result3 = FireDamageTag.MatchesTag(FireDamageTag); // true - 自身匹配自身
匹配原理:
Damage.Fire.Small
标签的节点会包含一个容器,其中有:Damage
、Damage.Fire
、Damage.Fire.Small
- 检查时实际上是查看
TagToCheck
是否在这个容器中
例子2:精确匹配(bExactMatch = true)
cpp
FGameplayTag FireDamageTag = FGameplayTag::RequestGameplayTag("Damage.Fire.Small");
FGameplayTag FireTag = FGameplayTag::RequestGameplayTag("Damage.Fire");
// 精确匹配要求完全相同的标签
bool result1 = FireDamageTag.MatchesTagExact(FireTag); // false - 不是完全相同的标签
bool result2 = FireDamageTag.MatchesTagExact(FireDamageTag); // true - 完全相同的标签
例子3:蓝图使用
在蓝图中调用:
cpp
// 层级匹配 - 返回 true
UBlueprintGameplayTagLibrary::MatchesTag(
FGameplayTag::RequestGameplayTag("Damage.Fire.Small"),
FGameplayTag::RequestGameplayTag("Damage.Fire"),
false
);
// 精确匹配 - 返回 false
UBlueprintGameplayTagLibrary::MatchesTag(
FGameplayTag::RequestGameplayTag("Damage.Fire.Small"),
FGameplayTag::RequestGameplayTag("Damage.Fire"),
true
);
实际应用场景
1. 伤害系统
cpp
// 检查伤害类型是否属于火焰伤害
if (DamageTypeTag.MatchesTag(FGameplayTag::RequestGameplayTag("Damage.Fire"))) {
// 应用火焰伤害特效
ApplyFireEffects();
}
2. 状态检测
cpp
// 检查玩家是否处于任何负面状态
if (PlayerStateTag.MatchesTag(FGameplayTag::RequestGameplayTag("State.Debuff"))) {
// 显示负面状态UI
ShowDebuffIndicator();
}
3. 技能系统
cpp
// 检查技能是否属于近战类别
if (SkillTag.MatchesTag(FGameplayTag::RequestGameplayTag("Skill.Melee"))) {
// 应用近战技能逻辑
ExecuteMeleeSkill();
}
错误处理
代码中的 ensureMsgf 确保了标签必须被正确注册:
cpp
// 如果使用未注册的标签,会触发警告
FGameplayTag InvalidTag = FGameplayTag::FromString("NonExistent.Tag");
bool result = InvalidTag.MatchesTag(SomeOtherTag); // 会触发ensure消息
总结
这段代码提供了灵活的标签匹配机制:
- 层级匹配:用于检查标签之间的父子关系
- 精确匹配:用于检查完全相同的标签
- 性能优化:通过标签节点和容器缓存提高匹配效率
- 安全校验:确保只使用已注册的标签
这种设计使得 GameplayTag 系统非常适合于游戏中的状态管理、伤害类型分类、技能系统等需要灵活层级关系的场景。