Нереальный ГАЗ: когда GameplayAbility считается выполненным - PullRequest
0 голосов
/ 14 октября 2018

В Unreal GameplayAbilitySystem, например, Отмена способностей с тегом задокументирована с

Отменяет любые уже выполняющиеся Способности [..]

и в исходном коде написано (в GameplayAbility.h)

Способности с этими тегами отменяются при выполнении этой способности

Чтобы знать во время разработки, какие способности будут затронуты при установке этих тегов, необходимо быть уверенным в следующем:

Когда GameplayAbility считается выполненным и когда каквыполняется?


В соответствии с документацией, связанной выше, GA выполняется с CallActivateAbility().Однако активация может быть прервана, если условия перезарядки / затрат не выполнены (например, «недостаточно маны») в CommitAbility().

CommitAbility() проверяет, может ли способность быть активирована через CommitCheck() (перезарядка)/ затрат) и только в случае успеха вызывается CommitExecute() (что относится к времени восстановления и затратам).

До вызова CommitAbility(), PreActivate(), что

1) устанавливает (для экземпляров GameplayAbabilities):

// ...
bIsActive = true;
bIsBlockingOtherAbilities = true;
bIsCancelable = true;
// ...

2) и блокирует / отменяет другие GameplayAbabilities с указанными тегами, используя UAbilitySystemComponent::ApplyAbilityBlockAndCancelTags


Подробные вопросы, которые могут помочь ответить на вопрос выше:

  1. выполняет GameplayAbility так же, как активизирует GameplayAbility или эти термины имеют разные значения?(оба термина используются в документации и имена / переменные функций)
  2. Всегда ли GameplayAbility считается выполненным при вызове PreActivate()?(поскольку эта функция блокирует / отменяет другие способности через ApplyAbilityBlockAndCancelTags и, следовательно, согласно второй приведенной выше цитате считается выполнением)

    Это означает, что GameplayAbility считается выполнением

    • независимо от результата CommitAbility()?
    • , пока выполняется UGameplayAbility::ActivateAbility()?
  3. Как GameplayAbilityопределяется как выполняющийся?
    • Достаточно ли проверить UGameplayAbility::bIsActive == true (для экземпляров GameplayAbabilities)?
    • Или выполняются способности, зарегистрированные где-то в UGameplayAbilitySystem?
    • ...

1 Ответ

0 голосов
/ 14 октября 2018

Гипотеза

Термины активируют / выполняют GameplayAbility (GA) и активны / выполняют GameplayAbility используются, когда способности влияют на каждыйдругие с GameplayTags .Поэтому при разработке эти термины важны для понимания взаимодействия GameplayAbility с помощью тегов .Как следствие:

  1. активированный / выполненный GA может блокировать / отменять другие GA (посредством добавления тегов)
  2. деактивированный GA может разблокировать другие GA (посредством удаления тегов)
  3. активный / выполняющий GA должен иметь возможность получать блокировку / отмену через изменения тегов, когда выполняется другой GA

Заключение

Чтобы наилучшим образом использовать теги для управлениявзаимодействие между GameplayAbabilities, помните следующее: GameplayAbility имеет значение

  • активизировано / выполнено при вызове CallActivateAbility() (в чертеже Event ActivateAbility и Event ActivateAbilityFromEvent запускаются этой функцией через ActivateAbility()).
  • деактивируется при вызове EndAbility() (который также вызывается CancelAbility()).
  • active / выполнение между вызовами от UAbilitySystemComponent::TryActivateAbility() до EndAbility().

    В случае, если EndAbility() не вызывается, GAвыполняется за время жизни ActivateAbility() (опять же, в чертежах это почти аналогично времени жизни реализуемогоd Event ActivateAbility и Event ActivateAbilityFromEvent).

Пояснение

Когда GA считается активированным / выполненным и деактивированным (1, 2)

UAbilitySystemComponent::ApplyAbilityBlockAndCancelTags() вызывает отмену или блокировку / разблокировку GA.Поэтому вызовы к нему определяют момент активации / выполнения и деактивации.

  • Блокировка / отмена вызывается PreActivate(), который вызывается CallActivateAbility()
  • Unblock вызывается EndAbility() (который также вызывается CancelAbility())

Когда GA считается активным / исполняющим (3)

Когда он может быть заблокирован

