Viewport Manager
December 10, 2025 · View on GitHub
Professional viewport management system for Unreal Engine 5.7+
Features • Installation • Quick Start • Documentation • API Reference
![]() |
![]() |
![]() |
| More than 4 viewports! Have as many as you desire |
Custom Layout Unique Configuration |
Widget Supported Create widget only viewports |
Table of Contents
- Overview
- Features
- Requirements
- Installation
- Quick Start
- Core Concepts
- Camera Pawns
- Layout System
- Configuration
- API Reference
- Troubleshooting
- Contributing
- License
Overview
Are you tired of being limited by the native 4-player split screen in Unreal Engine? Do you wish you could customize them freely and have more of them? This plugin is for you!
Viewport Manager is a powerful C++ plugin for Unreal Engine 5.7+ that enables advanced viewport management beyond the engine's default 4-player limit. Create custom viewport layouts, manage multiple camera views, and build sophisticated multi-pane applications with ease.
Important: This plugin requires the EnhancedInput plugin to be enabled in your project.
Features
Viewport Management
- Support for up to 32 simultaneous viewports! Or more??
- Custom viewport layouts with pixel-perfect positioning
- Runtime layout switching without restart
- Per-viewport HUD support with proper clipping
- Click-to-focus input routing
- Focus highlighting for active viewport
Camera System
-
VMCameraPawn - Professional orbit camera with spring arm
- Target tracking
- Smooth transitions
- Configurable zoom (distance, FOV, orthographic)
- Pan and orbit controls
- Focus point management
-
VMFreeCameraPawn - Free-flying camera
- WASD movement
- Mouse look
- Sprint mode
- Camera-relative movement
Editor Tools
- Layout Designer - Visual layout creation tool
- Quick Start Wizard - Automated setup with validation
- Input Setup Tool - One-click camera input configuration
- Project Settings - Centralized configuration panel
Developer Experience
- Full Blueprint API - Access all features from Blueprints
- C++ API - Complete source code access
- Validation system - Real-time configuration checks
- Auto-configuration - Intelligent project setup
Requirements
- Unreal Engine: 5.7 or later
- Platform: Windows
- Build Tools: Visual Studio 2022 (Windows) or compatible C++ compiler
- Project Type: C++ or Blueprint (plugin works with both)
- Dependencies: EnhancedInput plugin (must be enabled in your project)
Installation
Method 1: Fab Marketplace
- Navigate to the Fab Marketplace listing
- Install through Fab marketplace
Method 2: Plugin Installation
- Download/Clone the ViewportManager plugin
- Copy the
ViewportManagerfolder to your project'sPluginsdirectory:YourProject/ └── Plugins/ └── ViewportManager/ - Regenerate project files (right-click
.uproject→ Generate Visual Studio project files) - Compile your project
- Enable the plugin in Edit → Plugins → Installed → Viewport Manager
- Enable the EnhancedInput plugin (required dependency)
Quick Start
Automated Setup
-
Open Quick Start Wizard
Window → Viewport Manager → Quick Start Wizard -
Click "Fix All Issues"
The wizard automatically configures:
- Game Viewport Client
- Game Instance
- Game Mode
- Camera Input Mappings
- Max Splitscreen Players
-
Press Play - Your viewports are ready!
Manual Setup
If you prefer manual configuration:
1. Configure DefaultEngine.ini
[/Script/Engine.Engine]
GameViewportClientClassName=/Script/ViewportManager.VMGameViewportClient
[/Script/EngineSettings.GameMapsSettings]
GameInstanceClass=/Script/ViewportManager.VMGameInstance
GlobalDefaultGameMode=/Script/ViewportManager.VMSplitGameMode
[/Script/Engine.GameViewportClient]
MaxSplitscreenPlayers=32
2. Setup Camera Input
Window → Viewport Manager → Setup Camera Input
Or manually add to DefaultInput.ini:
[/Script/Engine.PlayerInput]
+AxisMappings=(AxisName="MoveForward",Scale=1.0,Key=W)
+AxisMappings=(AxisName="MoveForward",Scale=-1.0,Key=S)
+AxisMappings=(AxisName="MoveRight",Scale=1.0,Key=D)
+AxisMappings=(AxisName="MoveRight",Scale=-1.0,Key=A)
+AxisMappings=(AxisName="Turn",Scale=1.0,Key=MouseX)
+AxisMappings=(AxisName="LookUp",Scale=-1.0,Key=MouseY)
+ActionMappings=(ActionName="RightMouseButton",Key=RightMouseButton)
+ActionMappings=(ActionName="LeftShift",Key=LeftShift)
3. Create a Layout
Use the Layout Designer:
Window → Viewport Manager → Layout Designer
Or create programmatically in Blueprint/C++.
Core Concepts
Layout Assets
Layouts define viewport configurations. Each layout contains:
- Panes: Individual viewport definitions
- Rect: Position and size (normalized 0-1 coordinates)
- Pawn Class: Camera type for the pane
- HUD Class: Optional UI widget for the pane
- Camera Settings: Per-pane camera configuration
Coordinate System
Viewports use normalized coordinates (0.0 to 1.0):
// Example: Left half of screen
FVMSplitPane LeftPane;
LeftPane.Rect.Origin = FVector2f(0.0f, 0.0f); // Top-left
LeftPane.Rect.Size = FVector2f(0.5f, 1.0f); // 50% width, 100% height
Input Routing
- Mouse/Keyboard: Routes to viewport under cursor (hover-based)
- Click-to-Focus: Optional focus change on viewport click
- Gamepad: Routes to active player controller
Camera Pawns
VMCameraPawn (Orbit Camera)
Professional orbit camera for viewing objects:
// Blueprint Example
UVMSplitBlueprintLibrary::FocusOnActor(
0, // LocalPlayerIndex
TargetActor, // Actor to focus
800.0f, // Distance
true // Enable tracking
);
Features:
- Spring arm rotation
- Configurable orbit distance
- Mouse button controls (Right: orbit, Middle: pan)
- Zoom with mouse wheel
- Target tracking
- Focus point management
Default Controls:
- Right Mouse Button + Drag: Orbit around focus point
- Middle Mouse Button + Drag: Pan camera
- Mouse Wheel: Zoom in/out
- Left Mouse Button: Set focus point (raycast)
VMFreeCameraPawn (Free Camera)
Free-flying camera for navigation:
// Blueprint Example
UVMSplitBlueprintLibrary::SetCameraControlsEnabled(
0, // LocalPlayerIndex
true, // Enable controls
true, // Enable pan
true // Enable orbit
);
Features:
- Camera-relative WASD movement
- Mouse look
- Sprint mode (Shift)
- Adjustable movement speed
Default Controls:
- W/S: Move forward/backward
- A/D: Strafe left/right
- Q/E: Move up/down
- Mouse: Look around
- Shift: Sprint
Layout System
Creating Layouts in Blueprint
// Create a 2-viewport vertical split
bool Success = UVMSplitBlueprintLibrary::QuickSetupSplitScreen(
2, // NumPlayers
false, // bHorizontalSplit (false = vertical)
UMyHUDWidget::StaticClass() // Optional HUD class
);
Creating Layouts in C++
// Create layout asset
UVMSplitLayoutAsset* Layout = NewObject<UVMSplitLayoutAsset>();
// Configure first pane (top half)
FVMSplitPane TopPane;
TopPane.Rect.Origin = FVector2f(0.0f, 0.0f);
TopPane.Rect.Size = FVector2f(1.0f, 0.5f);
TopPane.PawnClass = AVMCameraPawn::StaticClass();
Layout->Panes.Add(TopPane);
// Configure second pane (bottom half)
FVMSplitPane BottomPane;
BottomPane.Rect.Origin = FVector2f(0.0f, 0.5f);
BottomPane.Rect.Size = FVector2f(1.0f, 0.5f);
BottomPane.PawnClass = AVMFreeCameraPawn::StaticClass();
Layout->Panes.Add(BottomPane);
// Apply layout
UVMSplitSubsystem* Subsystem = GetWorld()->GetGameInstance()
->GetSubsystem<UVMSplitSubsystem>();
Subsystem->ApplyLayout(Layout);
Layout Designer (Editor Tool)
Visual layout creation tool:
- Open:
Window → Viewport Manager → Layout Designer - Add Panes: Click "Add Pane" to create viewports
- Configure: Set position, size, and camera type
- Save: Save as
.uassetlayout file - Apply: Reference in subsystem or use AVMAutoLayoutActor
Configuration
Project Settings
Access via: Edit → Project Settings → Plugins → Viewport Manager
Available Settings:
- Default layout asset
- Auto-create players on layout load
- Default camera pawn classes
- Input configuration
Camera Control Settings
Configure per-pane camera behavior:
FVMCameraControlSettings Settings;
Settings.bCameraControlsEnabled = true;
Settings.bOrbitEnabled = true;
Settings.bPanEnabled = true;
Settings.OrbitSensitivity = 1.0f;
Settings.PanSpeedScalar = 1.0f;
Settings.bKeepMouseCursorVisible = true;
// Apply to pawn
if (AVMCameraPawn* CameraPawn = Cast<AVMCameraPawn>(GetPawn()))
{
CameraPawn->ApplyControlSettings(Settings);
}
API Reference
UVMSplitSubsystem
Game instance subsystem for viewport management.
// Get subsystem
UVMSplitSubsystem* Subsystem = GetWorld()->GetGameInstance()
->GetSubsystem<UVMSplitSubsystem>();
// Apply layout
void ApplyLayout(UVMSplitLayoutAsset* Layout);
// Modify pane
void SetPaneRect(int32 LocalPlayerIndex, float OriginX, float OriginY,
float SizeX, float SizeY);
void SetPanePawnClass(int32 LocalPlayerIndex, TSubclassOf<APawn> PawnClass);
// Input routing
void SetActiveKeyboardMousePlayer(int32 LocalPlayerIndex);
int32 GetActiveKeyboardMousePlayer() const;
// Query
int32 GetLocalPlayerCount() const;
APlayerController* GetPlayerController(int32 LocalPlayerIndex) const;
UVMSplitBlueprintLibrary
Blueprint function library for common operations.
// Quick setup
static bool QuickSetupSplitScreen(int32 NumPlayers, bool bHorizontalSplit,
TSubclassOf<UUserWidget> HUDClass);
// Camera focus
static void FocusOnActor(int32 LocalPlayerIndex, AActor* TargetActor,
float Distance, bool bEnableTracking);
// Camera controls
static void SetCameraControlsEnabled(int32 LocalPlayerIndex, bool bEnabled,
bool bPanEnabled, bool bOrbitEnabled);
// Reset camera
static void ResetCameraToStartPosition(int32 LocalPlayerIndex);
UVMGameViewportClient
Custom viewport client managing layout rendering.
// Apply layout
void ApplyLayout(UVMSplitLayoutAsset* LayoutAsset);
// Refresh layout
void RefreshLayout();
// Input management
void SetActiveLocalPlayer(int32 LocalPlayerIndex);
int32 GetActiveLocalPlayer() const;
// Click-to-focus
void SetClickToFocusEnabled(bool bEnabled);
bool IsClickToFocusEnabled() const;
AVMCameraPawn
Orbit camera pawn.
// Focus management
void SetFocusPoint(const FVector& NewFocusPoint);
void SetTargetActor(AActor* NewTargetActor);
void FocusOnActor(AActor* Actor, float Distance, bool bEnableTracking);
// Camera projection
void SetProjectionMode(EVMProjectionMode Mode);
void SetFieldOfView(float NewFOV);
void SetOrthoWidth(float NewWidth);
// Controls
void SetCameraControlsEnabled(bool bEnabled);
void SetOrbitEnabled(bool bEnabled);
void SetPanEnabled(bool bEnabled);
void ApplyControlSettings(const FVMCameraControlSettings& Settings);
AVMFreeCameraPawn
Free-flying camera pawn.
// Movement speed
void SetMoveSpeed(float NewSpeed);
void SetSprintSpeed(float NewSpeed);
// Look sensitivity
void SetLookSensitivity(float NewSensitivity);
// Apply settings
void ApplyControlSettings(const FVMCameraControlSettings& Settings);
Usage Examples
Example 1: Security Camera System
// Create 4-viewport grid layout
UVMSplitBlueprintLibrary::QuickSetupSplitScreen(4, true);
// Focus each viewport on a different camera
TArray<AActor*> SecurityCameras = GetSecurityCameras();
for (int32 i = 0; i < 4 && i < SecurityCameras.Num(); i++)
{
UVMSplitBlueprintLibrary::FocusOnActor(i, SecurityCameras[i], 500.0f, true);
}
Example 2: Picture-in-Picture
UVMSplitLayoutAsset* Layout = NewObject<UVMSplitLayoutAsset>();
// Main viewport (full screen)
FVMSplitPane MainPane;
MainPane.Rect = FVMSplitRect(FVector2f(0.0f, 0.0f), FVector2f(1.0f, 1.0f));
MainPane.PawnClass = AVMCameraPawn::StaticClass();
Layout->Panes.Add(MainPane);
// Picture-in-picture (bottom-right corner, 25% size)
FVMSplitPane PIPPane;
PIPPane.Rect = FVMSplitRect(FVector2f(0.75f, 0.75f), FVector2f(0.25f, 0.25f));
PIPPane.PawnClass = AVMFreeCameraPawn::StaticClass();
Layout->Panes.Add(PIPPane);
// Apply
UVMSplitSubsystem* Subsystem = GetWorld()->GetGameInstance()
->GetSubsystem<UVMSplitSubsystem>();
Subsystem->ApplyLayout(Layout);
Example 3: Runtime Layout Switching
// Switch between different layout presets
void ASwitchLayoutActor::SwitchToLayout(UVMSplitLayoutAsset* NewLayout)
{
UVMSplitSubsystem* Subsystem = GetWorld()->GetGameInstance()
->GetSubsystem<UVMSplitSubsystem>();
if (Subsystem && NewLayout)
{
Subsystem->ApplyLayout(NewLayout);
}
}
Troubleshooting
Camera Not Responding to Input
Symptoms: Camera doesn't move when pressing keys or moving mouse
Solutions:
- Run Quick Start Wizard:
Window → Viewport Manager → Quick Start Wizard - Click "Fix Camera Input" to configure input mappings
- Verify input bindings in
Project Settings → Input
Viewports Not Appearing
Symptoms: Black screen or single viewport instead of layout
Solutions:
- Verify
GameViewportClientClassNameis set in DefaultEngine.ini:[/Script/Engine.Engine] GameViewportClientClassName=/Script/ViewportManager.VMGameViewportClient - Check
GameInstanceClassis configured:[/Script/EngineSettings.GameMapsSettings] GameInstanceClass=/Script/ViewportManager.VMGameInstance - Ensure
MaxSplitscreenPlayers=32is set
Input Not Routing to Correct Viewport
Symptoms: Mouse/keyboard input goes to wrong viewport
Solutions:
- Enable click-to-focus in viewport client settings
- Verify hover-based input routing is enabled
- Check that cursor visibility is enabled:
PlayerController->bShowMouseCursor = true; PlayerController->SetInputMode(FInputModeGameAndUI());
HUD Not Displaying
Symptoms: HUD widget not visible in viewport
Solutions:
- Verify HUD class is assigned to pane in layout
- Check widget visibility and Z-order
- Ensure VMHUDRootWidget is being used as base class
- Verify proper canvas panel setup in HUD widget
Layout Not Persisting
Symptoms: Layout resets on editor restart
Solutions:
- Save layout as
.uassetfile in Content Browser - Set default layout in Project Settings
- Use AVMAutoLayoutActor to auto-apply layout on BeginPlay
Contributing
Contributions are welcome! To contribute:
- Bug Reports: Use GitHub Issues with UE version, reproduction steps, and logs
- Pull Requests: Fork, create feature branch, commit, and submit PR
- Code Style: Follow Unreal Engine C++ standards with meaningful names and focused functions
License
Viewport Manager is free to use and modify for your projects.
Terms
- Free to use in personal and commercial projects
- Free to modify and customize for your needs
- Cannot be resold for profit without explicit permission from me
If you wish to redistribute or sell this plugin (modified or unmodified), please contact me for permission. jackcayc924@gmail.com
Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions


