Compare commits

...

10 Commits

39 changed files with 464 additions and 4 deletions

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.

View File

@ -43,6 +43,7 @@ int32 UContainerInfo::AddContainerItem(FContainerItem Item)
if (Item.IsSlotUsing(FIntPoint(x, y))) if (Item.IsSlotUsing(FIntPoint(x, y)))
{ {
SlotInUsing.Add(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y), true); SlotInUsing.Add(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y), true);
SlotItems.Add(FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y), ItemID);
} }
} }
} }
@ -61,6 +62,7 @@ bool UContainerInfo::RemoveContainerItem(const int32& ItemID)
if (Item.IsSlotUsing(FIntPoint(x, y ))) if (Item.IsSlotUsing(FIntPoint(x, y )))
{ {
SlotInUsing[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] = false; SlotInUsing[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] = false;
SlotItems[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] = -1;
} }
} }
} }
@ -70,6 +72,32 @@ bool UContainerInfo::RemoveContainerItem(const int32& ItemID)
return false; return false;
} }
TSet<int32> UContainerInfo::GetOverlapOtherItem(FContainerItem Item)
{
TSet<int32> OverlapItems;
if (IsItemInContainerShape(Item))
{
for (int x = 0; x < Item.GetItemWIdth(); x++)
{
for (int y = 0; y < Item.GetItemHeight(); y++)
{
if (Item.IsSlotUsing(FIntPoint(x, y)))
{
if (ContainerShape->IsSlotActive(Item.ContainerStartPos.X + x, Item.ContainerStartPos.Y + y) &&
SlotItems[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] != -1
)
{
OverlapItems.Add(SlotItems[FIntPoint(x + Item.ContainerStartPos.X, y + Item.ContainerStartPos.Y)] );
}
}
}
}
}
return OverlapItems;
}
bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem) bool UContainerInfo::IsItemOverlapOtherItem(FContainerItem NewItem)
{ {
@ -143,6 +171,7 @@ bool UContainerInfo::LoadFromSaveData(FPrimaryAssetId ShapeID, const TArray<FCon
// 清空当前数据 // 清空当前数据
Items.Empty(); Items.Empty();
SlotInUsing.Empty(); SlotInUsing.Empty();
SlotItems.Empty();
//从存档中加载仓库形状 //从存档中加载仓库形状
FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(ShapeID); FSoftObjectPath ShipShapePath = UAssetManager::Get().GetPrimaryAssetPath(ShapeID);
UShapeAsset* ShapeAsset = Cast<UShapeAsset>(ShipShapePath.TryLoad()); UShapeAsset* ShapeAsset = Cast<UShapeAsset>(ShipShapePath.TryLoad());

View File

@ -115,6 +115,8 @@ public:
int32 AddContainerItem(FContainerItem Item); int32 AddContainerItem(FContainerItem Item);
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)
bool RemoveContainerItem(const int32& ItemID); bool RemoveContainerItem(const int32& ItemID);
UFUNCTION(BlueprintPure)
TSet<int32> GetOverlapOtherItem(FContainerItem Item);
// 获取存档数据 // 获取存档数据
UFUNCTION(BlueprintCallable, Category = "ContainerInfo") UFUNCTION(BlueprintCallable, Category = "ContainerInfo")
@ -142,4 +144,5 @@ public:
private: private:
int32 NextItemID = 0; int32 NextItemID = 0;
TMap<FIntPoint, bool> SlotInUsing; TMap<FIntPoint, bool> SlotInUsing;
TMap<FIntPoint, int32> SlotItems;
}; };

View File

@ -48,4 +48,8 @@ public:
// 任务存档数据 // 任务存档数据
UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "任务存档数据")) UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "任务存档数据"))
TArray<FQuestSaveData> QuestSaveData; TArray<FQuestSaveData> QuestSaveData;
//已战胜的鱼
UPROPERTY(SaveGame, BlueprintReadWrite, meta = (ToolTip = "被击败的鱼"))
TArray<int32> Fish_defeated_IDS;
}; };

View File

