完善被动技能触发器逻辑

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", "BuildId": "37670630",
"Modules": "Modules":
{ {
"ProjectFish": "UnrealEditor-ProjectFish-0001.dll", "ProjectFish": "UnrealEditor-ProjectFish-0004.dll",
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0001.dll" "ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0004.dll"
} }
} }

View File

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

View File

@ -15,58 +15,6 @@
#include "SkillEffects/SkillEffect_ModifySpeed.h" #include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.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) void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
{ {
@ -155,6 +103,8 @@ void USkill::InitSkillTrigger()
} }
bool USkill::SkillTickAble() bool USkill::SkillTickAble()
{ {
//剩余次数无限制或者拥有者没有被韧性眩晕 //剩余次数无限制或者拥有者没有被韧性眩晕
@ -191,7 +141,9 @@ void USkill::ExecuteSkill()
{ {
RemainingTime = 0; RemainingTime = 0;
if (RemainingEndurance >0) if (RemainingEndurance >0)
--RemainingEndurance; {
ApplyRemainingEnduranceOffset(-1);
}
FSkillContext context; FSkillContext context;
context.OwnerSkill = this; context.OwnerSkill = this;
context.SkillManager = SkillManager; context.SkillManager = SkillManager;
@ -229,12 +181,17 @@ void USkill::ApplyRemainingTimeOffset(int timeOffset)
this->RemainingTime += timeOffset; this->RemainingTime += timeOffset;
} }
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset) void USkill::ApplyRemainingEnduranceOffset(int Offset)
{ {
if (SkillData->Endurance != -1) 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() class APawnWithSkill* USkill::GetOwner()
{ {
return Owner; return Owner;

View File

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

View File

@ -22,7 +22,7 @@ void USkillEffect_SER::Execute(const FSkillContext& context)
{ {
//修改技能的冷却时间 //修改技能的冷却时间
USkill* skill = Cast<USkill>(target); 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() void USkillTrigger::OnTrigger()
{ {
bTriggered = true;
SkillContext.OwnerSkill->ExecuteSkill(); SkillContext.OwnerSkill->ExecuteSkill();
} }
@ -37,7 +38,7 @@ void USkillTrigger::InitPassiveConditionTriggers()
{ {
case EPassiveTriggerCondition::ItemTriggered: case EPassiveTriggerCondition::ItemTriggered:
{ {
//物品触发 //物品执行时触发
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem) if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem)
{ {
@ -83,6 +84,90 @@ void USkillTrigger::InitPassiveConditionTriggers()
{ {
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配")); 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; break;
} }
default: default:

View File

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