完善光环类技能的触发

This commit is contained in:
997146918 2025-09-03 17:23:01 +08:00
parent 3189d06477
commit 4ea0f2943d
6 changed files with 97 additions and 6 deletions

View File

@ -90,9 +90,7 @@ UENUM(BlueprintType)
enum class EAuraTriggerTarget: uint8 enum class EAuraTriggerTarget: uint8
{ {
Self UMETA(DisplayName = "自身"), Self UMETA(DisplayName = "自身"),
Enemy UMETA(DisplayName = "对方"), Enemy UMETA(DisplayName = "对方")
SelfAllItems UMETA(DisplayName = "我方全部装备"),
EnemyAllItems UMETA(DisplayName = "对方全部装备"),
}; };
@ -155,10 +153,10 @@ struct FAuraTriggerConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
EAuraTriggerTarget Target = EAuraTriggerTarget::Self; EAuraTriggerTarget Target = EAuraTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-100)", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent", EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent",
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 = "Condition == EAuraTriggerCondition::EquipmentCountNotMoreThan || Condition == EAuraTriggerCondition::EquipmentCountNotLessThan", EditCondition = "Condition == EAuraTriggerCondition::EquipmentCountNotMoreThan || Condition == EAuraTriggerCondition::EquipmentCountNotLessThan",

View File

@ -155,6 +155,17 @@ void USkill::ExecuteSkill()
OnSkillExecute.Broadcast(SkillData->SkillName.ToString()); OnSkillExecute.Broadcast(SkillData->SkillName.ToString());
} }
void USkill::CancelSkill()
{
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Cancel(context);
}
}
FString USkill::GetSkillName() const FString USkill::GetSkillName() const
{ {
return SkillData->SkillName.ToString();; return SkillData->SkillName.ToString();;

View File

@ -26,6 +26,7 @@ public:
void InitSkillTrigger(); void InitSkillTrigger();
void TickSkill(float deltaTime); void TickSkill(float deltaTime);
void ExecuteSkill(); void ExecuteSkill();
void CancelSkill();
FString GetSkillName() const; FString GetSkillName() const;
class APawnWithSkill* GetOwner(); class APawnWithSkill* GetOwner();

View File

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

View File

@ -18,6 +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 Cancel(const FSkillContext& context) ;
virtual void EffectEnded(const FSkillContext& context); virtual void EffectEnded(const FSkillContext& context);
TArray<UObject*> GetApplyTargets(const FSkillContext& context); TArray<UObject*> GetApplyTargets(const FSkillContext& context);

View File

@ -177,5 +177,81 @@ void USkillTrigger::InitPassiveConditionTriggers()
void USkillTrigger::InitAuraConditionTriggers() void USkillTrigger::InitAuraConditionTriggers()
{ {
switch (AuraTriggerConfig.Condition)
{
case EAuraTriggerCondition::None:
{
OnTrigger();
break;
}
case EAuraTriggerCondition::HealthBelowPercent:
{
//目标pawn
APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//初始检测
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
{
OnTrigger();
}
//动态检测
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn]()
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
break;
}
case EAuraTriggerCondition::HealthAbovePercent:
{
//目标pawn
APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//初始检测
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
{
OnTrigger();
}
//动态检测
TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]()
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
break;
}
case EAuraTriggerCondition::EquipmentCountNotMoreThan:
{
//目标pawn
APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() <= this->AuraTriggerConfig.CountValue)
{
OnTrigger();
}
}
case EAuraTriggerCondition::EquipmentCountNotLessThan:
{
//目标pawn
APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() >= this->AuraTriggerConfig.CountValue)
{
OnTrigger();
}
}
default:
break;
}
} }