@ -2,3 +2,35 @@
#include "FishInfoConfigAsset.h" #include "FishInfoConfigAsset.h"
#include "AssetRegistry/AssetRegistryModule.h"
void UFishInfoConfigAsset::PostDuplicate(bool bDuplicateForPIE)
{
Super::PostDuplicate(bDuplicateForPIE);
if (!bDuplicateForPIE)
{
int32 MaxFishID = 0;
// 获取资产注册表模块
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
// 查找所有 QuestAsset 资产
TArray<FAssetData> AssetDataList;
AssetRegistry.GetAssetsByClass(UFishInfoConfigAsset::StaticClass()->GetClassPathName(), AssetDataList, true);
// 遍历所有已存在的任务资产,找到最大的 QuestID
for (const FAssetData& AssetData : AssetDataList)
{
if (UFishInfoConfigAsset* FishAsset = Cast<UFishInfoConfigAsset>(AssetData.GetAsset()))
{
if (FishAsset->FishID > MaxFishID)
{
MaxFishID = FishAsset->FishID;
}
}
}
FishID = MaxFishID + 1;
}
}

View File

@ -15,9 +15,9 @@ class PROJECTFISH_API UFishInfoConfigAsset : public UDataAsset
{ {
GENERATED_BODY() GENERATED_BODY()
//virtual void PostDuplicate(bool bDuplicateForPIE) override; virtual void PostDuplicate(bool bDuplicateForPIE) override;
public: public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = fish, meta = (ToolTip = "鱼的ID")) UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = fish, meta = (ToolTip = "鱼的ID"))
int32 FishID; int32 FishID;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = fish, meta = (ToolTip = "鱼的名称")) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = fish, meta = (ToolTip = "鱼的名称"))

View File

@ -81,7 +81,7 @@ void UQuestAsset::PostDuplicate(bool bDuplicateForPIE)
} }
} }
} }
QuestID += 1; QuestID = MaxQuestID + 1;
} }
} }
#endif #endif

View File

@ -102,3 +102,22 @@ void UGameInfoManager::CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, US
SaveGameInfo(); SaveGameInfo();
} }
bool UGameInfoManager::IsFishDefeated(int32 FishID)
{
if (!IsValid(PlayerInfo))
{
return false;
}
return PlayerInfo->Fish_defeated_IDS.Contains(FishID);
}
void UGameInfoManager::AddDefeatedFish(int32 FishID)
{
if (!IsValid(PlayerInfo))
{
PlayerInfo = NewObject<UPlayerInfoSaveGame>(this);
}
PlayerInfo->Fish_defeated_IDS.Add(FishID);
SaveGameInfo();
}

View File

@ -29,6 +29,12 @@ public:
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape); void CreateGameInfoAndSave(UShapeAsset* ShipContainerShape, UShapeAsset* PlayerContainerShape);
UFUNCTION(BlueprintPure)
bool IsFishDefeated(int32 FishID);
UFUNCTION(BlueprintCallable)
void AddDefeatedFish(int32 FishID);
protected: protected:
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)
TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo; TObjectPtr<class UPlayerInfoSaveGame> PlayerInfo;

View File

@ -0,0 +1,53 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "UIManagerSubsystem.h"
#include "ProjectFish/Widget/DragableUserWidget.h"
#include "Framework/Application/SlateApplication.h"
#include "Components/CanvasPanelSlot.h"
void UUIManagerSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
FSlateApplication& SlateApp = FSlateApplication::Get();
SlateApp.OnApplicationMousePreInputButtonDownListener().AddUObject(this, &UUIManagerSubsystem::OnMouseButtonDown);
}
void UUIManagerSubsystem::AddDragWidget(UDragableUserWidget* UserWidget)
{
UserWidget->AddToViewport();
UserWidget->SetVisibility(ESlateVisibility::HitTestInvisible);
DragDropWidget = MakeWeakObjectPtr(UserWidget);
}
void UUIManagerSubsystem::RemoveDragWidget()
{
if (DragDropWidget.IsValid())
{
DragDropWidget->RemoveFromViewport();
}
DragDropWidget.Reset();
}
UDragableUserWidget* UUIManagerSubsystem::GetDragWidget()
{
if (DragDropWidget.IsValid())
{
return DragDropWidget.Get();
}
return nullptr;
}
void UUIManagerSubsystem::OnMouseButtonDown(const FPointerEvent& PointerEvent)
{
if (DragDropWidget.IsValid())
{
if (PointerEvent.GetEffectingButton() == EKeys::RightMouseButton)
{
DragDropWidget->OnMouseButtonDownWhenDragging(PointerEvent);
}
}
}

