Unreal Engine 4 —— GAS系统学习 (十三) 为主角添加技能阻碍

欢迎大家加入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效果。

 水平有限,阐述的不到位或者不准确的地方欢迎批评指正。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值