UE5 runtime模式下自定义视口大小和位置并跟随分辨率自适应缩放

本文旨在解决因UI问题导致屏幕中心位置不对的问题
处理前的现象:如果四周UI透明度都为1,那么方块的位置就不太对,没在中心

处理后的现象:

解决办法:自定义大小和视口偏移
创建一个基于子系统的类或者蓝图函数库(什么类不重要,你调的到就行)
.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"

/**
 * 
 */
class FViewport;

//定义当视口大小发生变化时的代理
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnViewportResized);

UCLASS()
class CUSTOMGAMEVIEWSIZE_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(FMargin margin);
};

 .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::Initialize(FSubsystemCollectionBase& Collection)
{
    GEngine->GameViewport->Viewport->ViewportResizedEvent.AddUObject(this, &UCustomGameViewSizeSub::ViewportResize);
}

void UCustomGameViewSizeSub::ViewportResize(FViewport* Viewport, uint32 Size)
{
    OnViewportResized.Broadcast();
}

void UCustomGameViewSizeSub::AdjustViewportSize(FMargin margin)
{
    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 = margin.Right / ViewportSize.X;
            GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].SizeY = margin.Bottom / ViewportSize.Y;
            //基于视口原点偏移,原点是左上角(0,0)
            GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginX = margin.Left / ViewportSize.X;
            GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginY = margin.Top / ViewportSize.Y;
        }
    }
}

UMG设计图:
 逻辑实现:

最终效果:
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表对象的封装

前言 前面我自己写了一个对链表对象的封装,现在看来,确实还得是大佬的封装思路更加完善 前言知识介绍 __init__方法 __init__方法是Python中的一个特殊方法,用于初始化一个新对象。当一个类的实例被创建时,__init__方法会被自…

【数据结构和算法】 K 和数对的最大数目

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:双指针排序 三、代码 3.1 方法一:双指针排序 3.2 方法二&#xff1…

107基于matlab的模糊推理系统(ANFIS)的时间序列预测

基于matlab的模糊推理系统(ANFIS)的时间序列预测,输出训练集、测试集和预测数据结果,数据可更换自己的,程序已调通,可直接运行。 107 时间序列预测模糊推理系统 (xiaohongshu.com)

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩,看目录,平均3-5题 文章目录 A/B2023真题(2023-19)-A-选项特点:两个等号;-判断需联立的难易:难,看着感觉需要联立,所以判断联立需要有理论支撑,不然还…

QT qAbs()、qRound()

1.qAbs qAbs:原型为 T qAbs(const T &value) 返回输入参数对应类型的绝对值,其中T为输入参数类型,也就是可以返回多种类型(int,float,double型) 代码示例: int d -1; float b -3.14; double c -4.36;int a_…

具有超低功耗性能的R7F102GAC3CSP、R7F102GAC2DSP、R7F102G6C3CSP RL78/G22微控制器 16-bit MCU

RL78/G22 简介: 除了具有低电流消耗(CPU工作时:37.5μA/MHz;STOP时:200nA)外,RL78/G22微控制器还配备了丰富的电容触摸通道。完备的16-48引脚封装和32KB-64KB闪存,扩充了新一代RL78…

PMP认证需要多少钱?

PMP认证费太贵?这些可以省下来! 学习PMP认证到拿证的过程中一共有两个地方需要有费用支出,第一是PMP培训费用,第二就是PMP考试费用。 为什么一定要参加培训?这是PMI的考试条件中要求的,任何考生都需要有35学…

【C++】开源:ImGui图形用户界面库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍ImGui图形用户界面库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…

【递归 回溯】LeetCode-226. 翻转二叉树

226. 翻转二叉树。 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出&#xf…

实战篇:一文讲清楚电商平台用户评价分析

01 明确问题 随着电商平台的成熟,如何提升用户体验、提高客户留存率也成为了电商平台关注的重点。而用户评价是最直观地能反应用户体验的指标。用户差评更是其中的重点,通过差评分析,可以寻找到平台目前存在的可能导致用户打出差评的因素&am…

机器学习——特征选择(一)

【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。 1、简介 特征选择,又称变量选择、属性选择或变量子集选择,是选择相关特征子集用于模型构造的过程。简要地说,通过检测相关特征。摒弃冗余特征…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

脉冲水表作用有哪些?

脉冲水表是一种新型的水表,它通过检测水流量并发送脉冲信号来计量用水量。与传统的机械水表相比,脉冲水表具有许多优势和作用。 首先,脉冲水表具有高精度和可靠性。传统的机械水表在长期使用过程中会因磨损而导致计量不准确,而脉冲…

【强化学习】Deep Q Learning

Deep Q Learning 在前两篇文章中,我们发现RL模型的目标是基于观察空间 (observations) 和最大化奖励和 (maximumize sum rewards) 的。 如果我们能够拟合出一个函数 (function) 来解决上述问题,那就可以避免存储一个 (在Double Q-Learning中甚至是两个…

Redis介绍与使用

1、Nosql 1.1 数据存储的发展 1.1.1 只使用Mysql 以前的网站访问量不大,单个数据库是完全够用的。 但是随着互联网的发展,就出现了很多的问题: 数据量太大,服务器放不下 访问量太大,服务器也承受不了 1.1.2 缓存…

STL stack练习

CSTL之stack栈容器 - 数据结构教程 - C语言网CSTL之stack栈容器1.再谈栈回顾一下之前所学的栈,栈是一种先进后出的数据结构,而实现方式需要创建多个结构体,通过链式的方式进行实现,这是标准的栈的思路,而在STL中栈可以…

ctfshow(web190-web200)

目录 web190 web191 web192 web193 web194 web195 web196 web197 web198 web199 web200 web190 为什么要有admin呢 这也是试出来的 这个admin必须是数据库中存在的 这样才能使用布尔注入 因为这个时候登录 有两种返回结果 一种密码错误 一种就是用户名错误 admin an…

HBase 整合 Phoenix

目录 一、Phoenix 简介 1.1 Phoenix定义 1.2 为什么使用 Phoenix 二、Phoenix 快速入门 2.1 安装部署 Phoenix 2.1.1 上传并解压 tar 包 2.1.2 复制 server 包并拷贝到各个节点的 hbase/lib 2.1.3 配置环境变量 2.1.4 重启 HBase 2.1.5 连接 Phoenix 2.2 Phoenix…

FBX模型 转换成带有空间参考的 3DTiles(.b3dm) 数据(FBX glTF 3DTiles)

目录 0 引言1 数据类型介绍1.1 FBX数据1.2 glTF数据1.3 3DTiles1.3.1 简介1.3.2 3DTiles格式的LOD是如何定义1.3.3 文件后缀格式 2 转换工具2.1 CesiumGS /3d-tiles-tools 工具2.1 glf-to-3d-tiles工具 🙋‍♂️ 作者:海码007📜 专栏&#xf…

Linux下载安装Pychram社区版

一.背景 最近将开发也转到Linuxl发现vscode在Linux上面的速度个方面都比windows快太多了!!! 狠狠爱住,于是准备把pycharm也装上来,由于作者没有edu邮箱,于是拿社区版进行演示 二.具体步骤 2.1下载pycharm社区版 链接:下载PyCharm:JetBrains为专业开发者提供的P…