View File

@ -0,0 +1,32 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Widgets/SWidget.h"
#include "Blueprint/UserWidget.h"
#include "UIManagerSubsystem.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISH_API UUIManagerSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void AddDragWidget(class UDragableUserWidget* UserWidget);
UFUNCTION(BlueprintCallable, Category = "UIManagerSubsystem")
void RemoveDragWidget();
UFUNCTION(BlueprintPure, Category = "UIManagerSubsystem")
UDragableUserWidget* GetDragWidget();
void OnMouseButtonDown(const FPointerEvent& PointerEvent);
protected:
TWeakObjectPtr<class UDragableUserWidget> DragDropWidget;
};

View File

@ -9,6 +9,6 @@ public class ProjectFish : ModuleRules
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
OptimizeCode = CodeOptimization.Never; OptimizeCode = CodeOptimization.Never;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine",
"InputCore", "NavigationSystem", "AIModule", "Niagara", "EnhancedInput", "GameplayTags", "DeveloperSettings" }); "InputCore", "NavigationSystem", "AIModule", "Niagara", "EnhancedInput", "GameplayTags", "DeveloperSettings", "UMG", "Slate" ,"SlateCore"});
} }
} }

View File

@ -0,0 +1,116 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "DragableUserWidget.h"
#include "Blueprint/WidgetLayoutLibrary.h"
#include "Components/CanvasPanelSlot.h"
#include "ProjectFish/Gameplay/Subsystem/UIManagerSubsystem.h"
void UDragableUserWidget::SetWidgetDragable(bool Dragable)
{
bDragable = Dragable;
}
void UDragableUserWidget::BeginDrag(const FGeometry& InGeometry)
{
bDraging = true;
//OriginWidgetScreenPos = InGeometry.GetAbsolutePosition();
UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>();
UIManager->AddDragWidget(this);
}
void UDragableUserWidget::EndDrag()
{
//取消拖拽 不处理点击事件
bDraging = false;
UUIManagerSubsystem* UIManager = GetGameInstance()->GetSubsystem<UUIManagerSubsystem>();
UIManager->RemoveDragWidget();
}
// FReply UDragableUserWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// if (bDragable && InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
// {
// if (!bDraging)
// {
// BeginDrag(InGeometry);
// return FReply::Unhandled();
// }
// }
// else
// {
// return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
// }
// return FReply::Unhandled();
// }
//
// FReply UDragableUserWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent);
// }
//
// FReply UDragableUserWidget::NativeOnMouseMove(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
// {
// if (bDraging)
// {
// Super::NativeOnMouseMove(InGeometry, InMouseEvent);
//
// // 获取鼠标在屏幕空间的绝对坐标
// FVector2D MouseScreenPos = InMouseEvent.GetScreenSpacePosition();
//
// // 获取Widget在屏幕上的实际渲染尺寸
//
// FVector2D WidgetAbsoluteSize = InGeometry.GetDrawSize();
//
// // 计算Widget中心点应对应的屏幕位置
// FVector2D DesiredCenter = MouseScreenPos;
//
// // 计算新的左上角位置(让中心点对准鼠标)
// FVector2D NewTopLeft =FVector2D(DesiredCenter.X - WidgetAbsoluteSize.X * 0.5f, DesiredCenter.Y - WidgetAbsoluteSize.Y* 0.5f ); ;
//
// // 边界检查
// FVector2D ViewportSize;
// if (GEngine && GEngine->GameViewport)
// {
// GEngine->GameViewport->GetViewportSize(ViewportSize);
// }
// else
// {
// ViewportSize = FVector2D(1920, 1080);
// }
//
// // 确保Widget不会完全移出屏幕
// NewTopLeft.X = FMath::Clamp(NewTopLeft.X, 0.0f, ViewportSize.X - WidgetAbsoluteSize.X);
// NewTopLeft.Y = FMath::Clamp(NewTopLeft.Y, 0.0f, ViewportSize.Y - WidgetAbsoluteSize.Y);
//
// // // 计算相对于原始位置的偏移量
// // FVector2D ParentAbsolutePosition = FVector2D::ZeroVector;
// // if (InGeometry.GetParentGeometry().IsValid())
// // {
// // ParentAbsolutePosition = InGeometry.GetParentGeometry().GetAbsolutePosition();
// // }
// //
// FVector2D LocalOffset = NewTopLeft - OriginWidgetScreenPos;
//
// // 应用变换
// FWidgetTransform WidgetTransform = GetRenderTransform();
// WidgetTransform.Translation = LocalOffset/InGeometry.Scale;
// SetRenderTransform(WidgetTransform);
//
// // FString Scale = FString::Printf(TEXT("%.0f"), InGeometry.Scale);
// // UE_LOG(LogTemp, Warning, TEXT("Mouse: %s, CurrentWidgetScreenPos: %s, WidgetAbsoluteSize: %s NewTopLeft : %s LocalOffset : %s Scale = %s"),
// // *MouseScreenPos.ToString(),
// // *OriginWidgetScreenPos.ToString(),
// // *WidgetAbsoluteSize.ToString(),
// // *NewTopLeft.ToString(),
// // *LocalOffset.ToString(),
// // *Scale
// // );
//
// return FReply::Unhandled();
// }
// else
// return Super::NativeOnMouseMove(InGeometry, InMouseEvent);
// }

