Skip to content

Repository files navigation

Ghost Relay

A mobile top-down extraction shooter for Android and iOS, built in Unity 6 with URP.

Drop into a hostile zone with nothing. Crack open salvage crates while the heat climbs and the zone sends more at you. Reach an extraction pad and hold it to bank what you carry. Die, and you lose the run. The whole game is one question asked over and over: one more crate, or leave now?

Status: closed playtest, not a finished product. Ghost Relay is a real, playable game that has been through many instrumented playtest waves, but it is mid-development. Expect rough edges, in-flight experiments, and systems that exist mainly to answer a design question.


Why this repository might interest you

Beyond being a working Unity mobile game, two things here are unusual:

1. The full design history is public. DesignDocs/GhostRelay_Design_Log.md is a build-measure-learn log where every gameplay change is a pre-registered experiment: a hypothesis and a decision rule committed before the code, then a dated verdict measured against the previous build's cohort. Ten experiments (EXP-001 to EXP-010) are recorded in order, including the ones that failed and the ones that were killed before shipping. Most games never show this.

2. It was built with an AI agent driving the Unity Editor. The project is wired for Loombridge, an MCP bridge that lets an agent open scenes, place objects, enter play mode, drive input, and read runtime state back out. A large amount of the level construction and verification in this repo happened through it. See LOOMBRIDGE.md.


The loop

Beat What it does
Deploy Pick a zone from the map select, watch the deploy meter fill, land.
Loot Hold on a salvage crate to open it. Higher tiers pay more and take longer.
Heat A pressure curve that ramps with time and looting. More enemies, more often.
Extract Reach a pad and hold it. The zone notices, and the exit gets loud.
Bank or bust Extract and your salvage banks. Die and it is gone.

Zones: a guided Tutorial, then Outskirts (clean introduction), Ruins, Meltdown, and Relay Zero (a boss zone built around the Weaver). Later zones add run variety: a marked opt-in elite ("HOT TARGET"), a roaming Warden, and a second, richer extraction pad that pays more to reach.

Verbs: twin-stick movement with auto-aim fire, a cooldown-burst flamethrower, and a lootable heal. Deliberately few. The design rule throughout has been to add decisions, not buttons.


Running it

Requirements

  • Unity 6000.5.3f1 (see ProjectSettings/ProjectVersion.txt; install via Unity Hub)
  • Git LFS is required. All art, audio, and models are LFS objects.
  • Android Build Support or iOS Build Support to deploy to a device
  • Optional: Loombridge to drive the editor with an AI agent. It is vendored as a local tarball in Packages/tarballs/, so the project resolves without it installed globally, and it is editor-only (never in a player build).

Clone and open

git lfs install
git clone https://github.com/Loomtide/GhostRelay.git
cd GhostRelay
git lfs pull

Open the folder in Unity Hub with 6000.5.3f1. First import takes a while: it is a few thousand assets and shader variants.

If you see pink materials or missing meshes, git lfs pull did not complete. Files that are a few hundred bytes of text starting with version https://git-lfs... are unfetched pointers.

Play

Open Assets/_Project/Scenes/Splash.unity and press Play to get the real entry flow (splash to home to map select to deploy). To iterate on a single zone, open that zone's scene directly, for example Level_01_Ruins.unity.

The game is landscape-locked and designed for touch. In the editor, use the Game view at a phone aspect ratio; on-screen sticks and buttons respond to mouse input.

Build to a device

An Android dev build is one menu item: Ghost Relay → Build Android Dev APK. Related setup lives under the same menu (Apply Android Build Settings, Apply App Icon).

Forking? Change applicationIdentifier in ProjectSettings/ProjectSettings.asset (currently com.loomtide.ghostrelay) and the product/company name, or your build will collide with ours.


How the code is organized

Assets/_Project/
  Scripts/
    Core/        GhostRelay.Core        event channels, run state, combat, feedback, telemetry
    Player/      GhostRelay.Player       controller, camera, weapons, flamethrower
    Enemies/     GhostRelay.Enemies      chaser, shooter, elite/Warden, Weaver boss, rigs + death FX
    Loot/        GhostRelay.Loot         crates, tiers, hold-to-loot
    Extraction/  GhostRelay.Extraction   beacons, hold-to-extract, the loud exit
    UI/          GhostRelay.UI           HUD, map select, minimap, end screens
    Bots/        GhostRelay.Bots         scripted bot runs for perf and balance sweeps
    Editor/      GhostRelay.Editor       scene builders, installers, dev tools
  Data/          ScriptableObject configs and event channels
  Art/  Audio/  Prefabs/  Scenes/  Settings/  Resources/  Tests/

Two architectural rules run through all of it:

  • Decouple via ScriptableObject event channels. Systems raise and listen on shared channel assets (OnLooted, OnPlayerDied, OnExtractStarted, OnHeatTick) instead of holding references to each other.
  • Data as assets. Every tuning dial is a serialized field on a …Config ScriptableObject, so balance changes are asset edits rather than code changes. This is what makes the experiment loop cheap enough to run weekly.

A third convention worth knowing: levels are built by editor scripts, not by hand. The Ghost Relay/ menu is full of installers (Install Far Pad, Build Meltdown East Strip, Install Warden, Build Tutorial Scene). Reproducible construction beats hand-placement when an agent is doing the placing and when a feature has to land identically across five scenes.


Telemetry

Every run writes a JSON summary plus an optional event stream to PlaytestData/, which tools/analysis/gate_metrics.py reads to produce the playtest gate numbers, and viewer.html renders as heatmaps and funnels.

Nothing is uploaded anywhere by default. The committed TelemetryConfig.asset has a blank endpoint, so a clone of this repo writes telemetry to local disk only and never phones home. The optional upload path (a Cloudflare Worker plus R2, in tools/ingest/) requires you to stand up your own endpoint and supply your own credentials through an untracked local file. See TelemetryCredentials.cs.

If you want telemetry fully off, set enabled: 0 on Assets/_Project/Data/Config/TelemetryConfig.asset.


Licensing, in one paragraph

The code is MIT. The art and audio are not. You can freely read, fork, and build on the source under the MIT License. The models, textures, audio, and design documents are © 2026 Loomtide, all rights reserved: use them while working on this repository, but do not ship them in another product or publish a reskin. Full terms in ASSET-LICENSE.md, and bundled third-party components in THIRD-PARTY-NOTICES.md. The code is structured so swapping in your own art is practical if you want to build your own game on it.


Contributing

See CONTRIBUTING.md. Short version: bug fixes, performance work, and platform compatibility are very welcome. Gameplay and balance changes are harder to accept, because they are governed by the experiment loop in the design log rather than by taste, so open an issue before building one.

Further reading

About

A mobile top-down extraction shooter built in Unity 6. MIT code, see ASSET-LICENSE.md for art.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages