Compare commits

..

No commits in common. "31311ad092e610224a81637e140bd1fb301868fc" and "c3e1ed07624433a6d4e156c4e5f61730e596b4b8" have entirely different histories.

39 changed files with 4 additions and 464 deletions

Binary file not shown.

View File

@ -43,7 +43,6 @@ 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);
} }
} }
} }
@ -62,7 +61,6 @@ 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;
} }
} }
} }
@ -72,32 +70,6 @@ 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)
{ {
@ -171,7 +143,6 @@ 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,8 +115,6 @@ 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")
@ -144,5 +142,4 @@ public:
private: private:
int32 NextItemID = 0; int32 NextItemID = 0;
TMap<FIntPoint, bool> SlotInUsing; TMap<FIntPoint, bool> SlotInUsing;
TMap<FIntPoint, int32> SlotItems;
}; };

View File

@ -48,8 +48,4 @@ 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,35 +2,3 @@
#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(EditAnywhere, BlueprintReadOnly, Category = fish, meta = (ToolTip = "鱼的ID")) UPROPERTY(VisibleAnywhere, 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 = MaxQuestID + 1; QuestID += 1;
} }
} }
#endif #endif

View File

@ -102,22 +102,3 @@ 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,12 +29,6 @@ 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

@ -1,53 +0,0 @@
// 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

@ -1,32 +0,0 @@
// 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", "UMG", "Slate" ,"SlateCore"}); "InputCore", "NavigationSystem", "AIModule", "Niagara", "EnhancedInput", "GameplayTags", "DeveloperSettings" });
} }
} }

View File

@ -1,116 +0,0 @@
// 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

@ -1,39 +0,0 @@
// 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

@ -1,16 +0,0 @@
// 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

@ -1,56 +0,0 @@
// 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,7 +11,6 @@
#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"
@ -65,11 +64,6 @@ 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

@ -1,27 +0,0 @@
// 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

@ -1,22 +0,0 @@
// 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;
};