// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "ProjectFish/Definations.h" #include "SkillAsset.h" #include "BagConfigAsset.generated.h" class UShapeAsset; //背包中摆放的技能信息 USTRUCT(BlueprintType) struct FPlacedSkillInfo { GENERATED_BODY() // 技能对象引用 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill") TObjectPtr< USkillAsset> SkillAsset; // 技能在背包中的位置X UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position") int32 PositionX; // 技能在背包中的位置Y UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position") int32 PositionY; FPlacedSkillInfo() { SkillAsset = nullptr; PositionX = 0; PositionY = 0; } FPlacedSkillInfo(USkillAsset* InSkillAsset, int32 InX, int32 InY) { SkillAsset = InSkillAsset; PositionX = InX; PositionY = InY; } FIntPoint GetSkillSize() { return GetSkillSizeValue(SkillAsset->SkillSize); } // 检查技能是否占用指定位置 bool OccupiesPosition(int32 X, int32 Y) const { if (!SkillAsset) { return false; } return X >= PositionX && X < (PositionX + GetSkillSizeValue(SkillAsset->SkillSize).X) && Y >= PositionY && Y < (PositionY + GetSkillSizeValue(SkillAsset->SkillSize).Y); } }; /** * */ UCLASS(BlueprintType) class PROJECTFISH_API UBagConfigAsset : public UDataAsset { GENERATED_BODY() public: // 背包形状资源引用 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BagConfig") TObjectPtr BagShapeAsset; // 背包中放置的技能列表 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagConfig") TArray PlacedSkills; // 添加技能到背包 UFUNCTION(BlueprintCallable, Category = "BagConfig") bool AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY); // 移除技能 UFUNCTION(BlueprintCallable, Category = "BagConfig") bool RemoveSkill(int32 SkillIndex); UFUNCTION(BlueprintCallable, Category = "BagConfig") void RemoveSkillAsset(class USkillAsset* SkillAsset); // 检查技能是否可以放置在指定位置 UFUNCTION(BlueprintCallable, Category = "BagConfig") bool CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf = false) const; // 获取指定位置的技能索引 UFUNCTION(BlueprintCallable, Category = "BagConfig") int32 GetSkillAtPosition(int32 X, int32 Y) const; // 获取技能总数 UFUNCTION(BlueprintCallable, Category = "BagConfig") int32 GetSkillCount() const { return PlacedSkills.Num(); } // 清除所有技能 UFUNCTION(BlueprintCallable, Category = "BagConfig") void ClearAllSkills(); private: // 检查技能之间是否有重叠 bool CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf = false) const; // 检查技能是否在背包形状范围内 bool IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const; };