本功能适用于边上有UI遮挡还想要剩余窗口能够完整显示
本功能参考
UE5 runtime模式下自定义视口大小和位置并跟随分辨率自适应缩放_ue runtime视口-CSDN博客
CustomGameViewSizeSub.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "CustomGameViewSizeSub.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnViewportResized);
/**
*
*/
UCLASS()
class XIAOMINGGAS_API UCustomGameViewSizeSub : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintAssignable, Category = "Delegate")
FOnViewportResized OnViewportResized;
public:
void ViewportResize(FViewport* Viewport, uint32 Size);
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
UFUNCTION(BlueprintCallable, Category = "Fun Tool")
void AdjustViewportSize(float ScaleX,float ScaleY,float OffsetLeft,float OffsetTap);
};
CustomGameViewSizeSub.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "CustomGameViewSizeSub.h"
#include "UnrealClient.h"
#include "Engine/Engine.h"
#include "Engine/GameViewportClient.h"
void UCustomGameViewSizeSub::ViewportResize(FViewport* Viewport, uint32 Size)
{
GEngine->GameViewport->Viewport->ViewportResizedEvent.AddUObject(this, &UCustomGameViewSizeSub::ViewportResize);
}
void UCustomGameViewSizeSub::Initialize(FSubsystemCollectionBase& Collection)
{
OnViewportResized.Broadcast();
}
void UCustomGameViewSizeSub::AdjustViewportSize(float ScaleX,float ScaleY,float OffsetLeft,float OffsetTap)
{
UE_LOG(LogTemp, Log, TEXT(" AdjustViewportSize "));
if (GEngine->GameViewport)
{
FVector2D ViewportSize;
GEngine->GameViewport->GetViewportSize(ViewportSize);
if (ViewportSize.X > 0 && ViewportSize.Y > 0)
{
//视口大小缩放
GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].SizeX = ScaleX / ViewportSize.X;
GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].SizeY = ScaleY / ViewportSize.Y;
//基于视口原点偏移,原点是左上角(0,0)
GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginX = OffsetLeft / ViewportSize.X;
GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginY = OffsetTap / ViewportSize.Y;
}
}
}
蓝图使用
Build.cs中添加 "SlateCore","Slate"
用于解决VS编译失败的问题
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","GameplayAbilities","GamePlayTags","GameplayTasks","UnrealEd","SlateCore","Slate" });
PrivateDependencyModuleNames.AddRange(new string[] { "SkeletalMeshUtilitiesCommon" });