添加被动技能及触发器

This commit is contained in:
997146918 2025-07-21 17:00:29 +08:00
parent 2c30f24aad
commit 4e7af37166
14 changed files with 123 additions and 26 deletions

View File

@ -53,8 +53,8 @@ struct FSkillContext
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "敌人"))
class USkillManager* SkillManager;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "自身"))
APawnWithSkill* Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "所属的技能"))
class USkill* OwnerSkill;
};
@ -112,21 +112,31 @@ struct FSkillData: public FTableRowBase
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (AllowedClasses = "Texture2D", ToolTip = "技能图片"))
FSoftObjectPath SkillTexture;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD"))
float CD;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度"))
float Speed = 1.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能耐久度"))
int32 Endurance;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能Tag"))
FGameplayTag SkillTag;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "背包占用"))
FIntPoint SkillWeight;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "是否为主动技能"))
bool bActiveSkill = true;
//主动技能属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD", EditConditionHides, EditCondition = "bActiveSkill"))
float CD;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度", EditConditionHides, EditCondition = "bActiveSkill"))
float Speed = 1.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能耐久度", EditConditionHides, EditCondition = "bActiveSkill"))
int32 Endurance;
//被动技能属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能CD速度", AllowedClasses = "SkillTrigger", EditConditionHides, EditCondition = "!bActiveSkill"))
TSubclassOf<class USkillTrigger> SkillTrigger;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能效果组"))
TArray<FSkillEffectData> SkillEffects;
};

View File

@ -3,6 +3,7 @@
#include "Skill.h"
#include "SkillTrigger.h"
#include "SkillEffects/SkillEffect_Charge.h"
#include "SkillEffects/SkillEffect_Damage.h"
#include "SkillEffects/SkillEffect_Heal.h"
@ -50,10 +51,23 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
}
}
void USkill::InitSkillTrigger()
{
if (!SkillData.bActiveSkill)
{
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData.SkillTrigger);
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
SkillTrigger->Init(context);
}
}
bool USkill::SkillTickAble()
{
//剩余次数无限制或者拥有者没有被韧性眩晕
return (RemainingEndurance >0 || RemainingEndurance == -1) && Owner->CurrentTenacity > 0;
return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData.bActiveSkill;
}
void USkill::TickSkill(float deltaTime)
@ -62,18 +76,7 @@ void USkill::TickSkill(float deltaTime)
RemainingTime -= deltaTime * SkillData.Speed;
if (RemainingTime <= 0 )
{
RemainingTime = 0;
if (RemainingEndurance >0)
--RemainingEndurance;
FSkillContext context;
context.Self = Owner;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Execute(context);
}
RemainingTime = SkillData.CD;
OnSkillExecute.Broadcast(SkillData.SkillName.ToString());
ExecuteSkill();
}
if (RemainingEndurance == 0)
{
@ -84,6 +87,22 @@ void USkill::TickSkill(float deltaTime)
}
}
void USkill::ExecuteSkill()
{
RemainingTime = 0;
if (RemainingEndurance >0)
--RemainingEndurance;
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Execute(context);
}
RemainingTime = SkillData.CD;
OnSkillExecute.Broadcast(SkillData.SkillName.ToString());
}
FString USkill::GetSkillName() const
{
return SkillData.SkillName.ToString();;

View File

@ -20,7 +20,9 @@ class PROJECTFISH_API USkill : public UObject
GENERATED_BODY()
public:
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData);
void InitSkillTrigger();
void TickSkill(float deltaTime);
void ExecuteSkill();
FString GetSkillName() const;
class APawnWithSkill* GetOwner();

View File

@ -87,6 +87,24 @@ USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoin
return nullptr;
}
void USkillManager::OnAllSkillAdded()
{
//所有技能初始化后,初始化技能的触发器
for (auto Skill : Skills)
{
Skill->InitSkillTrigger();
}
}
class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag)
{
for (auto Skill : Skills)
{
if (Skill->GetSkillData().SkillTag == Tag)
return Skill;
}
return nullptr;
}
void USkillManager::RemoveSkill(USkill* Skill)

View File

@ -20,14 +20,19 @@ public:
virtual bool IsTickable() const override;
virtual TStatId GetStatId() const override;
// UFUNCTION(BlueprintCallable)
// void InitPawns(TArray<APawnWithSkill*> Pawns);
UFUNCTION(BlueprintCallable)
void AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize);
UFUNCTION(BlueprintCallable)
USkill* AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos);
UFUNCTION(BlueprintCallable)
void OnAllSkillAdded();
UFUNCTION(BlueprintPure)
class USkill* GetSkillByTag(FGameplayTag Tag);
UFUNCTION(BlueprintCallable)
void RemoveSkill(class USkill *Skill);

View File

@ -0,0 +1,17 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SkillTrigger.h"
#include "Skill.h"
void USkillTrigger::Init_Implementation(FSkillContext context)
{
SkillContext = context;
}
void USkillTrigger::OnTrigger()
{
SkillContext.OwnerSkill->ExecuteSkill();
}

View File

@ -0,0 +1,26 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "ProjectFish/Definations.h"
#include "UObject/Object.h"
#include "SkillTrigger.generated.h"
/**
*
*/
UCLASS(Blueprintable)
class PROJECTFISH_API USkillTrigger : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintNativeEvent)
void Init(FSkillContext context);
UFUNCTION(BlueprintCallable)
void OnTrigger();
protected:
UPROPERTY(BlueprintReadOnly)
FSkillContext SkillContext;
};