三、DPI屏幕适配

项目设置

项目设置 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屏幕适配的一种方法。

Guess you like

Origin blog.csdn.net/m0_51032168/article/details/121451720