Een Unity-game testen zonder Unity-licentie: dotnet-stubs in CI

Unity Build Server is duur. Voor een in eigen beheer gebouwde indie-runner als ORBYX werkt het ook anders: dotnet-stubs in plaats van Unity, een vier-staps quality-gate in Bitbucket Pipelines, en een groen vinkje binnen 2 minuten.

Een Unity-game testen zonder Unity-licentie: dotnet-stubs in CI

Een gelakt houten windtunnelmodel van een vliegtuig op een stalen steun, met meetstrookjes op de vleugels

Het indie-CI-probleem

Een Unity-licentie voor CI vereist Unity Build Server of een gelijkwaardige seat — voor kleine indiestudio's al snel een paar honderd euro per maand. Voor een gratis-te-spelen mobile arcade-runner als ORBYX is dat een onevenredig grote vaste kost. Tegelijk wil iedere developer dezelfde basis-garantie: een PR die rood loopt voordat hij gemerged wordt.

De aanpak: dotnet test tegen Unity-stubs

De keuze die in ORBYX is gemaakt, is om de Unity-laag te abstraheren waar dat zinvol is en alle pure logica tegen dotnet test te draaien — zonder Unity in de pipeline. Concreet gebeurt dat door drie scherpe lagen:

  • Unity-stub-interfaces — voor klassen die zwaar leunen op Unity (MainMenu, GameOverScreen, GameHUD) zijn stubs gedefinieerd die het Unity-deel vervangen door een testbare interface.
  • Pure-logic-modules — game-balans, scoring, mode-detectie, achievements en theme-difficulty leven in pure C#-modules zonder Unity-types in hun publieke API.
  • dotnet test in pipeline — de pipeline draait dotnet test op een PHP-Apache + ext-redis image (geen Unity) en krijgt binnen twee minuten een rood/groen-resultaat.

De vier-staps quality-gate

Naast de unit-tests draait elke ORBYX-build vier statische gates voordat een PR groen kan zijn:

  1. quality-gate.sh — brace-balans, namespace-integriteit, dubbele klassen, oude Input API-aanroepen, achtergebleven TODO-markers.
  2. Project-validatie — vereiste bestanden zijn er, scene-GUIDs kloppen, geen orphaned .meta-files.
  3. Asset-validatie — vereiste textures aanwezig, meta-completeness, geen oversized files.
  4. Pure-logic unit-tests — dotnet test tegen de Unity-stubs.

Wat er buiten beschouwing blijft

Deze aanpak vervangt geen integration-tests in een echte Unity-omgeving. Wat moeilijk te testen blijft zonder licentie: scene-loading, camera-paden, input-systemen, fysieke collisions met Rigidbody. Dat soort tests draait nog steeds lokaal in de Unity-editor, niet in CI. Dat is een bewuste verdeling: de pipeline geeft wat hij goedkoop kan geven (snelle structurele en logische signalen), de editor geeft wat hij wel moet geven (integratie en visuele bevestiging).

Wanneer dit te kopiëren is

Het patroon werkt voor Unity-projecten waar het grootste deel van de spel-logica buiten de Unity-types kan leven. Voor ORBYX betekent dat: rubber-banding voor de VS Computer-modus, drafting AI, theme-difficulty curves, daily-challenge seed-rotatie, achievement-state — allemaal pure C#. Voor een 3D action-RPG met diepe MonoBehaviour-koppelingen is hetzelfde patroon minder rendabel. Voor een indie arcade-runner van een indiestudio is het de juiste verhouding: Unity Build Server bespaard, twee minuten CI-feedback, en een test-suite die alleen groeit naarmate de logica groeit.

Benieuwd wat er mogelijk is?

Eén gesprek is vaak genoeg om te weten of het past. Binnen 24 uur een reactie, en zonder tussenpersonen.

  • Reactie binnen 24 uur, altijd persoonlijk
  • Na een half uur bellen weet u de orde van grootte
  • Vrijblijvend eerste gesprek, geen verplichtingen
  • Ook voor bestaande software van een andere partij