欢迎大家加入Unreal Engine C++ & Blueprint群一起交流:1143575617
为主角添加技能阻碍意思是当满足某一条件的时候技能不能触发,不满足某一条件时候可以触发。
此节的目的是当主角的血量是满的,就不可以加血了,阻碍加血技能的实施。
想到达到阻碍技能施展的功能是通过标签(Tag)来实现的。
我们想阻碍以下技能的施展:
打开该技能的蓝图。找到激活技能阻碍的标签。
添加一个标签,自定义就好:
也就是说,当技能发现了这个标签的时候,GA_HEAL技能就不会释放。
那如何动态增加和删除这个标签是现在要解决的问题,因为我们并不想它一直阻碍技能的释放。
在主角的头文件中加入以下代码:
public:
UFUNCTION(BlueprintCallable)
void AddBlockTag(FGameplayTag& TagToAdd);
UFUNCTION(BlueprintCallable)
void RemoveBlockTag(FGameplayTag& TagToRemove);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Status")
FGameplayTag fullHealthTag;
FGameplayTag类用于管理标签,新建一个它的对象叫fullHealthTag。然后添加两个方法,用于增加和删除这个fullHealthTag标签。
在主角的CPP文件中加入以下代码:
void AShinbi::AddBlockTag(FGameplayTag& TagToAdd)
{
AbilityComp->AddLooseGameplayTag(TagToAdd);
AbilityComp->SetTagMapCount(TagToAdd, 1);
}
void AShinbi::RemoveBlockTag(FGameplayTag& TagToRemove)
{
AbilityComp->RemoveLooseGameplayTag(TagToRemove);
}
通过AbilitySystemComponent的对象AbilityComp来设置添加于删除标签,并通过SetTagMapCount来为标签在栈中设置顺序。这里设置为1.
因为主角在一开始就是满血,所以这时候,也要阻碍技能释放,将AddBlockTag要放在BeginPlay之后,先运行一下。
打开主角蓝图,为fullHealthTag变量添加之前定义好的标签,做到统一。标签是全局的,所以定义好了之后,在哪里都可以看到并使用。
接下来,我们需要根据血量的满与不满与否来添加或删除标签,完成阻碍技能与解除阻碍技能之间的切换。
所以我们需要在AttributeSetBase类中进行修改。
在AttributeSetBase类的CPP文件中添加以下代码(与之前有重复的代码不用再次添加):
if (Data.EvaluatedData.Attribute.GetUProperty() == FindFieldChecked<UProperty>(UAttributeSetBase::StaticClass(),GET_MEMBER_NAME_CHECKED(UAttributeSetBase,Health))) {
Health.SetCurrentValue(FMath::Clamp(Health.GetCurrentValue(),0.0f,MaxHealth.GetCurrentValue()));
Health.SetBaseValue(FMath::Clamp(Health.GetBaseValue(),0.0f,MaxHealth.GetBaseValue()));
AShinbi* character = Cast<AShinbi>(GetOwningActor());
if (Health.GetCurrentValue() == MaxHealth.GetBaseValue()) {
character->AddBlockTag(character->fullHealthTag);
}
else
{
character->RemoveBlockTag(character->fullHealthTag);
}
onHealthChangeDelegate.Broadcast(Health.GetCurrentValue(), MaxHealth.GetCurrentValue());
}
当主角血量是满的时候,将主角中的标签添加到了阻碍技能的方法中,这一标签的添加激活了GA_HEAL招式中的BLOCK的标签,造成了技能的无法释放,反之删除后标签,栈中的标签被删除,与GA_HEAL招式中的标签对比失败,就可以释放该招式了。
成功运行,效果如下:
说到GA(GameplayAbility)与GE(GameplayEffect),有一点自己的理解想分享一下。
1.GA是招式,招式有一些属性与效果,就是GE,GA包含GE。
2.在GE中有些效果的是针对属性的,例如增加减血量,防御力等等。有些GE是限制了招式动作的,例如技能冷却,这些限制招式动作的最终观察效果是体现在动作蓝图中的。
3.所以在GE的Tags中需要做一下区分。
4.如果GE的效果是影响到了属性,而不是动作(技能)的,需要在GameplayEffectAssetTag中增加标签。
5.如果GE的效果是影响到了动作,而不是属性的,需要在GrantedTags中增加标签。
6.在招式中的对AbilityTags的设置,设置为这些GE的上一级标签即可。可以清晰的看到,Heal标签之下的都是GE效果,而Heal标签是招式,这个招式拥有这些GE效果。
水平有限,阐述的不到位或者不准确的地方欢迎批评指正。