【问题标题】:How to determine why a GameplayAbility failed to activate如何确定 GameplayAbility 无法激活的原因
【发布时间】:2018-11-01 20:08:03
【问题描述】:

要获得有关GameplayAbility 未能激活原因的通知,可以将函数分配给代理UAbilitySystemComponent::AbilityFailedCallbacks()。它包含一个标签参数。这个参数可以用来判断UAbilitySystemComponent::TryActivateAbility()失败的原因,可以是:

  • 技能处于冷却时间
  • 费用付不起
  • 被其他技能阻挡
  • AbilitySystemComponent 缺少必需的 GameplayTags

但是,在测试时,委托中的标签是空的(或者委托甚至没有被触发)。

  1. 这个标签来自哪里?
  2. 如何设置该标签?

【问题讨论】:

    标签: unreal-engine4 unreal-gameplay-ability-system


    【解决方案1】:

    (1) 这些标签是UAbilitySystemGlobals 的一部分。它有以下标签:

    • 演员正在死去ActivateFailIsDeadTag
    • 冷却中ActivateFailCooldownTag
    • 费用不足ActivateFailCostTag
    • 被其他技能阻止ActivateFailTagsBlockedTag
    • 缺少必需的标签ActivateFailTagsMissingTag
    • 无效的网络设置ActivateFailNetworkingTag

    (2) 它们可以由(成本示例)设置

    1. DefaultGame.ini中设置标签,使用对应的FName(费用示例):

      [/Script/GameplayAbilities.AbilitySystemGlobals]
      ActivateFailCostName=My.Test.Tag
      
    2. 确保 GameplayTag 存在,例如在DefaultGameplayTags.ini

      +GameplayTagList=(Tag="My.Test.Tag",DevComment="")
      
    3. 通过调用 UAbilitySystemGlobals::Get().InitGlobalData() 来初始化这些标签,例如在 UGameInstance 子类的构造函数中。

    它是如何工作的

    费用示例:

    UGameplayAbility::CanActivateAbility() -> UGameplayAbility::CheckCost():

    • UAbilitySystemGlobals::ActivateFailCostTag 应用于可选输出参数 OptionalRelevantTags 如果无法负担成本
    • 这个标签用在UAbilitySystemComponent::NotifyAbilityFailed()里面
    • 解雇代表UAbilitySystemComponent::AbilityFailedCallbacks

    这与上面提到的其他情况(冷却、格挡……)类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 2021-12-02
      • 1970-01-01
      • 2015-05-11
      • 2011-12-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      相关资源
      最近更新 更多