View File

@ -0,0 +1,39 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "DragableUserWidget.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISH_API UDragableUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void SetWidgetDragable(bool Dragable);
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void BeginDrag(const FGeometry& InGeometry);
UFUNCTION(BlueprintCallable, Category = "Dragable Widget")
void EndDrag();
UFUNCTION(BlueprintImplementableEvent, Category = "Dragable Widget")
void OnMouseButtonDownWhenDragging(const FPointerEvent& PointerEvent);
// virtual FReply NativeOnMouseButtonDown( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
// virtual FReply NativeOnMouseButtonUp( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
// virtual FReply NativeOnMouseMove( const FGeometry& InGeometry, const FPointerEvent& InMouseEvent ) override;
protected:
UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ExposeOnSpawn = true))
bool bDragable;
UPROPERTY(BlueprintReadOnly)
bool bDraging;
FVector2D OriginWidgetScreenPos;
};

View File

@ -0,0 +1,16 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "AssetActions/FishInfoAssetAction.h"
#include "ProjectFish/DataAsset/FishInfoConfigAsset.h"
UClass* FFishInfoAssetAction::GetSupportedClass() const
{
return UFishInfoConfigAsset::StaticClass();
}
uint32 FFishInfoAssetAction::GetCategories()
{
return MyAssetCategory;
}

View File

