完善被动技能触发器逻辑

This commit is contained in:
997146918 2025-09-03 17:05:00 +08:00
parent 4ee512332b
commit 3189d06477
11 changed files with 112 additions and 65 deletions

View File

@ -2,7 +2,7 @@
"BuildId": "37670630",
"Modules":
{
"ProjectFish": "UnrealEditor-ProjectFish-0001.dll",
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0001.dll"
"ProjectFish": "UnrealEditor-ProjectFish-0004.dll",
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0004.dll"
}
}

View File

@ -59,8 +59,8 @@ enum class EPassiveTriggerCondition: uint8
{
ItemTriggered UMETA(DisplayName = "物品触发"),
DealDamage UMETA(DisplayName = "造成伤害"),
ItemDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
ItemDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
SkillDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
SkillDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"),
};
@ -134,10 +134,10 @@ struct FPassiveTriggerConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-100)", EditConditionHides,
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent",
ClampMin = 0, ClampMax = 100))
float PercentageValue = 50.0f;
ClampMin = 0, ClampMax = 1))
float PercentageValue = 0.5f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides,
EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem"))

View File

@ -15,58 +15,6 @@
#include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.h"
// void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
// {
// this->Owner = owner;
// this->SkillManager = skillManager;
// this->SkillData = skillData;
// this->BagPosition = BagPos;
// this->RemainingTime = SkillData->CD;
// this->RemainingEndurance = SkillData->Endurance;
// for (auto effectData: SkillData->SkillEffects)
// {
// USkillEffect* skillEffect = nullptr ;
// switch (effectData.EffectType)
// {
// case ESkillEffectType::Damage:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Damage::StaticClass());
// break;
// case ESkillEffectType::Heal:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Heal::StaticClass());
// break;
// case ESkillEffectType::ModifyCooldown:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifyCD::StaticClass());
// break;
// case ESkillEffectType::Charge:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Charge::StaticClass());
// break;
// case ESkillEffectType::ModifySpeed:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifySpeed::StaticClass());
// break;
// case ESkillEffectType::SkillEnduranceRestore:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_SER::StaticClass());
// break;
// case ESkillEffectType::EnhanceFishRod:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
// break;
// case ESkillEffectType::EnhanceSkill:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
// break;
// case ESkillEffectType::DamageReduce:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
// break;
// default:
// const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
// UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
// }
// if (IsValid(skillEffect))
// {
// skillEffect->InitSkillEffect(this, effectData);
// this->SkillEffects.Add(skillEffect);
// }
//
// }
// }
void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
{
@ -155,6 +103,8 @@ void USkill::InitSkillTrigger()
}
bool USkill::SkillTickAble()
{
//剩余次数无限制或者拥有者没有被韧性眩晕
@ -191,7 +141,9 @@ void USkill::ExecuteSkill()
{
RemainingTime = 0;
if (RemainingEndurance >0)
--RemainingEndurance;
{
ApplyRemainingEnduranceOffset(-1);
}
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
@ -229,12 +181,17 @@ void USkill::ApplyRemainingTimeOffset(int timeOffset)
this->RemainingTime += timeOffset;
}
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
void USkill::ApplyRemainingEnduranceOffset(int Offset)
{
if (SkillData->Endurance != -1)
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData->Endurance);
{
RemainingEndurance = FMath::Clamp( RemainingEndurance + Offset, 0, SkillData->Endurance);
OnSkillEnduranceChange.Broadcast(Offset);
}
}
class APawnWithSkill* USkill::GetOwner()
{
return Owner;

View File

@ -12,6 +12,7 @@
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FSkillUpdate);
DECLARE_MULTICAST_DELEGATE_OneParam(FSkillExecute, FString );
DECLARE_MULTICAST_DELEGATE_OneParam(FSkillEnduranceChange, int32 );
/**
*
*/
@ -40,7 +41,8 @@ public:
void SetSkillData( TObjectPtr<USkillAsset> SkillData);
UFUNCTION(BlueprintCallable)
void ApplyRemainingTimeOffset(int timeOffset);
void ApplyRemainingRemainingEnduranceOffset(int Offset);
void ApplyRemainingEnduranceOffset(int Offset);
UFUNCTION(BlueprintPure)
bool SkillTickAble();
@ -53,6 +55,7 @@ public:
FSkillUpdate OnSkillUpdate;
FSkillExecute OnSkillExecute;
FSkillEnduranceChange OnSkillEnduranceChange;
protected:

View File

@ -22,7 +22,7 @@ void USkillEffect_SER::Execute(const FSkillContext& context)
{
//修改技能的冷却时间
USkill* skill = Cast<USkill>(target);
skill->ApplyRemainingRemainingEnduranceOffset(effectData.EffectValue);
skill->ApplyRemainingEnduranceOffset(effectData.EffectValue);
}
}
}

View File

@ -18,6 +18,7 @@ void USkillTrigger::Init_Implementation(FSkillContext context, const FPassiveTri
void USkillTrigger::OnTrigger()
{
bTriggered = true;
SkillContext.OwnerSkill->ExecuteSkill();
}
@ -37,7 +38,7 @@ void USkillTrigger::InitPassiveConditionTriggers()
{
case EPassiveTriggerCondition::ItemTriggered:
{
//物品触发
//物品执行时触发
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem)
{
@ -83,6 +84,90 @@ void USkillTrigger::InitPassiveConditionTriggers()
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::SkillDurabilityDecrease:
{
//物品耐久度减少触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
//目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{
if (EnduranceOffset < 0)
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::SkillDurabilityRestore:
{
//物品耐久度恢复触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
//目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{
if (EnduranceOffset > 0)
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::HealthFirstBelowPercent:
{
//目标生命值低于x时触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//绑定生命值发生变化
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn]()
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
default:

View File

@ -35,4 +35,6 @@ protected:
UPROPERTY(BlueprintReadOnly)
FAuraTriggerConfig AuraTriggerConfig;
bool bTriggered = false;
};