生命的属性设置完成后,接下来就为主角的武器增加伤害。
武器的碰撞体是在发招式的时候才会启动,所以我们增加一个GameplayEffect,命名为GE_Melee_Damage。
当该效果实现的时候,会改变属性,所以属性这一栏是设为我们之前创建好的Health。
攻击想造成生命值减少的效果,这里并没有sub选项,就选择加上负数。
我们为该伤害效果进行标签的添加。
接下来,我们需要对碰撞信息进行处理,当武器碰撞体开启时候,发送一个事件,当击打动作完成后,收悉这个事件,并造成伤害。
在主角CPP文件中添加一下代码:
1 void AShinbi::beginOverlap(UPrimitiveComponent* overlapComp, AActor* actor, UPrimitiveComponent* otherComp, int index, bool sweep, FHitResult& hit)
2 {
3 FGameplayEventData payload;
4 payload.Target = actor;
5
6 FGameplayTag nameTag;
7 //为Event Tag设置Tag,通过FromExportString来设置,前提是在全局中,“NewOne.Skill.Attack.Melee”Tag是设置好了的。FGameplayTag对象只有导入和获得,并没有设置tag的方法。
8 nameTag.FromExportString("NewOne.Skill.Attack.Melee");
9 if (nameTag.GetTagName() == "NewOne.Skill.Attack.Melee") {
10 UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(this,nameTag,payload);
11 }
12 else {
13 FString name = nameTag.ToString();
14 GEngine->AddOnScreenDebugMessage(-1, 1, FColor::Red, name);
15 }
16
17
18 }
再去Melee技能里面进行如下设置:
添加伤害效果。
我们想看属性的变化结果,所以我们再AttributeSetBase类中重写父类的方法:
void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;
CPP文件中添加以下代码:
1 void UAttributeSetBase::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
2 {
3 if (Data.EvaluatedData.Attribute.GetUProperty() == FindFieldChecked<UProperty>(UAttributeSetBase::StaticClass(), GET_MEMBER_NAME_CHECKED(UAttributeSetBase, Health))) {
4 UE_LOG(LogTemp, Warning, TEXT("My Health Base is %f"), Health.GetBaseValue());
5 UE_LOG(LogTemp, Warning, TEXT("My Health Current is %f"), Health.GetCurrentValue());
6 }
7 }
不要忘记添加头文件:
#include "GameplayEffectExtension.h"
#include "GameplayEffect.h"
效果如下: