添加减伤技能效果

This commit is contained in:
997146918 2025-07-22 18:06:10 +08:00
parent 25f8adc0a8
commit aded160ce0
14 changed files with 107 additions and 8 deletions

View File

@ -18,7 +18,8 @@ enum class ESkillEffectType: uint8
ModifySpeed UMETA(DisplayName = "速度修改", ToolTip = "使技能冷却进度倍率进展 持续指定时间"), ModifySpeed UMETA(DisplayName = "速度修改", ToolTip = "使技能冷却进度倍率进展 持续指定时间"),
SkillEnduranceRestore UMETA(DisplayName = "技能耐久度恢复", ToolTip = "使技能耐久度恢复"), SkillEnduranceRestore UMETA(DisplayName = "技能耐久度恢复", ToolTip = "使技能耐久度恢复"),
EnhanceFishRod UMETA(DisplayName = "增强鱼竿", ToolTip = "使鱼竿上海增加"), EnhanceFishRod UMETA(DisplayName = "增强鱼竿", ToolTip = "使鱼竿上海增加"),
EnhanceSkill UMETA(DisplayName = "增强技能", ToolTip = "增强指定的技能数值") EnhanceSkill UMETA(DisplayName = "增强技能", ToolTip = "增强指定的技能数值"),
DamageReduce UMETA(DisplayName = "减伤", ToolTip = "减少所受的伤害"),
}; };
//技能对象类型 //技能对象类型

View File

@ -13,7 +13,15 @@ APawnWithSkill::APawnWithSkill()
void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset) void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset)
{ {
if (enduranceOffset < 0)
{
//受到伤害
OnReceiveDamage.Broadcast();
//受到的伤害最低为1点
enduranceOffset = FMath::Min(-1, enduranceOffset + DamageReduce);
}
CurrentEndurance += enduranceOffset;; CurrentEndurance += enduranceOffset;;
} }
void APawnWithSkill::ApplyyTenacity_Implementation(float tenacityOffset) void APawnWithSkill::ApplyyTenacity_Implementation(float tenacityOffset)
@ -21,6 +29,11 @@ void APawnWithSkill::ApplyyTenacity_Implementation(float tenacityOffset)
CurrentTenacity += tenacityOffset; CurrentTenacity += tenacityOffset;
} }
void APawnWithSkill::SetDamageReduce(int32 damageReduce)
{
DamageReduce = damageReduce;
}
// Called when the game starts or when spawned // Called when the game starts or when spawned
void APawnWithSkill::BeginPlay() void APawnWithSkill::BeginPlay()
{ {

View File

@ -6,6 +6,7 @@
#include "GameFramework/Pawn.h" #include "GameFramework/Pawn.h"
#include "PawnWithSkill.generated.h" #include "PawnWithSkill.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnReceiveDamage);
UCLASS() UCLASS()
class PROJECTFISH_API APawnWithSkill : public APawn class PROJECTFISH_API APawnWithSkill : public APawn
{ {
@ -18,6 +19,8 @@ public:
void ApplyyEndurance(float enduranceOffset); void ApplyyEndurance(float enduranceOffset);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent) UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void ApplyyTenacity(float tenacityOffset); void ApplyyTenacity(float tenacityOffset);
void SetDamageReduce(int32 damageReduce);
protected: protected:
// Called when the game starts or when spawned // Called when the game starts or when spawned
virtual void BeginPlay() override; virtual void BeginPlay() override;
@ -31,6 +34,9 @@ public:
UPROPERTY(BlueprintReadWrite, meta = (ToolTip = "当前耐久度")) UPROPERTY(BlueprintReadWrite, meta = (ToolTip = "当前耐久度"))
float CurrentEndurance; float CurrentEndurance;
UPROPERTY(BlueprintReadWrite, meta = (ToolTip = "减伤值"))
float DamageReduce;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "最大耐久度")) UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "最大耐久度"))
float MaxEndurance; float MaxEndurance;
@ -43,5 +49,8 @@ public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "韧性归零时眩晕时长")) UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "韧性归零时眩晕时长"))
float TenacityStun_Time = 5; float TenacityStun_Time = 5;
UPROPERTY(BlueprintAssignable)
FOnReceiveDamage OnReceiveDamage;
}; };

View File

