修改背包UI

This commit is contained in:
997146918 2025-09-01 11:54:05 +08:00
parent cd4bf0109d
commit bd3961c614
30 changed files with 158 additions and 75 deletions

Binary file not shown.

View File

@ -1,4 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACoreUObject_002Fd_003APublic_002Fd_003AAssetRegistry_002Ff_003AAssetData_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003AEditor_002Fd_003APropertyEditor_002Fd_003APublic_002Ff_003APropertyCustomizationHelpers_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACoreUObject_002Fd_003APublic_002Fd_003AUObject_002Ff_003AUObjectBaseUtility_002Eh/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACoreUObject_002Fd_003APublic_002Fd_003AUObject_002Ff_003AUObjectBaseUtility_002Eh/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=72263A5F_002DD5F9_002D3915_002D8DA0_002DCD45C38A70E5_002Fdl_003ASource_003AF_0021_003FEpic_003FUE_005F5_002E5_003FEngine_003FSource_002Fd_003ARuntime_002Fd_003ACore_002Fd_003APublic_002Fd_003AMisc_002Ff_003AMTAccessDetector_002Eh/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@ -33,7 +33,7 @@ struct FBagSlot
/**
*
*/
UCLASS()
UCLASS(BlueprintType)
class PROJECTFISH_API UBagShapeAsset : public UDataAsset
{
GENERATED_BODY()

View File

@ -12,7 +12,7 @@
/**
*
*/
UCLASS()
UCLASS(BlueprintType)
class PROJECTFISH_API USkillAsset : public UDataAsset
{
GENERATED_BODY()

View File

@ -14,15 +14,68 @@
#include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.h"
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
// void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
// {
// this->Owner = owner;
// this->SkillManager = skillManager;
// this->SkillData = skillData;
// this->BagPosition = BagPos;
// this->RemainingTime = SkillData->CD;
// this->RemainingEndurance = SkillData->Endurance;
// for (auto effectData: SkillData->SkillEffects)
// {
// USkillEffect* skillEffect = nullptr ;
// switch (effectData.EffectType)
// {
// case ESkillEffectType::Damage:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Damage::StaticClass());
// break;
// case ESkillEffectType::Heal:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Heal::StaticClass());
// break;
// case ESkillEffectType::ModifyCooldown:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifyCD::StaticClass());
// break;
// case ESkillEffectType::Charge:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Charge::StaticClass());
// break;
// case ESkillEffectType::ModifySpeed:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifySpeed::StaticClass());
// break;
// case ESkillEffectType::SkillEnduranceRestore:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_SER::StaticClass());
// break;
// case ESkillEffectType::EnhanceFishRod:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
// break;
// case ESkillEffectType::EnhanceSkill:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
// break;
// case ESkillEffectType::DamageReduce:
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
// break;
// default:
// const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
// UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
// }
// if (IsValid(skillEffect))
// {
// skillEffect->InitSkillEffect(this, effectData);
// this->SkillEffects.Add(skillEffect);
// }
//
// }
// }
void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
{
this->Owner = owner;
this->SkillManager = skillManager;
this->SkillData = skillData;
this->BagPosition = BagPos;
this->RemainingTime = SkillData.CD;
this->RemainingEndurance = SkillData.Endurance;
for (auto effectData: skillData.SkillEffects)
this->SkillData = PlacedSkill.SkillAsset;
this->BagPosition = FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY);
this->RemainingTime = SkillData->CD;
this->RemainingEndurance = SkillData->Endurance;
for (auto effectData: SkillData->SkillEffects)
{
USkillEffect* skillEffect = nullptr ;
switch (effectData.EffectType)
@ -55,8 +108,8 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
break;
default:
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
}
if (IsValid(skillEffect))
{
@ -69,11 +122,11 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil
void USkill::InitSkillTrigger()
{
if (!SkillData.bActiveSkill)
if (!SkillData->bActiveSkill)
{
if (SkillData.SkillTrigger)
if (SkillData->SkillTrigger)
{
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData.SkillTrigger);
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData->SkillTrigger);
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
@ -91,13 +144,18 @@ void USkill::InitSkillTrigger()
bool USkill::SkillTickAble()
{
//剩余次数无限制或者拥有者没有被韧性眩晕
return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData.bActiveSkill;
return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData->bActiveSkill;
}
FIntPoint USkill::GetSkillSize()
{
return GetSkillSizeValue(SkillData->SkillSize);
}
void USkill::TickSkill(float deltaTime)
{
if (SkillTickAble())
RemainingTime -= deltaTime * SkillData.Speed;
RemainingTime -= deltaTime * SkillData->Speed;
if (RemainingTime <= 0 )
{
ExecuteSkill();
@ -126,16 +184,16 @@ void USkill::ExecuteSkill()
{
Effect->Execute(context);
}
RemainingTime = SkillData.CD;
OnSkillExecute.Broadcast(SkillData.SkillName.ToString());
RemainingTime = SkillData->CD;
OnSkillExecute.Broadcast(SkillData->SkillName.ToString());
}
FString USkill::GetSkillName() const
{
return SkillData.SkillName.ToString();;
return SkillData->SkillName.ToString();;
}
FSkillData& USkill::GetSkillData()
TObjectPtr<USkillAsset> USkill::GetSkillData()
{
return SkillData;
}
@ -145,7 +203,7 @@ FIntPoint USkill::GetBagPos()
return BagPosition;
}
void USkill::SetSkillData(FSkillData data)
void USkill::SetSkillData(TObjectPtr<USkillAsset> data)
{
SkillData = data;
OnSkillUpdate.Broadcast();
@ -158,8 +216,8 @@ void USkill::ApplyRemainingTimeOffset(int timeOffset)
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
{
if (SkillData.Endurance != -1)
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData.Endurance);
if (SkillData->Endurance != -1)
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData->Endurance);
}
class APawnWithSkill* USkill::GetOwner()

View File

@ -6,6 +6,7 @@
#include "SkillEffect.h"
#include "ProjectFish/Definations.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
#include "UObject/Object.h"
#include "Skill.generated.h"
@ -19,7 +20,8 @@ class PROJECTFISH_API USkill : public UObject
{
GENERATED_BODY()
public:
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos);
//void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos);
void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill);
void InitSkillTrigger();
void TickSkill(float deltaTime);
void ExecuteSkill();
@ -27,20 +29,23 @@ public:
FString GetSkillName() const;
class APawnWithSkill* GetOwner();
FSkillData& GetSkillData();
TObjectPtr<USkillAsset> GetSkillData();
TArray<USkillEffect*> GetAllSkillEffects()
{
return SkillEffects;
}
FIntPoint GetBagPos();
void SetSkillData( FSkillData SkillData);
void SetSkillData( TObjectPtr<USkillAsset> SkillData);
UFUNCTION(BlueprintCallable)
void ApplyRemainingTimeOffset(int timeOffset);
void ApplyRemainingRemainingEnduranceOffset(int Offset);
UFUNCTION(BlueprintPure)
bool SkillTickAble();
UFUNCTION(BlueprintPure)
FIntPoint GetSkillSize();
protected:
UPROPERTY(BlueprintAssignable)
FSkillUpdate OnSkillUpdate;
@ -48,7 +53,7 @@ protected:
FSkillExecute OnSkillExecute;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))
FSkillData SkillData;
TObjectPtr< USkillAsset> SkillData;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))
USkillManager* SkillManager;
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "技能效果"))

