更新技能 触发条件的配置
This commit is contained in:
parent
c24763eae8
commit
4ee512332b
Binary file not shown.
BIN
ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.pdb
Normal file
BIN
ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.pdb
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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"
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -20,6 +20,7 @@ void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset)
|
||||
//受到的伤害最低为1点
|
||||
enduranceOffset = FMath::Min(-1, enduranceOffset + DamageReduce);
|
||||
}
|
||||
OnEnduranceChanged.Broadcast();
|
||||
CurrentEndurance += enduranceOffset;;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user