翻译自Udemy的视频课程introduction-to-unreal-engine-4-ability-system
Health Regen Ability生命回复技
1、设置UI显示自身的生命值
说明下本节要达到的效果:玩家有自身的UI,用于显示自身的生命值变化 (UI的设计非关注重点)
2、设置Mana(魔法值)和Strength(力量值)
在BaseAttributeSet里与添加Health的方式一致
3、创建HealRegen(生命回复)这个GamePlayAbility,
添加GE_HealthRegen_CoolDown(添加冷却信息,同MeleeAttack),GE_HealthRegen_Cost(添加消耗信息),GE_HealthRegen_Reply(添加生命回复信息)
4、添加HealthFull这个Tag来中断HealthRegen这个技能的执行,需要在C++中进行
01、BaseCharacter中添加
UFUNCTION(BlueprintCallable, Category = BaseChracter)
void AddGameplyTag(FGameplayTag TagToAdd);
UFUNCTION(BlueprintCallable, Category = BaseChracter)
void RemoveGameplyTag(FGameplayTag TagToRemove);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = BaseCharacter)
FGameplayTag FullHealthTag;
// Called when the game starts or when spawned
void ABaseCharacter::BeginPlay()
{
Super::BeginPlay();
//在BeginPlay中动态的绑定委托
AttributeSetComp->OnHealthChange.AddDynamic(this, &ABaseCharacter::OnHealthChange);
AttributeSetComp->OnManaChange.AddDynamic(this, &ABaseCharacter::OnManaChange);
AttributeSetComp->OnStrengthChange.AddDynamic(this, &ABaseCharacter::OnStrengthChange);
AutoDetermineTeamIDByControllerType();
//一开始添加FullHealthTag
AddGameplyTag(FullHealthTag);
}void ABaseCharacter::AddGameplyTag(FGameplayTag TagToAdd)
{
GetAbilitySystemComponent()->AddLooseGameplayTag(TagToAdd);
//必须指定要添加的Tag数量
GetAbilitySystemComponent()->SetTagMapCount(TagToAdd, 1);
}void ABaseCharacter::RemoveGameplyTag(FGameplayTag TagToRemove)
{
GetAbilitySystemComponent()->RemoveLooseGameplayTag(TagToRemove);
}
02、在BaseAttribute的PostGameplayEffectExecute中对应生命值发生修改的地方添加如下代码,主要是进行判断当前生命值修改后是FullHealth?添加Tag:移除Tag
OnHealthChange.Broadcast(Health.GetCurrentValue(), MaxHealth.GetCurrentValue());
ABaseCharacter* CharacterOwner = Cast<ABaseCharacter>(GetOwningActor());
if (Health.GetCurrentValue() == MaxHealth.GetCurrentValue())
{
if (CharacterOwner) {
CharacterOwner->AddGameplyTag(CharacterOwner->FullHealthTag);
}
}
else {
if (CharacterOwner) {
CharacterOwner->RemoveGameplyTag(CharacterOwner->FullHealthTag);
}
}
03、 编译,并指定FullHealthTag
04、指定GA_HealthRegen中的BlockAction标签对应值
5、使用GameplayCue(GameplayCue用于特效与声音的播放)
01、创建蓝图GameplayCue_Static,命名为GAC_HealthRegen,里面的逻辑就是当Cue被调用的时候,产生特效
02、需要在ClassDefaults中指定Cue的标签,这个适当其他的GameEffect发生的时候,可以通过指明当前Cue的标签,从而达到调用的目的
03、在GE_HealthRegen_Reply中指明Cue的标签
生命回复的时候消耗法力,播放特效
翻译这套教程关注的重点在于GAS的使用,故省略UI、特效设计这部分的介绍(如果需要我把这部分内容放上去的话请在下方留言),另外关于Delegate的介绍,可以参见UE4 Scripting with C++_04这篇文章
下一节介绍冲刺技DashAbility