项目设置
项目设置 DPI Scaling可以通过添加DPI Curve 关键帧来控制缩放比例
缩放规则在DPIScaleRule里面设置
UE4C++实现
MenuController改下输入模式
SlAiMenuController.cpp
InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
MenuStyle添加画刷
SlAiMenuWidgetStyle.h
/*
* 指定Menu的背景图片
*/
UPROPERTY(EditAnywhere, Category = Menu)
FSlateBrush MenuBackgroundBrush;
SlAiMenuHUDWidget.h
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class SLAICOURSE_API SSlAiMenuHUDWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSlAiMenuHUDWidget)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
private:
//绑定UIScaler
float GetUIScaler() const;
//获取屏幕尺寸
FVector2D GetViewportSize() const;
private:
//获取Menu样式
const struct FSlAiMenuStyle* MenuStyle;
//DPI缩放系数
TAttribute<float> UIScaler;
};
SlAiMenuHUDWidget.cpp
#include "SSlAiMenuHUDWidget.h"
#include "SlateOptMacros.h"
#include"SButton.h"
#include"SImage.h"
#include "SlAiStyle.h"
#include "SlAiMenuWidgetStyle.h"
#include"Engine/Engine.h"
#include"SDPIScaler.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiMenuHUDWidget::Construct(const FArguments& InArgs)
{
//获取编辑器的MenuStyle
//BPSlAiMenuStyle 要获取的资源名称
//MenuStyle 将引用Game/UI/Style/BPSlAiMenuStyle
MenuStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiMenuStyle>("BPSlAiMenuStyle");
//绑定缩放规则方法
UIScaler.Bind(this, &SSlAiMenuHUDWidget::GetUIScaler);
ChildSlot
[
SNew(SDPIScaler)
.DPIScale(UIScaler)
[
SNew(SOverlay)
+ SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SImage)
.Image(&MenuStyle->MenuHUDBackgroundBrush)
]
+ SOverlay::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SNew(SImage)
.Image(&MenuStyle->MenuBackgroundBrush)
]
]
];
}
float SSlAiMenuHUDWidget::GetUIScaler() const
{
//通过调整屏幕尺寸的高来改变UIScaler
return GetViewportSize().Y / 1080.f;
}
//获取视口屏幕尺寸然后返回
FVector2D SSlAiMenuHUDWidget::GetViewportSize() const
{
FVector2D Result(1920, 1080);
if (GEngine && GEngine->GameViewport)
GEngine->GameViewport->GetViewportSize(Result);
return Result;
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
运行如下:
float SSlAiMenuHUDWidget::GetUIScaler() const
{
//通过调整屏幕尺寸的高来改变UIScaler
return GetViewportSize().Y / 1080.f;
}
调整界面的Y(高)才会改变UIScaler,
提供了自定义DPI屏幕适配的一种方法。