GA может быть заблокирован только во время его активации.CanActivateAbility() проверяет (через DoesAbilitySatisfyTagRequirements()) список заблокированных тегов GameplayAbilitySystemComponent (ASC) (UAbilitySystemComponent::BlockedAbilityTags).Если там присутствует один из тегов, активация способности отменяется.

и когда она может быть отменена (не учитывается тот факт, что GA разрешает это)

GA может быть отменен другимиGA через тэги, если он зарегистрирован в GameplayAbilitySystemComponent (ASC) в UAbilitySystemComponent::ActivatableAbilities и до тех пор, пока хранится GA spec , возвращает FGameplayAbilitySpec::IsActive() = true.

  • Добавляетсяв этот контейнер через UAbilitySystemComponent::GiveAbility() и удаленный через UAbilitySystemComponent::ClearAbility()
  • FGameplayAbilitySpec::IsActive() вернет true, пока FGameplayAbilitySpec::ActiveCount > 0.Эта переменная будет увеличиваться при активации GA (в UAbilitySystemComponent::InternalTryActivateAbility()) и уменьшаться при деактивации GA (в UAbilitySystemComponent::NotifyAbilityEnded).

UASC::InternalTryActivateAbility() вызывается в UASC::TryActivateAbility() и UASC::NotifyAbilityEnded() вызываетсяв EndAbility().Эти два условия являются причиной того, что я рассматривал GA только как активный / выполняющийся между этими вызовами, а не между UASC::GiveAbility() и UASC::ClearAbility().

Как эти теги срабатывают

Когда GAактивируется / деактивируется, запускает функции в GameplayAbilitySystemComponent (ASC):

Для отмены / блокировки
  1. UAbilitySystemComponent::ApplyAbilityBlockAndCancelTags вызовов ...
  2. UAbilitySystemComponent::BlockAbilitiesWithTags() соответственно UAbilitySystemComponent::UnBlockAbilitiesWithTags(),который (наконец) вызывает для каждого из тегов в своем списке UAbilitySystemComponent::BlockedAbilityTags ...
  3. FGameplayTagCountContainer::UpdateTagMap_Internal(), который добавляет соответственно удаляет тег
для отмены
  • UAbilitySystemComponent::CancelAbilities(), который сравнивает теги, предоставляемые отменяющим GA, с тегами всех активируемых способностей, хранящихся в Компоненте Системы Способностей (в UAbilitySystemComponent::ActivatableAbilities()), которые в настоящее время активны.
  • Если есть совпадение, всеэти экземпляры GA отменяются.

Как насчет CommitExecute()

Эта функция не зависит от взаимодействия с другими GA через теги, поэтому часть Execute имя может вводить в заблуждение.

CommitExecute() вызывается только в том случае, если затраты ГА могут быть предоставлены и если ГА не находится на перезарядке (все это происходит в CommitAbility()).Но блокировка / отмена других GA уже случались ранее, и разблокировка GA также происходит независимо от этой функции.

Так что насчет CommitAbility()

Для , выполняющего GA , не имеет значения, если это вызывается.

Если CommitAbility() не удается, GA может быть деактивирован сразу после активации, в зависимости от реализации GA .Таким образом, он может влиять на продолжительность выполнения, что, однако, не важно для процесса проектирования взаимодействия GA с помощью тегов.

Как насчет SetShouldBlockOtherAbilities()

Эта открытая функция может быть вызвана дляРазблокировать / блокировать другие GA с помощью тегов из произвольного места в C ++ / blueprints.

Например, его можно вызывать несколько раз за время существования ActivateAbility(), чтобы разблокировать / блокировать другие GA.Кроме того, он не может отменить другие GA.Не ясно, каковы лучшие практики для использования или избегания этой функции.Кажется, это снижает прозрачность взаимодействия GA с помощью тегов.


(если родительское пространство имен отсутствует, все функции являются членами UGameplayAbility)

Другие способы блокировки / разблокировкиGA (например, через inputID) или отмены GA (например, через UAbilitySystemComponent::CancelAllAbilities()) не рассматриваются.Речь идет о взаимодействии GA через теги.Еще одна тема - также запуск GA с помощью тегов (или GameplayEvents).

Было бы неплохо, если бы разработчик Unreal GAS мог уточнить вещи, исправить неполные выводы или оставить несколько слов о лучших практиках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...