多个显示器输出时,UE运行窗口指定在某一个显示器上运行

前言

在运行打包后的UE程序时,有时我们的电脑配置了多个显示器,想要在指定的显示器上运行我们的程序,当然可以在运行的时候通过鼠标拖拽窗口的方式到其他显示器上。也可以在程序初始化的时候通过设置运行窗口的起点位置的方式指定显示器,但是每次都需要我们自己计算每个显示器的起点位置。如果能直接指定其在某一个ID的显示器上运行就更方便了。于是可以通过枚举出某一个ID显示器的起点位置,再将其设置我们的UE窗口起点就行了。

虽然UE本身没有内置的方法来获取连接的显示器,但是可以通过不同平台的API来获取显示器的信息

一、Windows平台

1、在 Windows 上,可以使用 EnumDisplayMonitors 函数来枚举所有连接的显示器

添加必要的头文件(如果报错把2行和4行的也加上)

#include "Windows/AllowWindowsPlatformTypes.h"
//#include "Windows/PreWindowsApi.h"
#include <Windows.h>
//#include "Windows/PostWindowsApi.h"
#include "Windows/HideWindowsPlatformTypes.h"

枚举显示器并获取目标显示器的起点位置

FVector2D GetTargetMonitorPosition(int targetIndex)
{
    HMONITOR targetMonitor = nullptr;
    MONITORINFOEX monitorInfo;
    monitorInfo.cbSize = sizeof(MONITORINFOEX);

    auto MonitorEnumProc = [](HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, 
    LPARAM dwData) -> BOOL
    {
        static int monitorIndex = 0;
        if (monitorIndex == targetIndex)
        {
            MONITORINFOEX* pMonitorInfo = reinterpret_cast<MONITORINFOEX*>(dwData);
            if (GetMonitorInfo(hMonitor, pMonitorInfo))
            {
                return FALSE; // 终止枚举
            }
        }
        monitorIndex++;
        return TRUE; // 继续枚举
    };

    EnumDisplayMonitors(nullptr, nullptr, MonitorEnumProc,
    reinterpret_cast<LPARAM>(&monitorInfo));

    return FVector2D(monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top);
}

2、在程序初始化的时候设置窗口运行的起点位置(包括全屏和非全屏时)

UGameUserSetting* gameSetting = GEngine->GetGameUserSettings();

//可以在电脑设置->系统->屏幕那里点击识别查看显示器的ID
int targetIndex = 3;//假设需要在第三个显示器上运行
//窗口化时窗口的分辨率
int windowWidth = 1280;
int windowHeight = 960;
if(FullScreen)//自己定义是否需要全屏
{
	GEngine->GameViewport->GetWindow()->MoveWindowTo(GetTargetMonitorPosition(targetIndex));
	gameSetting->SetFullScreenMode(EWindowMode::WindowedFullScreen);
	gameSetting->ApplySettings(true);
}
else
{
	gameSetting->SetFullScreenMode(EWindowMode::Windowed);
	gameSetting->SetScreenResolution(FIntPoint(windowWidth, windowHeight));
	GEngine->GameViewport->GetWindow()->MoveWindowTo(GetTargetMonitorPosition(targetIndex));
	gameSetting->ApplySettings(true);
}

二 、Mac平台

1、在 Mac 上,可以使用 CoreGraphics 框架来获取连接的显示器信息

添加必要的头文件

#include <CoreGraphics/CoreGraphics.h>

枚举显示器

FVector2D GetTargetMonitorPosition(int targetIndex)
{
    uint32_t displayCount;
    CGGetActiveDisplayList(0, nullptr, &displayCount);
    CGDirectDisplayID displays[displayCount];
    CGGetActiveDisplayList(displayCount, displays, &displayCount);

    if (targetIndex < displayCount)
    {
        CGRect displayBounds = CGDisplayBounds(displays[targetIndex]);
        return FVector2D(displayBounds.origin.x, displayBounds.origin.y);
    }

    return FVector2D(0, 0); // 默认位置
}

2、设置窗口起点位置同上

三、Linux平台

1、在 Linux 上,可以使用 X11 库来获取显示器信息

安装libX11库

首先更新软件包列表
sudo apt update
安装X11库和X11扩展库
sudo apt install libx11-dev
sudo apt install libxrandr-dev

查询X11库的头文件位置

dpkg-query -L libx11-dev
dpkg-query -L libxrandr-dev

查询X11库文件的位置

sudo find / -name libX11.so
sudo find / -name libXrandr.so

并在你的项目配置文件projectname.Build.cs文件中链接该库

public projectname(ReadOnlyTargetRules Target): base(Target)
{
//配置文件里有这个函数,只需在这个函数里添加对库文件和头文件的包含路径
	if(Target.Platform == UnrealTargetPlatform.Linux)
	{
		//通过之前的命令找到库文件和头文件的位置
		PublicAdditionalLibraries.Add("/usr/lib/x86_64-linux-gnu/X11");//库文件
		PublicAdditionalLibraries.Add("/usr/lib/x86_64-linux-gnu/Xrandr");
		
		PublicIncludePaths.Add("/usr/include");//头文件
		PublicIncludePaths.Add("/usr/include/X11");
	}
}