@ -0,0 +1,56 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Factory/FishInfoConfigAssetFactory.h"
#include "ProjectFish/DataAsset/QuestAsset.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "AssetRegistry/AssetData.h"
#include "ProjectFish/DataAsset/FishInfoConfigAsset.h"
UFishInfoConfigAssetFactory::UFishInfoConfigAssetFactory()
{
SupportedClass = UFishInfoConfigAsset::StaticClass();
bCreateNew = true;
bEditAfterNew = true;
}
UObject* UFishInfoConfigAssetFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags,
UObject* Context, FFeedbackContext* Warn)
{
UFishInfoConfigAsset* NewFishAsset = NewObject<UFishInfoConfigAsset>(InParent, Class, Name, Flags | RF_Transactional);
// 自动生成唯一的 QuestID
if (NewFishAsset)
{
int32 MaxFishID = 0;
// 获取资产注册表模块
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
// 查找所有 QuestAsset 资产
TArray<FAssetData> AssetDataList;
AssetRegistry.GetAssetsByClass(UFishInfoConfigAsset::StaticClass()->GetClassPathName(), AssetDataList, true);
// 遍历所有已存在的任务资产,找到最大的 QuestID
for (const FAssetData& AssetData : AssetDataList)
{
if (UFishInfoConfigAsset* FishAsset = Cast<UFishInfoConfigAsset>(AssetData.GetAsset()))
{
if (FishAsset->FishID > MaxFishID)
{
MaxFishID = FishAsset->FishID;
}
}
}
NewFishAsset->FishID = MaxFishID + 1;
}
return NewFishAsset;
}
bool UFishInfoConfigAssetFactory::ShouldShowInNewMenu() const
{
return true;
}

View File

@ -11,6 +11,7 @@
#include "ProjectFish/DataAsset/BagConfigAsset.h" #include "ProjectFish/DataAsset/BagConfigAsset.h"
#include "../Public/Thumbnail/ShapeAssetThumbnailRenderer.h" #include "../Public/Thumbnail/ShapeAssetThumbnailRenderer.h"
#include "../Public/Thumbnail/BagConfigThumbnailRenderer.h" #include "../Public/Thumbnail/BagConfigThumbnailRenderer.h"
#include "AssetActions/FishInfoAssetAction.h"
#define LOCTEXT_NAMESPACE "FProjectFishEditorModule" #define LOCTEXT_NAMESPACE "FProjectFishEditorModule"
@ -64,6 +65,11 @@ void FProjectFishEditorModule::RegisterAssetTypeActions()
TSharedRef<FAssetTypeActions_Base> QuestAssetAction = MakeShareable(new FQuestAssetTypeAction(BogShapeAssetCategory)); TSharedRef<FAssetTypeActions_Base> QuestAssetAction = MakeShareable(new FQuestAssetTypeAction(BogShapeAssetCategory));
AssetTools.RegisterAssetTypeActions(QuestAssetAction); AssetTools.RegisterAssetTypeActions(QuestAssetAction);
CreatedAssetTypeActions.Add(QuestAssetAction); CreatedAssetTypeActions.Add(QuestAssetAction);
//注册鱼类配置资源菜单
TSharedRef<FAssetTypeActions_Base> FishInfoAssetAction = MakeShareable(new FFishInfoAssetAction(BogShapeAssetCategory));
AssetTools.RegisterAssetTypeActions(FishInfoAssetAction);
CreatedAssetTypeActions.Add(FishInfoAssetAction);
} }
void FProjectFishEditorModule::UnregisterAssetTypeActions() void FProjectFishEditorModule::UnregisterAssetTypeActions()

View File

@ -0,0 +1,27 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AssetTypeActions_Base.h"
/**
*
*/
class PROJECTFISHEDITOR_API FFishInfoAssetAction : public FAssetTypeActions_Base
{
public:
FFishInfoAssetAction(EAssetTypeCategories::Type InAssetCategory)
: MyAssetCategory(InAssetCategory)
{
}
virtual FText GetName() const override { return FText::FromString("FishInfo Asset"); }
virtual FColor GetTypeColor() const override { return FColor(255, 215, 0); } // 金色
virtual UClass* GetSupportedClass() const override;
virtual uint32 GetCategories() override;
virtual bool CanFilter() override { return true; }
private:
EAssetTypeCategories::Type MyAssetCategory;
};

View File

@ -0,0 +1,22 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Factories/Factory.h"
#include "FishInfoConfigAssetFactory.generated.h"
/**
*
*/
UCLASS()
class PROJECTFISHEDITOR_API UFishInfoConfigAssetFactory : public UFactory
{
GENERATED_BODY()
public:
UFishInfoConfigAssetFactory();
// UFactory interface
virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
virtual bool ShouldShowInNewMenu() const override;
};