1.
打开CharacterBase.h,
添加属性接口,用于属性修改时调用
virtual void HandleHealth(AMMOARPGCharacterBase* InstigatorPawn,AActor* DamageCauser, const struct FGameplayTagContainer& InTags,float InNewValue);
virtual void HandleMana(const struct FGameplayTagContainer& InTags, float InNewValue);
virtual void HandleExp(const struct FGameplayTagContainer& InTags, float InNewValue);
进行实现,调用FightComponent中的接口,最后的具体实现都在FightComponent中
void AMMOARPGCharacterBase::HandleHealth(AMMOARPGCharacterBase* InstigatorPawn, AActor* DamageCauser, const struct FGameplayTagContainer& InTags, float InNewValue)
{
if (FightComponent)
{
FightComponent->HandleHealth(InstigatorPawn, DamageCauser, InTags, InNewValue);
}
}
void AMMOARPGCharacterBase::HandleMana(const struct FGameplayTagContainer& InTags, float InNewValue)
{
if (FightComponent)
{
FightComponent->HandleMana(InTags, InNewValue);
}
}
void AMMOARPGCharacterBase::HandleExp(const struct FGameplayTagContainer& InTags, float InNewValue)
{
if (FightComponent)
{
FightComponent->HandleExp(InTags, InNewValue);
}
}
在CharacterBase添加一个接口,用于应用经验奖励效果
virtual void RewardEffect(float InNewLevel, TSubclassOf<UGameplayEffect> InNewReward, TFunction<void()> InFun);
进行实现
void AMMOARPGCharacterBase::RewardEffect(float InNewLevel, TSubclassOf<UGameplayEffect> InNewReward, TFunction<void()> InFun)
{
if (FightComponent)
{
FightComponent->RewardEffect(InNewLevel, InNewReward, InFun);
}
}
在CharacterBase中添加升级接口
public:
bool IsUpdateLevel();
virtual void UpdateLevel(float InLevel);
进行实现
bool AMMOARPGCharacterBase::IsUpdateLevel()
{
if (AttributeSet)
{
//如果当前等级的经验值已经大于当前等级的最大经验值,说明可以升级了
return AttributeSet->GetEmpiricalValue() >= AttributeSet->GetMaxEmpiricalValue();
}
return false;
}
void AMMOARPGCharacterBase::UpdateLevel(float InLevel)
{
if (FightComponent)
{
FightComponent->UpdateLevel(InLevel, UpgradeRewardEffect);
}
}
2.
打开MMOARPGAttributeSet.cpp,在PostGameplayEffectExecute函数中
else if (Data.EvaluatedData.Attribute == GetDamageAttribute())
{
const float TmpDamage = GetDamage();
SetDamage(0.f);
const float OldHealth = GetHealth();
SetHealth(FMath::Clamp(OldHealth - TmpDamage, 0.f, GetMaxHealth()));//扣血
const float OldHealth11 = GetHealth();
if (Target)
{
AMMOARPGCharacterBase* SourceCharacter = NULL;
AActor* SourceActor = NULL;
GetSourceCharacterAndSourceActor(SourceActor, SourceCharacter);
Target->HandleDamage(TmpDamage, SourceTagContainer, SourceCharacter, SourceActor);
//受到伤害时,对生命值的操作
Target->HandleHealth(SourceCharacter, SourceActor, SourceTagContainer, -TmpDamage);
}
}
else if (Data.EvaluatedData.Attribute == GetEmpiricalValueAttribute())
{
//在当前经验值上增加奖励的经验值
float NewEmpiricalValue = Magnitude + GetEmpiricalValue();
//然后将经验值设入属性
SetEmpiricalValue(NewEmpiricalValue);
Target->HandleExp(SourceTagContainer, Magnitude);
}
3.
打开FightComponent,继承这些接口
virtual void HandleHealth(AMMOARPGCharacterBase* InstigatorPawn, AActor* DamageCauser, const struct FGameplayTagContainer& InTags, float InNewValue);
virtual void HandleMana(const struct FGameplayTagContainer& InTags, float InNewValue);
virtual void HandleExp(const struct FGameplayTagContainer& InTags, float InNewValue);
virtual void RewardEffect(float InNewLevel, TSubclassOf<UGameplayEffect> InNewReward, TFunction<void()> InFun);
进行实现
void UFightComponent::HandleHealth(AMMOARPGCharacterBase* InstigatorPawn, AActor* DamageCauser, const struct FGameplayTagContainer& InTags, float InNewValue)
{
}
void UFightComponent::HandleMana(const struct FGameplayTagContainer& InTags, float InNewValue)
{
}
void UFightComponent::HandleExp(const struct FGameplayTagContainer& InTags, float InNewValue)
{
}
void UFightComponent::RewardEffect(float InNewLevel, TSubclassOf<UGameplayEffect> InNewReward, TFunction<void()> InFun)
{
}