添加必要的头文件

#paragma push_macro("None")//使用宏定义避免与UE源码产生冲突
#undef None
	#include <X11/Xlib.h>
	#include <X11/extensions/Xrandr.h>
#pargma pop_macro("None")

枚举显示器

FVector2D GetTargetMonitorPosition(int targetIndex)
{
    Display* display = XOpenDisplay(nullptr);
    if (display)
    {
        Window root = DefaultRootWindow(display);
        XRRScreenResources* screenResources = XRRGetScreenResources(display, root);
        
        if (screenResources)
        {
            if (targetIndex < screenResources->noutput)
            {
                XRROutputInfo* outputInfo = XRRGetOutputInfo(display, 
                screenResources, screenResources->outputs[targetIndex]);
                if (outputInfo && outputInfo->connection == RR_Connected)
                {
                    XRRCrtcInfo* crtcInfo = XRRGetCrtcInfo(display, screenResources, 
                    outputInfo->crtc);
                    if (crtcInfo)
                    {
                        FVector2D TargetPosition(crtcInfo->x, crtcInfo->y);
                        XRRFreeCrtcInfo(crtcInfo);
                        XRRFreeOutputInfo(outputInfo);
                        XRRFreeScreenResources(screenResources);
                        XCloseDisplay(display);
                        return TargetPosition;
                    }
                }
                XRRFreeOutputInfo(outputInfo);
            }
            XRRFreeScreenResources(screenResources);
        }
        XCloseDisplay(display);
    }

    return FVector2D(0, 0); // 默认位置
}

2、设置窗口起点位置同上

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码在UE5中生成一个Actor并设置相机位置: ```c++ // 获取世界指针 UWorld* World = GetWorld(); // 创建Actor AActor* NewActor = World->SpawnActor<AActor>(); // 设置Actor位置 NewActor->SetActorLocation(CameraLocation); ``` 其中,CameraLocation是相机的位置。 ### 回答2: 在UE5中,要运行相机位置生成一个Actor,我们可以按照以下步骤操作: 首先,我们需要在场景中放置一个Camera Actor以作为相机的位置。可以通过在“Modes”面板中选择“Basic”并拖拽“Camera Actor”到场景中来实现。 然后,选择Camera Actor并在“Details”面板中调整其位置和方向。可以通过手动输入或直接拖动来调整其位置,确保相机的位置和角度与我们想要生成的Actor的位置和方向一致。 接下来,我们需要创建一个新的Actor蓝图。在“Content Browser”面板中右键点击并选择“创建蓝图类”,选择“Actor”作为父类。 打开新创建的Actor蓝图,并在蓝图编辑器中添加所需的组件和逻辑。根据需要可以添加静态网格、碰撞体、动画或其他组件,以及事件或脚本来处理相机位置生成Actor后的行为。 接下来,在Actor蓝图中添加一个变量以保存相机位置。对于位置向量变量,我们可以在蓝图编辑器的右上角的“Variables”面板中点击“+”按钮,并选择“Vector”作为变量类型。然后命名变量并将其默认值设置为Camera Actor的位置。 最后,我们需要在场景中放置生成Actor的触发器。可以通过在“Modes”面板中选择“Basic”并拖拽“Trigger Volume”到场景中来实现。将触发器调整到适当的大小和位置,确保覆盖到我们想要生成Actor的区域。 在触发器的事件脚本中,我们可以添加一个事件来生成Actor。选择触发器,然后在“Details”面板中选择“+”按钮以添加一个事件。选择生成Actor的蓝图,并将其放置在所需位置。 通过以上步骤,我们可以在UE5中使用相机位置来生成一个Actor,并对其进行进一步的定制和处理。 ### 回答3: UE5是指虚幻引擎5,而在虚幻引擎中,生成一个Actor是非常常见和重要的操作。下面是使用UE5运行相机位置生成一个Actor的简要步骤。 首先,我们需要在虚幻引擎的蓝图编辑器中创建一个新的蓝图类作为我们要生成的Actor的模板。可以命名为"MyActor"(或其他你喜欢的名称)。在该蓝图类中,我们可以定义该Actor的外观、功能等。 接下来,在虚幻引擎中创建一个相机,并将其放置在场景中的某个位置。可以通过拖拽一个"CameraActor"到场景中来创建相机。 在蓝图编辑器中,打开"MyActor"的蓝图类。在该蓝图类的事件图表中,可以选择合适的位置添加一个节点(例如,右键单击节点面板,搜索并选择"CreateActorFromClass"节点)。 连接该节点的输入引脚到相机的位置(可以使用合适的节点来获取相机的位置,例如"GetActorLocation"等节点)。然后,将该节点的"Class"引脚连接到"MyActor"的蓝图类上。 最后,在虚幻引擎的世界中,找到你放置相机的位置,双击打开该位置,并使其运行。此,相机位置所生成的"MyActor"将在该位置呈现。 通过上述步骤,我们可以在虚幻引擎中使用UE5运行相机位置生成一个Actor。当然,根据具体需求,我们还可以对生成的Actor进行更多的定制和功能实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值