Skip to main content

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. 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. 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. 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. 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. 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. 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.

Frequently Asked Questions

Does UnityGaussianSplatting work on mobile (iOS/Android)?
Partially. The plugin supports Metal (iOS) and Vulkan (Android), but performance limits splat counts to 200–500K for 30 fps on current mobile hardware. Most production mobile 3DGS deployments use pre-rendered video or a simplified web viewer rather than native in-engine rendering.
What GPU memory does 3DGS use in Unity?
Approximately 180–220 MB per million Gaussians in UnityGaussianSplatting with full SH support. With SH degree 0 (view-independent), this drops to 60–80 MB per million Gaussians. A typical room-scale scan has 1–3M Gaussians, requiring 200–650 MB of VRAM.
Can I mix 3DGS with Unreal's Nanite and Lumen?
Not directly. 3DGS renders as a full-screen alpha-blended pass that bypasses Nanite's mesh rasterisation and Lumen's ray-traced GI. You can place 3DGS scenes alongside Nanite geometry, but lighting won't interact correctly between the two systems. For cinematic work, this is typically acceptable.
My imported Gaussian splat scene is upside down. How do I fix it?
This is the coordinate system mismatch. In Unity, try setting the GaussianSplatRenderer transform rotation to (0, 0, 180). In Unreal, try (-90, 0, 0) with Z scale -1. If it's still wrong after those defaults, the training tool may have used a non-standard convention — try (180, 0, 0) or (0, 180, 0) systematically.
What is the best 3DGS workflow from capture to game engine?
Capture with Scaniverse or Polycam → train with nerfstudio or the original 3DGS codebase → export PLY → validate in polyvia3d PLY Viewer → import into Unity via UnityGaussianSplatting or Unreal via Luma AI plugin → fix coordinate system and scale → measure GPU cost and reduce splat count if needed.

Related Tools

Related Format Guides