Gaussian Splatting in Unity and Unreal Engine: Complete Workflow
Updated Mar 2026
Gaussian Splatting in game engines has gone from experimental research code to a practical production tool in under 18 months. As of early 2026, both Unity and Unreal Engine have mature plugin ecosystems for real-time 3DGS rendering, with frame rates of 60 fps achievable for scenes under 1 million Gaussians on mid-range GPU hardware (NVIDIA RTX 3060 / AMD RX 6600 class). The most widely used Unity solution is **UnityGaussianSplatting** created by Aras Pranckevičius (formerly at Unity). The package is open-source (github.com/aras-p/UnityGaussianSplatting), actively maintained, and handles PLY import natively with GPU-accelerated sorting. As of version 2.x, it supports Unity 6 LTS and works on PC/Mac/mobile platforms. A 1M Gaussian scene typically consumes 180–220 MB of GPU memory and renders in 3–8 ms per frame on an RTX 3070, depending on view angle and splat density. For Unreal Engine, the cleanest production path is the **Luma AI UE plugin** (available in the Unreal Marketplace), which wraps a custom 3DGS renderer inside a standard UE actor. Alternatively, several community plugins (search "Gaussian Splatting" in the UE Marketplace) provide similar functionality with varying levels of platform support. The critical challenge in both engines is not the rendering itself — it's the coordinate system mismatch. 3DGS training tools use OpenGL conventions (Y-up, right-handed) while Unity defaults to Y-up left-handed and Unreal defaults to Z-up left-handed. Getting this wrong produces scenes that are upside-down, mirrored, or at 90° angles. This guide walks through the complete workflow from trained PLY to in-engine deployment, with explicit coordinate system fixes for both engines.
Tools used in this guide
Step-by-Step Guide
- 1
Prepare Your PLY File for Engine Import
Start by validating your PLY file in polyvia3d's PLY Gaussian Viewer at /splat-viewer/ply. Check: (1) the Gaussian count — over 3M splats will strain real-time rendering budgets even on desktop GPUs; (2) scene orientation — note which way is "up" in the viewer (Y+ is typical for scenes trained with the original 3DGS or nerfstudio); (3) scene scale — 3DGS training operates in "scene units" that may not match real-world metres. If your Gaussian count is above 3M, consider re-exporting at lower iteration count or using a decimation tool. For the Unity plugin, PLY is the native import format. For Unreal, PLY is also the standard input for most plugins. Avoid converting to SPLAT or SPZ before game engine import unless a specific plugin requires it — game engines do their own GPU-optimised encoding after import.
- 2
Set Up UnityGaussianSplatting
Install the package via Unity Package Manager: open the manifest.json in your project's Packages folder and add `"com.aras-p.gaussian-splatting": "https://github.com/aras-p/UnityGaussianSplatting.git#upm"`. After package resolution, create a GaussianSplatAsset by right-clicking in the Project window → Create → Gaussian Splat Asset. In the inspector, set the Source File to your PLY file path. Click "Create" — the import process converts PLY data into a GPU-optimised internal format. Import time for a 1M Gaussian scene is typically 30–60 seconds. The asset is stored as a Unity-specific binary alongside your PLY. To render, add a GaussianSplatRenderer component to a GameObject in your scene and assign the GaussianSplatAsset. The renderer handles alpha sorting automatically using a GPU radix sort on every frame.
- 3
Fix Coordinate System and Scale
This is the step that trips up almost everyone the first time. 3DGS training uses OpenGL conventions: X right, Y up, Z toward viewer (right-handed). Unity uses X right, Y up, Z away from viewer (left-handed) — a 180° rotation difference around Y. Unreal uses X forward, Y right, Z up (left-handed) — requiring both a 90° rotation around X and a potential scale adjustment. For Unity: in the GaussianSplatRenderer's transform, set Rotation to (0, 0, 180) as a starting point, then adjust until the scene looks correct. For Unreal: set the actor rotation to (-90, 0, 0) with scale (1, 1, -1) to account for the Z-flip. Scene scale is typically off by a factor of 1–100× since 3DGS trains in normalised scene coordinates. The UnityGaussianSplatting plugin has a "Pos Bound Size" display in the asset inspector — use this to calculate the real-world scale factor. For a room-scale scene, expect to set uniform scale to 10–50 in Unity units.
- 4
Optimise Rendering Performance
The dominant rendering cost for 3DGS is alpha-sorted drawing — every frame, all Gaussians must be sorted back-to-front relative to the camera. UnityGaussianSplatting uses a GPU radix sort which takes 1–4 ms for 1M Gaussians on an RTX 3070. Beyond that, the actual splat rasterisation adds another 2–5 ms depending on view angle (overhead views with high Gaussian density per pixel are most expensive). Strategies to hit 60 fps: (1) Cull Gaussians by distance — the plugin supports a Max Distance parameter that culls splats beyond a threshold; set this to 50–100 m for large scenes. (2) Reduce SH degree — the plugin supports SH degree 0 (view-independent colour) which halves the GPU memory bandwidth at the cost of losing specular highlights. (3) For VR, the doubled render cost of stereo rendering typically requires a scene under 500K Gaussians to hit 72 fps on a Meta Quest 3. (4) Combine with traditional geometry — use 3DGS for complex background environments where mesh creation is impractical, and mesh-based objects for interactive foreground elements.
- 5
Use Gaussian Splatting in Unreal with Luma AI Plugin
The Luma AI plugin for Unreal Engine (available at lumalabs.ai/unreal or the UE Marketplace) provides a LumaActor that wraps a 3DGS renderer. Import your PLY via the plugin's import dialog (Content Browser → Import → Luma Capture). The plugin performs its own GPU format conversion during import. Coordinate system fix for Unreal: after placing the LumaActor in your level, set World Transform Rotation to X: -90, Y: 0, Z: 0 and flip the Z scale to -1. Unreal's Lumen lighting system does not interact with Gaussian Splatting — 3DGS renders as a screen-space effect that bypasses Lumen, meaning you won't get accurate reflections or GI mixing between 3DGS scenes and traditional Unreal meshes. For cinematic rendering this is fine; for interactive games, plan your scene so 3DGS elements are visually separated from real-time lit geometry.
- 6
Decide: 3DGS vs Traditional Mesh
3DGS is not a universal replacement for mesh-based geometry in games. Use 3DGS when: real-world environments are too complex to model manually (forests, city blocks, historical sites); photorealistic lighting baked from the real world is required; the scene is view-only (no collision, no physics). Use traditional meshes when: objects need collision detection or physics; the scene requires real-time dynamic lighting from Lumen/Nanite; you're targeting mobile (3DGS memory overhead is prohibitive on mobile game budgets — 180 MB for 1M splats vs 5–20 MB for an equivalent textured mesh). The strongest use case today is combining both: 3DGS for the environment backdrop (a real scanned building interior), traditional mesh characters in the foreground. This hybrid approach is used in several Unreal 5 Lumen showcase demos as of 2025.