Гипотеза
Термины активируют / выполняют GameplayAbility (GA) и активны / выполняют GameplayAbility используются, когда способности влияют на каждыйдругие с GameplayTags .Поэтому при разработке эти термины важны для понимания взаимодействия GameplayAbility с помощью тегов .Как следствие:
- активированный / выполненный GA может блокировать / отменять другие GA (посредством добавления тегов)
- деактивированный GA может разблокировать другие GA (посредством удаления тегов)
- активный / выполняющий 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):
Для отмены / блокировки
UAbilitySystemComponent::ApplyAbilityBlockAndCancelTags
вызовов ... UAbilitySystemComponent::BlockAbilitiesWithTags()
соответственно UAbilitySystemComponent::UnBlockAbilitiesWithTags()
,который (наконец) вызывает для каждого из тегов в своем списке UAbilitySystemComponent::BlockedAbilityTags
... 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 мог уточнить вещи, исправить неполные выводы или оставить несколько слов о лучших практиках.