MultiplayerDebugTools
A modern, runtime Unreal Engine plugin that gives you a lightweight multiplayer diagnostics HUD directly in the viewport.
Core controls
- Toggle key:
F10 - Console command:
mdt.Toggle - Overlay widget:
SMultiplayerDebugOverlay - Subsystem:
UMultiplayerDebugSubsystem(UGameInstanceSubsystem) - Engine support:
UE 4.27βUE 5.7
Why Itβs Usefulβ
Multiplayer debugging can get noisy and slow. MultiplayerDebugTools keeps critical network and gameplay replication signals visible while you iterate:
- β Fast session health checks in PIE
- β Visual thresholds for instant βgood/warn/badβ feedback
- β Blueprint + C++ control points for custom workflows
- β Minimal runtime overhead and simple integration
What You Can See In-Gameβ
| Metric | Description |
|---|---|
Role | Standalone, Client, Listen Server, or Dedicated Server |
FPS | Sampled from GAverageFPS |
Ping (ms) | Average across active net connections |
Loss In (%) | Inbound packet loss |
Loss Out (%) | Outbound packet loss |
Recv | Inbound bandwidth (B/s, KB/s, MB/s) |
Sent | Outbound bandwidth (B/s, KB/s, MB/s) |
Actors | Total actor count in world |
Net Actors | Replicated actor count (GetIsReplicated()) |
If no network connection exists, network-dependent metrics are shown as N/A.
Visual Thresholdsβ
FPSβ
- π’ Good:
>= 55 - π‘ Warning:
>= 25 and < 55 - π΄ Critical:
< 25
Pingβ
- π’ Good:
< 50 ms - π‘ Warning:
< 100 ms - π΄ Critical:
>= 100 ms
Packet Lossβ
- π’ Good:
< 1% - π‘ Warning:
< 5% - π΄ Critical:
>= 5%
Disabled metrics appear as Off in a dimmed style.
Installationβ
- Copy
MultiplayerDebugToolsinto your projectPlugins/folder. - Open your project in Unreal Editor.
- Enable Multiplayer Debug Tools via Edit β Plugins.
- Restart when prompted.
Quick Usage (PIE Multiplayer Check)β
- Set Number of Players to
2+. - Choose Listen Server play mode.
- Start PIE.
- Press
F10in each window and compare values (role, ping, packet loss, bandwidth).
Blueprint APIβ
Access the subsystem through Game Instance subsystem access.
Main Functionsβ
ToggleOverlay()IsOverlayVisible() -> boolGetStatsSnapshot() -> FMultiplayerDebugStatsSnapshotRefreshStatsNow()SetStatsUpdateInterval(float InSeconds)GetStatsUpdateInterval() -> floatGetFeatureToggles() -> FMultiplayerDebugFeatureTogglesSetFeatureToggles(FMultiplayerDebugFeatureToggles)SetFeatureEnabled(EMultiplayerDebugMetric Feature, bool bEnabled)IsFeatureEnabled(EMultiplayerDebugMetric Feature) -> boolSetAllFeaturesEnabled(bool bEnabled)
Event Dispatcherβ
OnStatsUpdated(FMultiplayerDebugStatsSnapshot Snapshot)
EMultiplayerDebugMetricβ
RoleFPSPingPacketLossBandwidthActorCounts
FMultiplayerDebugStatsSnapshotβ
EnabledFeaturesNetRoleFPSPingMsPacketLossInPercentPacketLossOutPercentBandwidthInBytesPerSecondBandwidthOutBytesPerSecondTotalActorsReplicatedActorsbHasNetworkConnection
FMultiplayerDebugFeatureTogglesβ
bRolebFPSbPingbPacketLossbBandwidthbActorCounts
C++ Exampleβ
#include "MultiplayerDebugSubsystem.h"
if (UGameInstance* GI = GetGameInstance())
{
if (UMultiplayerDebugSubsystem* DebugSub = GI->GetSubsystem<UMultiplayerDebugSubsystem>())
{
DebugSub->ToggleOverlay();
DebugSub->SetFeatureEnabled(EMultiplayerDebugMetric::Bandwidth, true);
DebugSub->SetStatsUpdateInterval(0.2f);
}
}
Bind to updates:
DebugSub->OnStatsUpdated.AddDynamic(this, &UMyObject::HandleStatsUpdated);
Runtime Behaviorβ
- Stats ticker default:
0.25s(minimum clamp via API:0.05s) - Actor count refresh:
1.0s - Overlay refresh timer:
0.25s - Data collection source:
- Client:
ServerConnection - Server: aggregated
ClientConnections
- Client:
- Dedicated server (
UE_SERVER) skips Slate overlay/input handling
Build Dependenciesβ
- Public:
Core,CoreUObject,Engine,InputCore - Private (non-server):
Slate,SlateCore
If your game module includes plugin headers, add "MultiplayerDebugTools" to module dependencies.
Notes & Troubleshootingβ
note
- No viewport means no overlay (expected on dedicated server process).
- In non-networked sessions, network metrics showing
N/Ais expected. - If
F10does nothing, trymdt.Togglein console. - If ping/loss/bandwidth remains
N/A, verify the session is actually networked.