【问题标题】:How to determine why a GameplayAbility failed to activate如何确定 GameplayAbility 无法激活的原因
【发布时间】:2018-11-01 20:08:03
【问题描述】:
要获得有关GameplayAbility 未能激活原因的通知,可以将函数分配给代理UAbilitySystemComponent::AbilityFailedCallbacks()。它包含一个标签参数。这个参数可以用来判断UAbilitySystemComponent::TryActivateAbility()失败的原因,可以是:
- 技能处于冷却时间
-
费用付不起
-
被其他技能阻挡
- AbilitySystemComponent 缺少必需的 GameplayTags
但是,在测试时,委托中的标签是空的(或者委托甚至没有被触发)。
- 这个标签来自哪里?
- 如何设置该标签?
【问题讨论】:
标签:
unreal-engine4
unreal-gameplay-ability-system
【解决方案1】:
(1) 这些标签是UAbilitySystemGlobals 的一部分。它有以下标签:
- 演员正在死去
ActivateFailIsDeadTag
- 冷却中
ActivateFailCooldownTag
- 费用不足
ActivateFailCostTag
- 被其他技能阻止
ActivateFailTagsBlockedTag
- 缺少必需的标签
ActivateFailTagsMissingTag
- 无效的网络设置
ActivateFailNetworkingTag
(2) 它们可以由(成本示例)设置
-
在DefaultGame.ini中设置标签,使用对应的FName(费用示例):
[/Script/GameplayAbilities.AbilitySystemGlobals]
ActivateFailCostName=My.Test.Tag
-
确保 GameplayTag 存在,例如在DefaultGameplayTags.ini
+GameplayTagList=(Tag="My.Test.Tag",DevComment="")
通过调用 UAbilitySystemGlobals::Get().InitGlobalData() 来初始化这些标签,例如在 UGameInstance 子类的构造函数中。
它是如何工作的
费用示例:
在UGameplayAbility::CanActivateAbility() -> UGameplayAbility::CheckCost():
-
UAbilitySystemGlobals::ActivateFailCostTag 应用于可选输出参数 OptionalRelevantTags 如果无法负担成本
- 这个标签用在
UAbilitySystemComponent::NotifyAbilityFailed()里面
- 解雇代表
UAbilitySystemComponent::AbilityFailedCallbacks
这与上面提到的其他情况(冷却、格挡……)类似。