View File

@ -27,7 +27,7 @@ void USkillEffect::Execute(const FSkillContext& context)
}
else
{
strTargets += (Cast<USkill>(target))->GetSkillData().SkillName.ToString() + "|" ;
strTargets += (Cast<USkill>(target))->GetSkillData()->SkillName.ToString() + "|" ;
}
}
@ -35,7 +35,7 @@ void USkillEffect::Execute(const FSkillContext& context)
FString type = EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)) ;
UE_LOG(LogTemp, Warning, TEXT("技能:%s 拥有者: %s 目标: %s 效果: %s")
, *OwnerSkill->GetSkillData().SkillName.ToString()
, *OwnerSkill->GetSkillData()->SkillName.ToString()
,*OwnerSkill->GetOwner()->GetActorNameOrLabel()
,*strTargets
, *( GetSkillEffectDes()));
@ -62,7 +62,7 @@ TArray<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
for (auto skill: context.SkillManager->GetAllSkills())
{
if (effectData.SkillSelecter.ApplySkillTags.HasTag(skill->GetSkillData().SkillTag))
if (effectData.SkillSelecter.ApplySkillTags.HasTag(skill->GetSkillData()->SkillTag))
{
result.Add(skill);
}

View File

@ -21,7 +21,7 @@ void USkillEffect_ModifyCD::Execute(const FSkillContext& context)
{
//修改技能的冷却时间
USkill* skill = Cast<USkill>(target);
skill->GetSkillData().CD = FMath::Max(1, skill->GetSkillData().CD + effectData.EffectValue);
skill->GetSkillData()->CD = FMath::Max(1, skill->GetSkillData()->CD + effectData.EffectValue);
skill->ApplyRemainingTimeOffset(effectData.EffectValue);
}

View File

@ -22,13 +22,13 @@ void USkillEffect_ModifySpeed::Execute(const FSkillContext& context)
{
//修改技能的冷却倍率
USkill* skill = Cast<USkill>(target);
skill->GetSkillData().Speed = effectData.EffectValue;
skill->GetSkillData()->Speed = effectData.EffectValue;
//延时结束效果
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [&]()
{
UE_LOG(LogTemp, Log, TEXT("取消CD充能效果"));
skill->GetSkillData().Speed = 1;
skill->GetSkillData()->Speed = 1;
}, UKismetStringLibrary::Conv_StringToInt(effectData.ParamAddition), false); // 单次触发

View File

@ -3,6 +3,7 @@
#include "SkillManager.h"
#include "Skill.h"
#include "ProjectFish/DataAsset/BagConfigAsset.h"
void USkillManager::Tick(float DeltaTime)
{
@ -42,49 +43,64 @@ void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize)
// this->SkillPawns = Pawns;
// }
USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos)
// USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos)
// {
// TMap<FIntPoint, int32>* states = PawnBagState.Find(Pawn);
// FIntPoint BagSize = *PawnInfo.Find(Pawn);
// bool bAddAble = true;
// for (int y = 0; y < BagSize.Y; y++)
// {
// for (int x = 0; x < BagSize.X; x++)
// {
// bAddAble = true;
// for (int skillX = 0; skillX < data.SkillWeight.X; skillX++)
// {
// for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
// {
// if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
// || *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1)
// {
// bAddAble = false;
// }
// }
// }
// //满足条件
// if (bAddAble)
// {
// BagPos = FIntPoint(x, y);
// USkill* skill = NewObject<USkill>(this);
// skill->InitSkill(Pawn, this, data, BagPos);
// Skills.Add(skill);
// //设置占用状态
// for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
// {
// for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
// {
// states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill));
// }
// }
//
// return skill;
// }
// }
// }
//
// return nullptr;
// }
void USkillManager::AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn, TArray<USkill*>& SkillObjects,
TArray<FIntPoint>& BagPositions)
{
TMap<FIntPoint, int32>* states = PawnBagState.Find(Pawn);
FIntPoint BagSize = *PawnInfo.Find(Pawn);
bool bAddAble = true;
for (int y = 0; y < BagSize.Y; y++)
for (auto PlacedSkill: Bag->PlacedSkills)
{
for (int x = 0; x < BagSize.X; x++)
{
bAddAble = true;
for (int skillX = 0; skillX < data.SkillWeight.X; skillX++)
{
for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
{
if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
|| *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1)
{
bAddAble = false;
}
}
}
//满足条件
if (bAddAble)
{
BagPos = FIntPoint(x, y);
USkill* skill = NewObject<USkill>(this);
skill->InitSkill(Pawn, this, data, BagPos);
Skills.Add(skill);
//设置占用状态
for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
{
for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
{
states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill));
}
}
return skill;
}
}
USkill* skill = NewObject<USkill>(this);
skill->InitSkill(Pawn, this, PlacedSkill);
SkillObjects.Add(skill);
BagPositions.Add(FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY));
}
return nullptr;
}
void USkillManager::OnAllSkillAdded()
@ -100,7 +116,7 @@ class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag)
{
for (auto Skill : Skills)
{
if (Skill->GetSkillData().SkillTag == Tag)
if (Skill->GetSkillData()->SkillTag == Tag)
return Skill;
}
return nullptr;
@ -117,7 +133,7 @@ TArray<USkill*> USkillManager::GetSkillsAround(USkill* TargetSkill)
TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner());
FIntPoint BagPos = TargetSkill->GetBagPos();
FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner());
FSkillData data = TargetSkill->GetSkillData();
TObjectPtr<USkillAsset> data = TargetSkill->GetSkillData();
int beginX = FMath::Max(0, BagPos.X- 1);
int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1);
int beginY = FMath::Max(0, BagPos.Y - 1);

View File

@ -24,9 +24,12 @@ public:
UFUNCTION(BlueprintCallable)
void AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize);
// UFUNCTION(BlueprintCallable)
// USkill* AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos);
UFUNCTION(BlueprintCallable)
USkill* AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos);
void AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn,
TArray<USkill*>& SkillObjects, TArray<FIntPoint>& BagPositions);
UFUNCTION(BlueprintCallable)
void OnAllSkillAdded();