更新技能 触发条件的配置

This commit is contained in:
997146918 2025-09-03 16:28:21 +08:00
parent c24763eae8
commit 4ee512332b
19 changed files with 259 additions and 21 deletions

View File

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

View File

@ -58,11 +58,18 @@ public:
float Speed = 1.0f;
//被动技能属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger",
EditConditionHides, EditCondition = "triggerType != ESkillTriggerType::ActiveSkill"))
TSubclassOf<class USkillTrigger> SkillTrigger;
// //被动技能属性
// UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger",
// EditConditionHides, EditCondition = "triggerType != ESkillTriggerType::ActiveSkill"))
// TSubclassOf<class USkillTrigger> SkillTrigger;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发条件配置",
EditConditionHides, EditCondition = "triggerType == ESkillTriggerType::PassiveSkill"))
FPassiveTriggerConfig PassiveTriggerConfig;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "光环技能触发条件配置",
EditConditionHides, EditCondition = "triggerType == ESkillTriggerType::AuraSkill"))
FAuraTriggerConfig AuraTriggerConfig;

View File

@ -53,6 +53,50 @@ enum class ESkillTriggerType: uint8
AuraSkill UMETA(DisplayName = "光环技能"),
};
// 被动技能触发条件类型
UENUM(BlueprintType)
enum class EPassiveTriggerCondition: uint8
{
ItemTriggered UMETA(DisplayName = "物品触发"),
DealDamage UMETA(DisplayName = "造成伤害"),
ItemDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
ItemDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"),
};
// 被动技能触发目标
UENUM(BlueprintType)
enum class EPassiveTriggerTarget: uint8
{
Self UMETA(DisplayName = "自身"),
Enemy UMETA(DisplayName = "对方"),
SelfSpecificItem UMETA(DisplayName = "我方指定装备"),
EnemySpecificItem UMETA(DisplayName = "对方指定装备"),
};
// 光环技能触发条件类型
UENUM(BlueprintType)
enum class EAuraTriggerCondition: uint8
{
None UMETA(DisplayName = "无条件"),
HealthBelowPercent UMETA(DisplayName = "生命值低于"),
HealthAbovePercent UMETA(DisplayName = "生命值高于"),
EquipmentCountNotMoreThan UMETA(DisplayName = "装备物品数量不多于"),
EquipmentCountNotLessThan UMETA(DisplayName = "装备物品数量不少于"),
};
// 光环技能触发目标
UENUM(BlueprintType)
enum class EAuraTriggerTarget: uint8
{
Self UMETA(DisplayName = "自身"),
Enemy UMETA(DisplayName = "对方"),
SelfAllItems UMETA(DisplayName = "我方全部装备"),
EnemyAllItems UMETA(DisplayName = "对方全部装备"),
};
UENUM(BlueprintType)
enum class ESkillType: uint8
{
@ -80,6 +124,49 @@ static FIntPoint GetSkillSizeValue(ESkillSize SizeType)
return FIntPoint();
}
// 被动触发条件配置
USTRUCT(BlueprintType)
struct FPassiveTriggerConfig
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型"))
EPassiveTriggerCondition Condition = EPassiveTriggerCondition::ItemTriggered;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-100)", EditConditionHides,
EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent",
ClampMin = 0, ClampMax = 100))
float PercentageValue = 50.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides,
EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem"))
FGuid SpecificSkillID;
};
// 光环技能触发条件配置
USTRUCT(BlueprintType)
struct FAuraTriggerConfig
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型"))
EAuraTriggerCondition Condition = EAuraTriggerCondition::None;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
EAuraTriggerTarget Target = EAuraTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-100)", EditConditionHides,
EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent",
ClampMin = 0, ClampMax = 100))
float PercentageValue = 50.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "数量值", EditConditionHides,
EditCondition = "Condition == EAuraTriggerCondition::EquipmentCountNotMoreThan || Condition == EAuraTriggerCondition::EquipmentCountNotLessThan",
ClampMin = 0))
int32 CountValue = 5;
};
USTRUCT(BlueprintType)
struct FSkillContext
{

View File

@ -20,6 +20,7 @@ void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset)
//受到的伤害最低为1点
enduranceOffset = FMath::Min(-1, enduranceOffset + DamageReduce);
}
OnEnduranceChanged.Broadcast();
CurrentEndurance += enduranceOffset;;
}

View File

@ -6,7 +6,8 @@
#include "GameFramework/Pawn.h"
#include "PawnWithSkill.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnReceiveDamage);
DECLARE_MULTICAST_DELEGATE(FOnReceiveDamage);
DECLARE_MULTICAST_DELEGATE(FOnEnduranceChanged);
UCLASS()
class PROJECTFISH_API APawnWithSkill : public APawn
{
@ -21,6 +22,12 @@ public:
void ApplyyTenacity(float tenacityOffset);
void SetDamageReduce(int32 damageReduce);
UFUNCTION(BlueprintPure)
float GetEndurance() const { return CurrentEndurance; }
UFUNCTION(BlueprintPure)
float GetMaxEndurance() const { return MaxEndurance; }
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
@ -49,8 +56,9 @@ public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "韧性归零时眩晕时长"))
float TenacityStun_Time = 5;
UPROPERTY(BlueprintAssignable)
FOnReceiveDamage OnReceiveDamage;
FOnEnduranceChanged OnEnduranceChanged;
};

View File

