diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.exp index e159705..0d55bab 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.exp and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.pdb new file mode 100644 index 0000000..3ff4ffa Binary files /dev/null and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0007.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0007.exp index d8e4025..cdfed2c 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0007.exp and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0007.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp index 6c9d267..ae86170 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.pdb index 4a9c87e..8345b28 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.pdb and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.pdb new file mode 100644 index 0000000..0c206e5 Binary files /dev/null and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0007.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0007.exp new file mode 100644 index 0000000..e27b1e8 Binary files /dev/null and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0007.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb index 1855fd7..d012c02 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor.modules b/ProjectFish/Binaries/Win64/UnrealEditor.modules index 22c08e6..fe900f8 100644 --- a/ProjectFish/Binaries/Win64/UnrealEditor.modules +++ b/ProjectFish/Binaries/Win64/UnrealEditor.modules @@ -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" } } \ No newline at end of file diff --git a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h index 545649c..67764aa 100644 --- a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h +++ b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h @@ -58,11 +58,18 @@ public: float Speed = 1.0f; - //被动技能属性 - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger", - EditConditionHides, EditCondition = "triggerType != ESkillTriggerType::ActiveSkill")) - TSubclassOf SkillTrigger; + // //被动技能属性 + // UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger", + // EditConditionHides, EditCondition = "triggerType != ESkillTriggerType::ActiveSkill")) + // TSubclassOf 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; diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index 01f4579..f940f46 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -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 { diff --git a/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp b/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp index f4aae2e..45439c2 100644 --- a/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp +++ b/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp @@ -20,6 +20,7 @@ void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset) //受到的伤害最低为1点 enduranceOffset = FMath::Min(-1, enduranceOffset + DamageReduce); } + OnEnduranceChanged.Broadcast(); CurrentEndurance += enduranceOffset;; } diff --git a/ProjectFish/Source/ProjectFish/PawnWithSkill.h b/ProjectFish/Source/ProjectFish/PawnWithSkill.h index e2ffe73..8f7a7ca 100644 --- a/ProjectFish/Source/ProjectFish/PawnWithSkill.h +++ b/ProjectFish/Source/ProjectFish/PawnWithSkill.h @@ -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; }; diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp index 2ba79a8..bb18ed8 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp @@ -126,23 +126,23 @@ void USkill::InitSkillTrigger() switch (SkillData->triggerType) { case ESkillTriggerType::PassiveSkill: - if (SkillData->SkillTrigger) { - USkillTrigger* SkillTrigger = NewObject(this, SkillData->SkillTrigger); + USkillTrigger* SkillTrigger = NewObject(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(this, SkillData->SkillTrigger); + USkillTrigger* SkillTrigger = NewObject(this); FSkillContext context; context.OwnerSkill = this; context.SkillManager = SkillManager; - SkillTrigger->Init(context); + SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig); } else { diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.h b/ProjectFish/Source/ProjectFish/Skill/Skill.h index efb1227..8dd0bf8 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.h +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.h @@ -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 GetSkillData(); TArray 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; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp index 1b20dce..8b054dc 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp @@ -181,7 +181,38 @@ TArray USkillManager::GetSkillsByOwner(APawnWithSkill* Pawn) return skills; } +TArray USkillManager::GetSkillsByOwnerAndID(APawnWithSkill* Pawn, FGuid SkillID) +{ + TArray 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 USkillManager::GetSkillsByType(ESkillType SkillType) const +{ + TArray 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; +} diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h index 7168694..73d3ccf 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h @@ -51,8 +51,17 @@ public: UFUNCTION(BlueprintPure) TArray GetSkillsByOwner(APawnWithSkill* Pawn); + UFUNCTION(BlueprintPure) + TArray GetSkillsByOwnerAndID(APawnWithSkill* Pawn, FGuid SkillID); + UFUNCTION(BlueprintPure) TArray GetAllSkills(); + + UFUNCTION(BlueprintPure) + int32 GetSkillCount() const { return Skills.Num(); } + + UFUNCTION(BlueprintPure) + TArray GetSkillsByType(ESkillType SkillType) const; protected: UPROPERTY(BlueprintReadWrite) TArray Skills; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp index 7e575ab..9481d01 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp @@ -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 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 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() +{ +} + diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h index 526c60f..45d4f5b 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h @@ -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; };