@ -6,6 +6,7 @@
#include "SkillTrigger.h" #include "SkillTrigger.h"
#include "SkillEffects/SkillEffect_Charge.h" #include "SkillEffects/SkillEffect_Charge.h"
#include "SkillEffects/SkillEffect_Damage.h" #include "SkillEffects/SkillEffect_Damage.h"
#include "SkillEffects/SkillEffect_DamageReduce.h"
#include "SkillEffects/SkillEffect_EnhanceFishRod.h" #include "SkillEffects/SkillEffect_EnhanceFishRod.h"
#include "SkillEffects/SkillEffect_EnhanceSkill.h" #include "SkillEffects/SkillEffect_EnhanceSkill.h"
#include "SkillEffects/SkillEffect_Heal.h" #include "SkillEffects/SkillEffect_Heal.h"
@ -50,6 +51,9 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
case ESkillEffectType::EnhanceSkill: case ESkillEffectType::EnhanceSkill:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass()); skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
break; break;
case ESkillEffectType::DamageReduce:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
break;
default: default:
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>(); const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType))) UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
@ -77,7 +81,7 @@ void USkill::InitSkillTrigger()
} }
else else
{ {
UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能直接触发")); //UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能直接触发"));
ExecuteSkill(); ExecuteSkill();
} }
} }
@ -100,9 +104,12 @@ void USkill::TickSkill(float deltaTime)
} }
if (RemainingEndurance == 0) if (RemainingEndurance == 0)
{ {
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects) for (auto Effect: SkillEffects)
{ {
Effect->EffectEnded(); Effect->EffectEnded(context);
} }
} }
} }

View File

@ -41,7 +41,7 @@ void USkillEffect::Execute(const FSkillContext& context)
, *( GetSkillEffectDes())); , *( GetSkillEffectDes()));
} }
void USkillEffect::EffectEnded() void USkillEffect::EffectEnded(const FSkillContext& context)
{ {
} }

View File

@ -18,7 +18,7 @@ class USkillEffect : public UObject
public: public:
void InitSkillEffect(class USkill* skill, FSkillEffectData data); void InitSkillEffect(class USkill* skill, FSkillEffectData data);
virtual void Execute(const FSkillContext& context) ; virtual void Execute(const FSkillContext& context) ;
virtual void EffectEnded(); virtual void EffectEnded(const FSkillContext& context);
TArray<UObject*> GetApplyTargets(const FSkillContext& context); TArray<UObject*> GetApplyTargets(const FSkillContext& context);
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)

View File

@ -0,0 +1,49 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SkillEffect_DamageReduce.h"
#include "ProjectFish/Skill/Skill.h"
void USkillEffect_DamageReduce::Execute(const FSkillContext& context)
{
Super::Execute(context);
TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets)
{
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
{
UE_LOG(LogTemp, Error, TEXT("skill %s apply target is not a pawn "), *(OwnerSkill->GetSkillName()));
}
else
{
//设置目标护盾值
APawnWithSkill* OwnerPawn = Cast<APawnWithSkill>(target);
OwnerPawn->SetDamageReduce( (int32)(effectData.EffectValue));
}
}
}
void USkillEffect_DamageReduce::EffectEnded(const FSkillContext& context)
{
Super::EffectEnded(context);
TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets)
{
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
{
UE_LOG(LogTemp, Error, TEXT("skill %s apply target is not a pawn "), *(OwnerSkill->GetSkillName()));
}
else
{
//恢复目标护盾值
APawnWithSkill* OwnerPawn = Cast<APawnWithSkill>(target);
OwnerPawn->SetDamageReduce(0);
}
}
}
FString USkillEffect_DamageReduce::GetSkillEffectDes()
{
return FString::Printf(TEXT("减少目标受到的伤害 %d点"), (int32)(effectData.EffectValue));
}

View File

@ -0,0 +1,20 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "ProjectFish/Skill/SkillEffect.h"
#include "SkillEffect_DamageReduce.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISH_API USkillEffect_DamageReduce : public USkillEffect
{
GENERATED_BODY()
public:
void Execute(const FSkillContext& context) override;
void EffectEnded(const FSkillContext& context) override;
FString GetSkillEffectDes() override;
};

View File

@ -36,9 +36,9 @@ void USkillEffect_ModifySpeed::Execute(const FSkillContext& context)
} }
} }
void USkillEffect_ModifySpeed::EffectEnded() void USkillEffect_ModifySpeed::EffectEnded(const FSkillContext& context)
{ {
Super::EffectEnded(); Super::EffectEnded(context);
//GetWorld()->GetTimerManager().ClearTimer(TimerHandle); //GetWorld()->GetTimerManager().ClearTimer(TimerHandle);
} }

View File

@ -17,7 +17,7 @@ class PROJECTFISH_API USkillEffect_ModifySpeed : public USkillEffect
GENERATED_BODY() GENERATED_BODY()
public: public:
void Execute(const FSkillContext& context) override; void Execute(const FSkillContext& context) override;
void EffectEnded() override; void EffectEnded(const FSkillContext& context) override;
FString GetSkillEffectDes() override; FString GetSkillEffectDes() override;
private: private:
FTimerHandle TimerHandle; FTimerHandle TimerHandle;