Compare commits
4 Commits
220ea3a481
...
f9674f5445
| Author | SHA1 | Date | |
|---|---|---|---|
| f9674f5445 | |||
| cb74c13494 | |||
| 253df874a3 | |||
| 0513ccc3d7 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ProjectFish/Content/Maps/TestDrag.umap
Normal file
BIN
ProjectFish/Content/Maps/TestDrag.umap
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ProjectFish/Content/UI/Common/TestWindow.uasset
Normal file
BIN
ProjectFish/Content/UI/Common/TestWindow.uasset
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ProjectFish/Content/UI/TestUI/TestA.uasset
Normal file
BIN
ProjectFish/Content/UI/TestUI/TestA.uasset
Normal file
Binary file not shown.
BIN
ProjectFish/Content/UI/TestUI/TestB.uasset
Normal file
BIN
ProjectFish/Content/UI/TestUI/TestB.uasset
Normal file
Binary file not shown.
BIN
ProjectFish/Content/UI/TestUI/TestDragUI.uasset
Normal file
BIN
ProjectFish/Content/UI/TestUI/TestDragUI.uasset
Normal file
Binary file not shown.
BIN
ProjectFish/Content/UI/TestUI/TestWindow.uasset
Normal file
BIN
ProjectFish/Content/UI/TestUI/TestWindow.uasset
Normal file
Binary file not shown.
@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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;
|
||||||
|
|
||||||
|
};
|
||||||
@ -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"});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
116
ProjectFish/Source/ProjectFish/Widget/DragableUserWidget.cpp
Normal file
116
ProjectFish/Source/ProjectFish/Widget/DragableUserWidget.cpp
Normal 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);
|
||||||
|
// }
|
||||||
39
ProjectFish/Source/ProjectFish/Widget/DragableUserWidget.h
Normal file
39
ProjectFish/Source/ProjectFish/Widget/DragableUserWidget.h
Normal 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;
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user