UE5/C++ 基于GAS的角色升级 7.3.1 准备经验奖励代码框架

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)
{
	
}

猜你喜欢

转载自blog.csdn.net/weixin_45500363/article/details/122136941