游戏标签(GameplayTags)
GameplayTags是一系列树状的字符串,通过GameplayTagManager进行注册,这种名字在描述一个对象的状态或是分类时非常有用。
例如,我们可以在一个角色的眩晕过程中赋予他“State.Debuff.Control.Stun”标签,这样我们就可以通过检查角色身上标签的状态,替换掉之前用枚举或者布尔值处理的东西。
(UE_Note)在向角色添加Tag时,一般是添加到它的ASC上,UAbilitySystemComponent已经实现了IGameplayTagAssetInterface接口。如果你想给让其他对象持有标签,只需要让其也实现这个接口即可。
标签的应用
标签在GAS框架中被相当广泛的使用,其中比较有代表性的是游戏技能(GA)和游戏效果(GE)的默认实现中对标签的相关操作,这里以GA举例。
AbilityTags:该技能的标签。
CancelAbiliiesWithTag:当这个技能执行时,打断具有这些标签的技能。
BlockAbilitiesWithTag:当这个技能执行期间,阻止具有这些标签的技能激活。
ActivationOwnedTags:这个技能执行期间赋予技能施放者的标签。
ActivationRequiredTags:当Owner拥有全部这些标签时,技能才能施放。
ActivationBlockedTags:当Owner拥有这些标签之一时,技能无法施放。
SourceRequiredTags:当Avatar拥有全部这些标签时,技能才能施放。
SourceBlockedTags:当Avatar拥有这些标签之一时,技能无法施放。
TargetRequiredTags:当目标拥有全部这些标签时,技能才能施放。
TargetBlockedTags:当目标拥有这些标签之一时,技能无法施放。
游戏中的其他类似的逻辑,如目标眩晕时,追加一段攻击;自身狂暴时,攻击范围增加等,均推荐使用标签来做条件进行判断。
(UE_Note)ASC提供了Tag添加和删除的委托,可以通过ASC监听标签的添加等变化:
AbilitySystemComponent->RegisterGameplayTagEvent(FGameplayTag::RequestGameplayTag(FName( "State.Debuff.Control" )), EGameplayTagEventType::NewOrRemoved).AddUObject( this , &MyActor::OnControlled); |
委托的回调方法带有相关的GameTag以及最新的TagCount。
virtual void OnControlled( const FGameplayTag Tag, int32 Count); |