[UE4][C++]调整分屏模式下(本地多玩家)视口的显示位置和区域

一、分屏模式设置

在UE4中,多个玩家共用一个显示器就可以启用分屏模式,按玩家人数(最大四人)将屏幕均匀分割,显示不同玩家的视角,开发者可以在编辑器里设置分割类型(水平或者垂直),这个分割是采用UV坐标的方式。

(进入项目设置--项目--地图和模式--本地多人)

调整Player的摄像机的宽高比,可以调整显示画面的大小比例

二、分屏位置构造

分屏源代码位于:\Runtime\Engine\Private\GameViewportClient.cpp

其位置位于构造函数中 (部分源码截图),它定义了从1个玩家到4个玩家的的屏幕排列顺序和区域。

分屏方式定义如下

cpp 复制代码
/**
 * Enum of the different splitscreen types
 */
namespace ESplitScreenType
{
	enum Type
	{
		// No split
		None,
		// 2 player horizontal split
		TwoPlayer_Horizontal,
		// 2 player vertical split
		TwoPlayer_Vertical,
		// 3 Player split with 1 player on top and 2 on bottom
		ThreePlayer_FavorTop,
		// 3 Player split with 1 player on bottom and 2 on top
		ThreePlayer_FavorBottom,
		//3 Player vertical split
		ThreePlayer_Vertical,
		//3 Player horizontal split
		ThreePlayer_Horizontal,
		// 4 Player grid split
		FourPlayer_Grid,
		// 4 Player vertical split
		FourPlayer_Vertical,
		// 4 Player horizontal split
		FourPlayer_Horizontal,

		SplitTypeCount
	};

	// Deprecated old FourPlayer grid enum value
	UE_DEPRECATED(4.21, "FourPlayer is now FourPlayer_Grid")
	const Type FourPlayer = FourPlayer_Grid;
}

屏幕排列位置和区域定义如下

cpp 复制代码
/** Structure to store splitscreen data. */
struct FPerPlayerSplitscreenData
{
	float SizeX;
	float SizeY;
	float OriginX;
	float OriginY;


	FPerPlayerSplitscreenData()
		: SizeX(0)
		, SizeY(0)
		, OriginX(0)
		, OriginY(0)
	{
	}

	FPerPlayerSplitscreenData(float NewSizeX, float NewSizeY, float NewOriginX, float NewOriginY)
		: SizeX(NewSizeX)
		, SizeY(NewSizeY)
		, OriginX(NewOriginX)
		, OriginY(NewOriginY)
	{
	}

};

因此只要我们去修改结构体里的数据就可以做到调节位置和区域

三、分屏位置调节

为了能在蓝图里动态修改我同样也构建了相同的结构体

cpp 复制代码
USTRUCT(BlueprintType)
struct FSplitData
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere)
		float SizeX;
	UPROPERTY(EditAnywhere)
		float SizeY;
	UPROPERTY(EditAnywhere)
		float OriginX;
	UPROPERTY(EditAnywhere)
		float OriginY;
	
	FSplitData()
	{
		SizeX = 0;
		SizeY = 0;
		OriginX = 0;
		OriginY = 0;
	}

	FSplitData(float x,float y,float sizex,float sizey):
		OriginX(x),
		OriginY(y),
		SizeX(sizex),
		SizeY(sizey)
	{

	}
};

我在gamemode里创建代码,在地图蓝图中去调用代码就可以改变分屏位置

cpp 复制代码
void ABloodGameModeBase::SplitScreen(TArray<FSplitData> DataArray)
{
	//4个player
	if (GEngine && GEngine->GameViewport)
	{
		if (DataArray.Num() == 4)
		{
			for (int i = 0; i < 4; i++)
			{
				GEngine->GameViewport->SplitscreenInfo[ESplitScreenType::FourPlayer_Vertical].PlayerData[i].OriginX = DataArray[i].OriginX;
				GEngine->GameViewport->SplitscreenInfo[ESplitScreenType::FourPlayer_Vertical].PlayerData[i].OriginY = DataArray[i].OriginY;
				GEngine->GameViewport->SplitscreenInfo[ESplitScreenType::FourPlayer_Vertical].PlayerData[i].SizeX = DataArray[i].SizeX;
				GEngine->GameViewport->SplitscreenInfo[ESplitScreenType::FourPlayer_Vertical].PlayerData[i].SizeY = DataArray[i].SizeY;
			}
		}
		//log
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("SplitScreen"));
	}
}
相关推荐
Deveuper8 天前
UE5 C+、C++、C# 构造方法区别示例
c++·ue5·c#·ue4
胡说ba道10 天前
生活小妙招之UE CaptureRT改
ue4·材质
雕花の刺猬12 天前
UE4与WEB-UI通信
前端·ui·ue4·webui
Growthofnotes19 天前
UE4_环境_体积云_通过蓝图来控制云彩的形状及位置。
ue4
Growthofnotes21 天前
UE4_材质_世界场景位置偏移_角色擦除效果
ue4·材质
Runjavago21 天前
UE4外挂实现分析-PC端-附源码
android·ue4
Growthofnotes21 天前
UE4_材质节点_有关距离的_流体模拟
ue4·材质
Deveuper1 个月前
UE5 和 UE4 中常用的控制台命令总结
ue5·ue4
XR-AI-JK1 个月前
UE5肉鸽游戏教程学习
学习·游戏·ue5·ue4·新手学习·游戏教程·ue教程
峰度偏偏1 个月前
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
算法·游戏·unity·ue5·ue4·godot