@ -126,23 +126,23 @@ void USkill::InitSkillTrigger()
switch (SkillData->triggerType)
{
case ESkillTriggerType::PassiveSkill:
if (SkillData->SkillTrigger)
{
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData->SkillTrigger);
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this);
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
SkillTrigger->Init(context);
SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig);
break;
}
break;
case ESkillTriggerType::AuraSkill:
if (SkillData->SkillTrigger)
if (SkillData->AuraTriggerConfig.Condition != EAuraTriggerCondition::None)
{
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData->SkillTrigger);
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this);
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
SkillTrigger->Init(context);
SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig);
}
else
{

View File

@ -11,7 +11,7 @@
#include "Skill.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FSkillUpdate);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSkillExecute, FString, SkillName );
DECLARE_MULTICAST_DELEGATE_OneParam(FSkillExecute, FString );
/**
*
*/
@ -28,6 +28,7 @@ public:
FString GetSkillName() const;
class APawnWithSkill* GetOwner();
USkillManager* GetSkillManager() const { return SkillManager; }
TObjectPtr<USkillAsset> GetSkillData();
TArray<USkillEffect*> GetAllSkillEffects()
@ -46,11 +47,14 @@ public:
UFUNCTION(BlueprintPure)
FIntPoint GetSkillSize();
protected:
public:
UPROPERTY(BlueprintAssignable)
FSkillUpdate OnSkillUpdate;
UPROPERTY(BlueprintAssignable)
FSkillExecute OnSkillExecute;
protected:
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))
TObjectPtr< USkillAsset> SkillData;

View File

@ -181,7 +181,38 @@ TArray<class USkill*> USkillManager::GetSkillsByOwner(APawnWithSkill* Pawn)
return skills;
}
TArray<class USkill*> USkillManager::GetSkillsByOwnerAndID(APawnWithSkill* Pawn, FGuid SkillID)
{
TArray<class USkill*> skills;
for (auto Skill : Skills)
{
if (Skill->GetOwner() == Pawn && Skill->GetSkillData()->SkillID == SkillID)
skills.Add(Skill);
}
return skills;
}
TArray< USkill*> USkillManager::GetAllSkills()
{
return Skills;
}
TArray<USkill*> USkillManager::GetSkillsByType(ESkillType SkillType) const
{
TArray<USkill*> Result;
for (USkill* Skill : Skills)
{
if (Skill && Skill->GetSkillData())
{
for (const ESkillType& Type : Skill->GetSkillData()->SkillTypes)
{
if (Type == SkillType)
{
Result.Add(Skill);
break;
}
}
}
}
return Result;
}

View File

@ -51,8 +51,17 @@ public:
UFUNCTION(BlueprintPure)
TArray<class USkill*> GetSkillsByOwner(APawnWithSkill* Pawn);
UFUNCTION(BlueprintPure)
TArray<class USkill*> GetSkillsByOwnerAndID(APawnWithSkill* Pawn, FGuid SkillID);
UFUNCTION(BlueprintPure)
TArray<class USkill*> GetAllSkills();
UFUNCTION(BlueprintPure)
int32 GetSkillCount() const { return Skills.Num(); }
UFUNCTION(BlueprintPure)
TArray<class USkill*> GetSkillsByType(ESkillType SkillType) const;
protected:
UPROPERTY(BlueprintReadWrite)
TArray<class USkill *> Skills;

View File

@ -4,14 +4,93 @@
#include "SkillTrigger.h"
#include "Skill.h"
#include "SkillManager.h"
#include "ProjectFish/PawnWithSkill.h"
void USkillTrigger::Init_Implementation(FSkillContext context)
void USkillTrigger::Init_Implementation(FSkillContext context, const FPassiveTriggerConfig& InPassiveTriggerConfig, const FAuraTriggerConfig& InAuraTriggerConfig)
{
SkillContext = context;
PassiveTriggerConfig = InPassiveTriggerConfig;
AuraTriggerConfig = InAuraTriggerConfig;
InitConditionTriggers();
}
void USkillTrigger::OnTrigger()
{
SkillContext.OwnerSkill->ExecuteSkill();
}
void USkillTrigger::InitConditionTriggers()
{
if (SkillContext.OwnerSkill->GetSkillData()->triggerType == ESkillTriggerType::PassiveSkill)
InitPassiveConditionTriggers();
else
{
InitAuraConditionTriggers();
}
}
void USkillTrigger::InitPassiveConditionTriggers()
{
switch (PassiveTriggerConfig.Condition)
{
case EPassiveTriggerCondition::ItemTriggered:
{
//物品触发
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem)
{
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.OwnerSkill->GetOwner(), TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillExecute.AddLambda([this](FString SkillName)
{
OnTrigger();
});
}
}
else if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()), TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillExecute.AddLambda([this](FString SkillName)
{
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::DealDamage:
{
//造成伤害触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{
APawnWithSkill* ReceiveDamagePawn =PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy ? SkillContext.OwnerSkill->GetOwner() : SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner());
ReceiveDamagePawn->OnReceiveDamage.AddLambda([this]()
{
OnTrigger();
});
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
default:
break;
}
}
void USkillTrigger::InitAuraConditionTriggers()
{
}

View File

@ -16,11 +16,23 @@ class PROJECTFISH_API USkillTrigger : public UObject
GENERATED_BODY()
public:
UFUNCTION(BlueprintNativeEvent)
void Init(FSkillContext context);
void Init(FSkillContext context, const FPassiveTriggerConfig& InPassiveTriggerConfig, const FAuraTriggerConfig& InAuraTriggerConfig);
UFUNCTION(BlueprintCallable)
void OnTrigger();
protected:
void InitConditionTriggers();
void InitPassiveConditionTriggers();
void InitAuraConditionTriggers();
UPROPERTY(BlueprintReadOnly)
FSkillContext SkillContext;
UPROPERTY(BlueprintReadOnly)
FPassiveTriggerConfig PassiveTriggerConfig;
UPROPERTY(BlueprintReadOnly)
FAuraTriggerConfig AuraTriggerConfig;
};