Type to explore Drawk studio productions

Discover cross-platform games, mobile apps, architecture articles, and interactive GLSL labs.

← Back to Posts

Multi-Engine Architecture: Choosing Between Unity, Unreal, Godot, and Custom Web Graphics

TL;DR: Successful game studios avoid locking their business into a single commercial runtime. By establishing a clean five-tier agnostic seam (canonical JSON data, golden contract vectors, engine-free C#/C++ cores, and thin target adapters), teams can deploy projects across Unity, Unreal Engine, Godot, and custom WebGPU runtimes without rewriting game rules. Here is how modern engines compare across memory, rendering, networking, and deployment pipelines.

flowchart TD subgraph T0["Tier 0: Canonical Data (Source of Truth)"] D1["JSON Schemas, Saves & Spawns"] D2["glTF 3D Assets (RH Y-up)"] D3["Localization & Easing Tables"] end subgraph T1["Tier 1: Contracts & Test Vectors"] C1["Interface Contracts & Event Enums"] C2["Golden Simulation Test Vectors"] end subgraph T2["Tier 2: Headless Game Cores"] direction LR CORE_CS["C# Core (.NET Standard 2.1)\n- noEngineReferences\n- Deterministic Tick(dt)"] CORE_CPP["C++ Core (C17 / C ABI)\n- Sans-IO RUDP (vxnet)\n- Zero Dynamic Allocations"] end subgraph T3["Tier 3: Target Adapters"] A_UNITY["Unity Adapter\n(MonoBehaviour Bridge)"] A_UNREAL["Unreal Subsystem\n(UWorld Subsystem Bridge)"] A_GODOT["Godot GDExtension\n(Node Tree Bridge)"] A_WEB["Web / WASM Adapter\n(rAF Event Loop Bridge)"] end subgraph T4["Tier 4: Native Presentation Engines"] E_UNITY["Unity 6 LTS\n- UI Toolkit (UXML/USS)\n- Universal Render Pipeline (URP)"] E_UNREAL["Unreal Engine 5.8\n- CommonUI / UMG\n- Nanite & Lumen Lighting"] E_GODOT["Godot 4.7+\n- Control & Themes\n- Jolt Physics Engine"] E_WEB["WebGPU / WebGL2\n- Three.js / Babylon.js\n- WebRTC DataChannel (RUDP)"] end T0 --> T1 T1 --> T2 CORE_CS --> A_UNITY CORE_CS --> A_GODOT CORE_CPP --> A_UNREAL CORE_CPP --> A_WEB A_UNITY --> E_UNITY A_UNREAL --> E_UNREAL A_GODOT --> E_GODOT A_WEB --> E_WEB
+-----------------------------------------------------------------------+
|                    THE 5-TIER AGNOSTIC GAME ENGINE SEAM               |
+-----------------------------------------------------------------------+
| TIER 0: CANONICAL DATA   | JSON records, glTF meshes, saves, tokens   |
| TIER 1: CONTRACTS        | Event enums, golden state test vectors     |
| TIER 2: PURE CORE LOGIC  | C# (noEngineReferences) & C++ Sans-IO Core |
| TIER 3: ENGINE ADAPTERS  | Thin bridges mapping Tick(dt) and events   |
| TIER 4: NATIVE ENGINES   | Unity, Unreal, Godot, WebGPU/Three.js      |
+-----------------------------------------------------------------------+

Building games across multiple platforms used to force studios into choosing an orthodoxy: go all-in on Unity for cross-platform mobile, bet the studio on Unreal for high-end rendering, adopt Godot for open-source purity, or craft bespoke WebGL engines for instant browser access.

The problem with engine orthodoxy is vulnerability. Business terms change, licensing models shift, platform fees evolve, and target runtimes branch. If gameplay simulation logic is entangled inside an engine's proprietary scene graph, migrating or porting a title requires a complete rewrite.

The solution is an agnostic seam: abstract intent, not engines. Game simulation rules and data models remain pure and independent. The target game engine acts purely as an authoring view and render adapter.


Core Model & Architecture Comparison

Every major engine approaches scenes, lifecycles, and memory management with distinct design philosophies. Understanding these differences informs where the architecture boundary must sit.

Dimension Unity Unreal Engine Godot Web Stack (Three.js / WebGPU)
Current Stable 6.3 LTS (Unity 6) 5.8 (UE5) 4.7.2 Three.js r18x / Babylon 9.x
Licensing Personal free < $200k; Pro subscription seat 5% royalty over $1M revenue (3.5% on Epic Store) MIT (Zero fees, open source) MIT / Apache 2.0
Primary Code C# 9 (netstandard2.1 Mono runtime) C++ and Blueprints (Verse coming in UE6) GDScript, C++ (GDExtension), C# (.NET 8) TypeScript / JS (C++ compiled to WebAssembly)
Entity Model GameObject + MonoBehaviour components Actor + ActorComponents (UObject hierarchy) Node tree (one script per node) Object3D graph (no built-in component framework)
Data Assets ScriptableObject DataAsset and DataTable Resource (.tres) JSON files / Binary buffers
Memory Management C# Garbage Collector (destroyed != null) UObject Garbage Collector (UPROPERTY tracked) RefCounted + manual queue_free() JS Garbage Collector; manual GPU resource disposal
Coordinate System Left-Handed, Y-Up, +Z Forward (Meters) Left-Handed, Z-Up, +X Forward (Centimeters) Right-Handed, Y-Up, -Z Forward (Meters) Right-Handed, Y-Up, -Z Forward (Meters, glTF native)

Systems: UI, Physics, Shaders, and Networking

When porting or sharing systems between engines, never attempt to abstract low-level rendering or physics engines directly. Instead, share their input data and query interfaces.

System Unity Unreal Engine Godot Web Stack
UI System UI Toolkit (UXML/USS flexbox model) UMG over Slate + CommonUI Control nodes + Container layouts + Themes DOM / CSS or in-scene Canvas overlays
Physics PhysX 3D / Box2D Chaos Physics Jolt 3D (high performance default) Rapier (WASM) or Havok (Babylon)
Rendering Universal Render Pipeline (URP) / HDRP Nanite virtualized geometry + Lumen GI Forward+, Mobile, Compatibility backends WebGPU primary path with WebGL2 fallback
Multiplayer Netcode Netcode for GameObjects (NGO) Built-in Actor replication (Iris architecture) MultiplayerAPI (@rpc annotations) WebRTC DataChannels + Reliable UDP (RUDP)
Local Storage JsonUtility / PlayerPrefs USaveGame binary serialization FileAccess + JSON parsing IndexedDB / localStorage API
Asset Delivery Addressables package Asset Manager, Pak / IoStore packages PCK archive packs fetch() + streaming glTF / KTX2 textures

The Five-Tier Agnostic Seam

At Drawlabs, we structure projects so that game logic never references Unity, Unreal, or Godot namespaces. The five-tier structure isolates the engine to the outer presentation edge:

Tier 0: Canonical Data (Source of Truth)

All game configuration, level layouts, progression charts, character stats, and localization strings are authored as validated JSON documents. Assets use standard glTF 2.0 with Right-Handed Y-Up coordinates. Engine assets (such as ScriptableObjects or Blueprint DataAssets) are generated downstream from this data rather than authored by hand.

Tier 1: Contracts and Golden Test Vectors

Every game action is represented by explicit message types (e.g. Command, State, Event). We establish golden regression test vectors: given a recorded seed and stream of timestamped input commands, the simulation output must match across C#, C++, and WebAssembly bit-for-bit.

Tier 2: Pure Simulation Cores

  • C# Core (T2a): Built as a clean netstandard2.1 assembly with noEngineReferences: true. The simulation contains no physics raycasts, no rendering calls, and no OS threads. It implements a simple Tick(float dt) method that consumes user commands and outputs state snapshots.
  • C++ Core (T2b): A standalone C++17 library exposing a pure C ABI. This houses our sans-IO networking transport (vxnet RUDP), voxel meshing algorithms, and high-performance physics solvers. It compiles natively for Unreal and Godot GDExtension, and cross-compiles to WebAssembly for browser targets.

Tier 3: Target Adapters

A thin adapter layer sits inside each target engine. In Unity, a lightweight MonoBehaviour calls Core.Tick(Time.deltaTime) in Update(). In Unreal, a UWorldSubsystem pumps ticks. In the browser, a standard requestAnimationFrame loop drives the WASM module. Adapters never hold gameplay rules; their only job is forwarding events and translating coordinates.

Tier 4: Native Presentation

The outer layer uses the target engine's strongest built-in presentation tools:

  • Unity: UI Toolkit with UXML and USS stylesheets, shaders written in URP ShaderGraph.
  • Unreal: CommonUI widget blueprints and Nanite geometry for high-fidelity console visuals.
  • Godot: Clean composed scene trees and Theme resources for fast desktop deployment.
  • Web: Three.js rendering pipelines with WebGPU shaders and responsive HTML/CSS overlays.

Practical Decision Matrix: When to Pick Which Engine

Choosing the right runtime depends strictly on platform constraints, team composition, and business objectives:

Runtime Pick It When Avoid It When
Unity Target is cross-platform mobile (iOS and Android), stylized 2D/3D, free-to-play with extensive ad/IAP SDK integrations, or interactive web builds. It remains our primary house workhorse. You require AAA photorealism out of the box, or your budget cannot tolerate per-seat licensing fees.
Unreal Engine Target is high-fidelity PC and console gaming, massive seamless open worlds, multiplayer action with built-in networking, or virtual film production. Building casual 2D mobile apps, small web titles, or working with a small team without deep C++ debugging experience.
Godot Fast iteration speed, small binary footprints (< 40 MB), desktop games (Steam/itch.io), open-source freedom with zero licensing royalties, and rapid prototype jams. Shipping to Sony PlayStation or Nintendo Switch without an authorized porting partner, or heavy AAA visual workloads.
WebGPU / Three.js Instant browser play without installs, deep integration with web APIs, agentic AI consoles, interactive marketing tools, and embedded SaaS dashboards. Large multi-gigabyte open-world titles, native App Store in-app purchase ecosystems, or complex character animation rigs.

Core Engineering Best Practices Across All Targets

  1. Zero Runtime Allocations: Garbage collection hitches destroy game feel across every language. C# GC sweeps, Unreal UObject collection cycles, and JavaScript browser GC pauses will cause dropped frames if code allocates objects during active gameplay. Pre-allocate object pools and use fixed-size ring buffers during level initialization.
  2. Profile with Engine Instrumentation Before and After: Never claim a performance optimization without profiler evidence. Measure draw calls, memory allocations per frame, and CPU timeline costs using the Unity Profiler, Unreal Insights, or Chrome DevTools Performance panel.
  3. Keep Coordinate Conversions at the Boundary: Establish a single canonical coordinate system (Right-Handed Y-Up in meters, matching glTF 2.0). If Unreal expects Centimeters with Z-Up, perform the scale and axis swap exclusively inside the Unreal adapter layer.
  4. Decouple Networking from Runtimes: Use sans-IO packet processing models where simulation code takes bytes in and pushes bytes out without binding directly to OS sockets. This allows testing network scenarios under synthetic packet loss and latency before deploying to hardware.

By enforcing the five-tier agnostic seam, our studio maintains full production agility: titles can prototype rapidly on the web, scale into production on Unity, and expand to high-end consoles on Unreal without stranding core engineering investments.

← Back to All Posts