UE5多人MOBA+GAS 番外篇:将冷却缩减属性应用到技能冷却中
在技能基类CGameplayAbility
中添加浮点数
// 技能冷却UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Cooldown")FScalableFloat CooldownDuration;
技能的冷却时长就不放在GE里了,放在技能的里面去设置
创建一个MMC我就废物利用把之前MMC伤害的直接拿来用了
#pragma once#include "CoreMinimal.h"
#include "GameplayModMagnitudeCalculation.h"
#include "MMC_BaseAttackDamage.generated.h"/*** */
UCLASS()
class UMMC_BaseAttackDamage : public UGameplayModMagnitudeCalculation
{GENERATED_BODY()public:UMMC_BaseAttackDamage();virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;
private:FGameplayEffectAttributeCaptureDefinition CooldownReductionCaptureDef;
};
#include "GAS/MMC/MMC_BaseAttackDamage.h"#include "GAS/Core/CAttributeSet.h"
#include "GAS/Core/CGameplayAbility.h"
#include "GAS/Core/CHeroAttributeSet.h"UMMC_BaseAttackDamage::UMMC_BaseAttackDamage()
{// 获取冷却缩减属性CooldownReductionCaptureDef.AttributeToCapture = UCHeroAttributeSet::GetCooldownReductionAttribute();CooldownReductionCaptureDef.AttributeSource = EGameplayEffectAttributeCaptureSource::Source;// 添加捕获属性RelevantAttributesToCapture.Add(CooldownReductionCaptureDef);
}float UMMC_BaseAttackDamage::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{FAggregatorEvaluateParameters EvalParams;// 绑定源/目标标签EvalParams.SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();EvalParams.TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();// 获取Ability实例const UCGameplayAbility* Ability = Cast<UCGameplayAbility>(Spec.GetContext().GetAbilityInstance_NotReplicated());if (!Ability) return 0.0f;// 获取基础冷却时间float BaseCooldown = Ability->CooldownDuration.GetValueAtLevel(Ability->GetAbilityLevel());// 获取冷却缩减属性值float CooldownReduction = 0.f;//(通过CooldownReductionCaptureDef定义的捕获规则)GetCapturedAttributeMagnitude(CooldownReductionCaptureDef, Spec, EvalParams, CooldownReduction); // 获取源的属性值// 计算冷却float ActualCooldown = BaseCooldown * (1.0f - CooldownReduction/100.0f);return FMath::Max(0.1f, ActualCooldown);
}
修改一下函数库CAbilitySystemStatics
中获取技能冷却的函数GetCooldownDurationFor
float UCAbilitySystemStatics::GetCooldownDurationFor(const UGameplayAbility* AbilityCDO,const UAbilitySystemComponent& ASC, int AbilityLevel)
{float CooldownDuration = 0.f;if (AbilityCDO){const UCGameplayAbility* Ability = Cast<UCGameplayAbility>(AbilityCDO);if (!Ability) return CooldownDuration;// 获取基础冷却时间float BaseCooldown = Ability->CooldownDuration.GetValueAtLevel(AbilityLevel);// 获取冷却缩减属性值bool bFound;float CooldownReduction = ASC.GetGameplayAttributeValue(UCHeroAttributeSet::GetCooldownReductionAttribute(), bFound);if (bFound){// 计算最终冷却时间CooldownDuration = BaseCooldown * (1.0f - CooldownReduction/100.0f);}}// 返回绝对值(确保冷却时间始终为正数)return FMath::Abs(CooldownDuration);
}
冷却的GE的持续时间然后调用计算类把做好的mmc放进去
初始化的时候修改一下这里
如此一来算是成功了吗