diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.exp index 9f92a9c..6c9d267 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 424cbe9..c058dbe 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.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb index d369cdd..06638f7 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.pdb differ diff --git a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.cpp b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.cpp index 533e934..9343142 100644 --- a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.cpp +++ b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.cpp @@ -2,3 +2,23 @@ #include "SkillAsset.h" +#include "Misc/Guid.h" + +USkillAsset::USkillAsset() +{ + // Initialize with a new GUID + SkillID = FGuid::NewGuid(); +} + +#if WITH_EDITOR +void USkillAsset::PostInitProperties() +{ + Super::PostInitProperties(); + + // Generate a new GUID if it's not valid (for new assets) + if (!SkillID.IsValid()) + { + SkillID = FGuid::NewGuid(); + } +} +#endif diff --git a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h index ddd433e..79dc85c 100644 --- a/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h +++ b/ProjectFish/Source/ProjectFish/DataAsset/SkillAsset.h @@ -17,37 +17,53 @@ class PROJECTFISH_API USkillAsset : public UDataAsset { GENERATED_BODY() public: + USkillAsset(); + +#if WITH_EDITOR + virtual void PostInitProperties() override; +#endif + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能ID")) + FGuid SkillID; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能名称")) FText SkillName; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能分类Tag")) + TArray SkillTypes; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (AllowedClasses = "Texture2D", ToolTip = "技能图片")) FSoftObjectPath SkillTexture; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能Tag")) - FGameplayTag SkillTag; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组")) + TArray SkillEffects; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "背包占用")) + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能尺寸")) ESkillSize SkillSize = ESkillSize::Small; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "是否为主动技能")) - bool bActiveSkill = true; - - //主动技能属性 - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD", EditConditionHides, EditCondition = "bActiveSkill")) - float CD; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "卡牌稀有度")) + ERarityType RarityType = ERarityType::Common; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度", EditConditionHides, EditCondition = "bActiveSkill")) - float Speed = 1.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能触发类型")) + ESkillTriggerType triggerType = ESkillTriggerType::ActiveSkill; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能耐久度", EditConditionHides, EditCondition = "bActiveSkill")) int32 Endurance; + + //主动技能属性 + UPROPERTY( BlueprintReadWrite, meta = (ToolTip = "技能CD", EditConditionHides, EditCondition = "triggerType == ESkillTriggerType::ActiveSkill")) + float CD; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度", EditConditionHides, EditCondition = "triggerType == ESkillTriggerType::ActiveSkill")) + float Speed = 1.0f; + //被动技能属性 - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger", EditConditionHides, EditCondition = "!bActiveSkill")) + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "被动技能触发器,没有配置的话为光环类技能默认进行触发", AllowedClasses = "SkillTrigger", + EditConditionHides, EditCondition = "triggerType == ESkillTriggerType::PassiveSkill")) TSubclassOf SkillTrigger; + - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组")) - TArray SkillEffects; }; diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index 37162aa..01f4579 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -22,33 +22,43 @@ enum class ESkillEffectType: uint8 DamageReduce UMETA(DisplayName = "减伤", ToolTip = "减少所受的伤害"), }; -//技能对象类型 -UENUM(BlueprintType) -enum class ESkillTargetType: uint8 -{ - Self UMETA(DisplayName = "目标是自身角色"), - Other UMETA(DisplayName = "目标是对方角色"), - Around UMETA(DisplayName = "格子周围的技能") - // AdjacentLeft UMETA(DisplayName = "左侧相邻"), - // AdjacentRight UMETA(DisplayName = "右侧相邻"), - // AllLeft UMETA(DisplayName = "左侧全部"), - // AllRight UMETA(DisplayName = "右侧全部"), -}; -//随机对象类型 -UENUM(BlueprintType) -enum class ERandomTargetType: uint8 -{ - AllSelf UMETA(DisplayName = "我方全部技能"), - AllOther UMETA(DisplayName = "敌方全部技能"), -}; + //技能选择器类型 UENUM(BlueprintType) -enum class ETargetSelecterType: uint8 +enum class EEffectTargetType: uint8 { - SkillPos UMETA(DisplayName = "指定对象选择"), - SkillTag UMETA(DisplayName = "根据技能Tag选择"), - RandomScope UMETA(DisplayName = "指定技能组选择"), + Target UMETA(DisplayName = "对方本体"), + Self UMETA(DisplayName = "自身"), + TargetSkill UMETA(DisplayName = "对方的装备"), + SelfSkill UMETA(DisplayName = "自身的装备"), + AroundSkill UMETA(DisplayName = "当前装备周围的装备"), + SelfSkillType UMETA(DisplayName = "自身指定分类的装备"), + TargetSkillType UMETA(DisplayName = "对方指定分类的装备"), +}; + +UENUM(BlueprintType) +enum class ERarityType: uint8 +{ + Common UMETA(DisplayName = "普通"), + UnCommon UMETA(DisplayName = "精良"), + Rare UMETA(DisplayName = "稀有"), +}; + +UENUM(BlueprintType) +enum class ESkillTriggerType: uint8 +{ + ActiveSkill UMETA(DisplayName = "主动技能"), + PassiveSkill UMETA(DisplayName = "被动技能"), + AuraSkill UMETA(DisplayName = "光环技能"), +}; + +UENUM(BlueprintType) +enum class ESkillType: uint8 +{ + Type1 UMETA(DisplayName = "Type1"), + Type2 UMETA(DisplayName = "Type2"), + Type3 UMETA(DisplayName = "Type3"), }; UENUM(BlueprintType) @@ -89,19 +99,21 @@ struct FSkillTargetSelector { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器类型")) - ETargetSelecterType SelecterType; + EEffectTargetType SelecterType; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能目标类型", - EditConditionHides, EditCondition = "SelecterType == ETargetSelecterType::SkillPos")) - ESkillTargetType TargetType; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定技能的分类" + , EditConditionHides, EditCondition = "SelecterType == EEffectTargetType::SelfSkillType || SelecterType == EEffectTargetType::TargetSkillType")) + ESkillType SkillType = ESkillType::Type1; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "目标是否全部还是指定数目" + , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self")) + bool bAll = true; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "应用的技能tag", - EditConditionHides, EditCondition = "SelecterType == ETargetSelecterType::SkillTag")) - FGameplayTagContainer ApplySkillTags; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "随机目标类型" - , EditConditionHides, EditCondition = "SelecterType == ETargetSelecterType::RandomScope")) - ERandomTargetType RandomType; + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定数目" + , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self && !bAll")) + int32 MaxEffectTargetNum = 1; + + }; //技能效果 diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp index 183fabf..727c126 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp @@ -3,6 +3,7 @@ #include "Skill.h" +#include "InputTriggers.h" #include "SkillTrigger.h" #include "SkillEffects/SkillEffect_Charge.h" #include "SkillEffects/SkillEffect_Damage.h" @@ -122,8 +123,9 @@ void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, void USkill::InitSkillTrigger() { - if (!SkillData->bActiveSkill) + switch (SkillData->triggerType) { + case ESkillTriggerType::PassiveSkill: if (SkillData->SkillTrigger) { USkillTrigger* SkillTrigger = NewObject(this, SkillData->SkillTrigger); @@ -132,19 +134,21 @@ void USkill::InitSkillTrigger() context.SkillManager = SkillManager; SkillTrigger->Init(context); } - else - { + break; + case ESkillTriggerType::AuraSkill: //UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能,直接触发")); ExecuteSkill(); - } + break; } + } bool USkill::SkillTickAble() { //剩余次数无限制或者拥有者没有被韧性眩晕 - return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData->bActiveSkill; + return (RemainingEndurance >0 || RemainingEndurance == -1 ) + && Owner->CurrentTenacity > 0 && SkillData->triggerType == ESkillTriggerType::ActiveSkill; } FIntPoint USkill::GetSkillSize() diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp index c9233fc..c4183a2 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp @@ -50,58 +50,121 @@ TArray USkillEffect::GetApplyTargets(const FSkillContext& context) TArray result; switch (effectData.SkillSelecter.SelecterType) { - case ETargetSelecterType::SkillPos: + case EEffectTargetType::Target: { - GetEffectTargetsByTargetType(context, result); - - break;; + //目标是敌人 + result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); + break;; } - case ETargetSelecterType::SkillTag: - { - //根据Tag 决定应用对象 - for (auto skill: context.SkillManager->GetAllSkills()) + case EEffectTargetType::Self: { - - if (effectData.SkillSelecter.ApplySkillTags.HasTag(skill->GetSkillData()->SkillTag)) + //目标是敌人 + result.Add(OwnerSkill->GetOwner()); + break;; + } + case EEffectTargetType::TargetSkill: + { + TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); + if (effectData.SkillSelecter.bAll) + { + result.Append(Skills); + } + else + { + int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, Skills.Num() - 1); + result.Add(Skills[randomIndex]); + Skills.RemoveAt(randomIndex); + } + } + break;; + } + case EEffectTargetType::SelfSkill: + { + TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); + if (effectData.SkillSelecter.bAll) + { + result.Append(Skills); + } + else + { + int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, Skills.Num() - 1); + result.Add(Skills[randomIndex]); + Skills.RemoveAt(randomIndex); + } + } + break;; + } + case EEffectTargetType::AroundSkill: + { + TArray aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); + for (auto skill: aroundSkills) { result.Add(skill); } + break; } - break;; - } - case ETargetSelecterType::RandomScope: - { - //应用到随机技能 - switch (effectData.SkillSelecter.RandomType) + case EEffectTargetType::SelfSkillType: { - case ERandomTargetType::AllSelf: + //筛选指定类型的技能 + TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); + for (int i = Skills.Num() - 1; i >= 0; i--) { - //所有我方的技能 - for (auto skill: context.SkillManager->GetAllSkills()) - { - if (OwnerSkill->GetOwner() == skill->GetOwner()) - { - result.Add(skill); - } - } - break; + if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) + { + Skills.RemoveAt(i); + } } - case ERandomTargetType::AllOther: + + if (effectData.SkillSelecter.bAll) { - //所有地方的技能 - for (auto skill: context.SkillManager->GetAllSkills()) - { - if (OwnerSkill->GetOwner() != skill->GetOwner()) - { - result.Add(skill); - } - } - break; + result.Append(Skills); } + else + { + int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, Skills.Num() - 1); + result.Add(Skills[randomIndex]); + Skills.RemoveAt(randomIndex); + } + } + break; + } + case EEffectTargetType::TargetSkillType: + { + //筛选指定类型的技能 + TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); + for (int i = Skills.Num() - 1; i >= 0; i--) + { + if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) + { + Skills.RemoveAt(i); + } + } + + if (effectData.SkillSelecter.bAll) + { + result.Append(Skills); + } + else + { + int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, Skills.Num() - 1); + result.Add(Skills[randomIndex]); + Skills.RemoveAt(randomIndex); + } + } + break; } - break; - } - } return result; } @@ -111,37 +174,3 @@ FString USkillEffect::GetSkillEffectDes() return FString(); } -void USkillEffect::GetEffectTargetsByTargetType(const FSkillContext& context, TArray& result) -{ - //根据位置决定应用对象 - ESkillTargetType targetType = effectData.SkillSelecter.TargetType; - switch (targetType) - { - case ESkillTargetType::Self: - { - result.Add(OwnerSkill->GetOwner()); - break; - } - case ESkillTargetType::Other: - { - for (auto pawn: context.SkillManager->GetAllPawns()) - { - if (pawn != OwnerSkill->GetOwner()) - { - result.Add(pawn); - } - } - break; - } - case ESkillTargetType::Around: - { - //技能左侧的技能 - TArray aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); - for (auto skill: aroundSkills) - { - result.Add(skill); - } - break;; - } - } -} diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h index f8ec002..a4297af 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h @@ -27,8 +27,7 @@ public: { return effectData; } -private: - void GetEffectTargetsByTargetType(const FSkillContext& context, TArray& result); + protected: UPROPERTY() class USkill* OwnerSkill; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp index b56f627..1b20dce 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp @@ -112,15 +112,7 @@ void USkillManager::OnAllSkillAdded() } } -class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag) -{ - for (auto Skill : Skills) - { - if (Skill->GetSkillData()->SkillTag == Tag) - return Skill; - } - return nullptr; -} + int32 USkillManager::GetSkillIndex(USkill* Skill) { @@ -168,6 +160,16 @@ TArray USkillManager::GetAllPawns() return Pawns; } +APawnWithSkill* USkillManager::GetEnemyPawn(const APawnWithSkill* SelfPawn) +{ + for (auto info: PawnInfo) + { + if (SelfPawn != info.Key) + return info.Key; + } + return nullptr; +} + TArray USkillManager::GetSkillsByOwner(APawnWithSkill* Pawn) { TArray skills; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h index 45f2bef..7168694 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h @@ -32,9 +32,7 @@ public: UFUNCTION(BlueprintCallable) void OnAllSkillAdded(); - - UFUNCTION(BlueprintPure) - class USkill* GetSkillByTag(FGameplayTag Tag); + int32 GetSkillIndex(USkill* Skill); @@ -47,6 +45,9 @@ public: UFUNCTION(BlueprintCallable) TArray GetAllPawns(); + UFUNCTION(BlueprintCallable) + APawnWithSkill* GetEnemyPawn(const APawnWithSkill* SelfPawn); + UFUNCTION(BlueprintPure) TArray GetSkillsByOwner(APawnWithSkill* Pawn);