Guide A — Cephalopods in Space!
Instructor demo · J Marshall Pittman
What this is
You are an octopus in a spaceship designed especially for you. Attend to all the controls and watch the display to navigate the perils of your journey through space.
Several gauges drift toward failure at once; you run between them keeping everything in the safe band. It ends when you can't keep up. Your score is how long you lasted.
This is the smallest complete game in the collection — seven scripts, one of which is the entire game. It's built to be assembled live in front of a class in about twenty-five minutes, and every field visibly changes how it feels, which makes it a good vehicle for teaching tuning.
Why this one works as a demo
| Property | Why it helps in class |
|---|---|
| One script holds the whole loop | Students can read MultiTaskStation end to end in five minutes |
| No player character | Skips the entire player/camera/collider setup that eats a first session |
| No art needed | Sliders and buttons. It's playable before anything is drawn |
| Every number is felt | Change one drift rate and the difficulty visibly moves |
| It always ends | There's no win state, so nobody asks "what do I do now?" |
| Eight arms, eight controls | The joke does real pedagogical work — it explains multitasking instantly |
Scripts used
MultiTaskStation (Tier 8) · Interactable · InteractionPrompt (Tier 6) · GameManager · AudioManager · SceneLoader · HUDController (Tier 1)
1. Build it
The station
- Empty GameObject
ShipSystems+ the MultiTaskStation component. - Add four Gauges:
| # | Label | Value | Drift/sec | Safe Min | Safe Max | Adjust Amount |
|---|---|---|---|---|---|---|
| 0 | Oxygen | 0.55 | −0.06 | 0.35 | 0.75 | 0.25 |
| 1 | Heat | 0.50 | +0.05 | 0.25 | 0.65 | 0.25 |
| 2 | Ink Pressure | 0.55 | −0.08 | 0.40 | 0.80 | 0.30 |
| 3 | Course | 0.50 | −0.04 | 0.40 | 0.60 | 0.20 |
- Set the rest:
| Field | Value |
|---|---|
| Danger Per Second | 0.12 |
| Danger Recovery | 0.08 |
| Ramp Per Minute | 0.25 |
| Adjust Sfx | click |
| Alarm Sfx | alarm |
| Alarm Interval | 2 |
Note the mix of drift directions
Oxygen falls, Heat rises. Adjust Opposes Drift (on by default) means the adjustment automatically pushes the other way, so both controls work correctly with no extra configuration. Worth pointing out in class — it's a small design choice that removes a whole category of setup error.
Course has the tightest safe band (0.40–0.60) and the slowest drift. That makes it the one that catches people out: it needs attention rarely, so they forget it exists.
The cockpit controls
One per gauge:
- Empty GameObject
OxygenValvesomewhere in the cockpit + a sprite. - Box Collider 2D, Is Trigger ✓.
- Interactable — Prompt Text
Oxygen, One Shot ✗. - On Interact →
MultiTaskStation.Adjust, parameter 0. - Repeat for the other three with parameters 1, 2, 3.
Spread them around the cockpit so the player has to travel between them. The distance between controls is your difficulty.
The octopus
A TopDownMover (Tier 5) on a sprite is the simplest option — no gravity, moves in eight directions, tag Player. Add InteractionPrompt and a prompt prefab (Guide 9 §6 recipe).
Or, for the fastest possible demo: skip the character entirely and wire the four Adjust calls to UI Buttons. Loses the running-around, keeps the multitasking.
The UI
- Canvas → four Sliders, one per gauge, labelled. Delete handles, Interactable ✗, Min 0 / Max 1.
- A fifth Slider for Danger, coloured red.
- A TMP text for the survival time.
- Empty child
HUDwith HUDController (most fields empty).
2. Wire it up
| On this object | Event | Drag in | Choose |
|---|---|---|---|
Each Interactable | On Interact | ShipSystems | MultiTaskStation.Adjust → parameter 0/1/2/3 |
ShipSystems | On Danger Changed | DangerBar | Slider.value (Dynamic float) |
ShipSystems | On Alarm | AudioManager | PlaySFX (string) → alarm |
ShipSystems | On Run Ended | GameManager | GameManager.GameOver |
| Restart Button | On Click | ShipSystems | MultiTaskStation.Restart |
The four gauge bars need a small script.
OnGaugeChangedsends(int, float)— the index and the value — which doesn't map onto a single Slider. Options: write a four-line relay, or demo with only the Danger bar visible (which works and is arguably tenser). For a live class build, use the Danger bar alone and add the gauge bars afterward.
3. Teaching it live
A rough running order for a class session:
Minutes 0–5 — build the station. Add the component, add one gauge, press Play. Watch the danger bar climb. Nothing else exists yet.
Minutes 5–10 — add one control. An Interactable wired to Adjust(0). Now the player can fight back. This is the moment the loop exists.
Minutes 10–15 — add three more gauges. The game becomes hard. Ask the class what changed — the answer is "attention is now a resource," and that's a design concept they've just felt rather than been told.
Minutes 15–20 — tune it together. Take suggestions. Halve a drift rate; double it. Widen a safe band; narrow it. Change Ramp Per Minute from 0.25 to 1.0 and watch a run end in forty seconds.
Minutes 20–25 — the punchline. Point out that this is a complete game — start, loop, escalation, ending, score — built from one component and four buttons.
The line worth landing
Start with drift rates so slow it's boring, then speed up until you're slightly panicked. That's the right value.
It's true of nearly every number in every game in the class, and it's easier to demonstrate here in ninety seconds than to explain anywhere else.
4. Tuning reference
| Change | Effect |
|---|---|
| Drift/sec ↑ | that gauge needs attention more often |
| Safe band narrower | less margin for error |
| Adjust Amount ↓ | more presses per fix |
| Danger Per Second ↑ | mistakes are punished faster |
| Danger Recovery ↑ | more forgiving of a brief lapse |
| Ramp Per Minute ↑ | runs end sooner; the whole difficulty curve |
| Controls further apart | travel time becomes the constraint |
Ramp Per Minute is the one to demonstrate. At 0.25 a run lasts a few minutes; at 1.0 it lasts under a minute. One float, entirely different game.
5. Extending it
Things to leave as exercises:
- A fifth gauge that only appears after 60 seconds
- A gauge that affects another — heat rising drains oxygen
- A repair minigame instead of a single press
- Random events — a meteor knocks a gauge to zero
- A high score via
LevelProgress.RecordTime - Eight controls for eight arms, and a genuine argument about whether that's too many
6. Common problems
| What you see | What's wrong |
|---|---|
| Gauges don't move | Drift Per Second is 0 |
| Danger fills instantly | Gauges start outside their safe bands — set the starting Value between Min and Max |
| Danger never fills | Every gauge starts safe and drifts slowly. Wait, or raise the drift |
| Adjusting moves the wrong way | Untick Adjust Opposes Drift on that gauge |
| Interacting does nothing | InteractionPrompt missing on the player, or Interact action missing |
| Wrong gauge adjusts | The Adjust parameter doesn't match the gauge's index |
| Run never ends | Danger Recovery is higher than Danger Per Second |
| Danger bar doesn't move | Wired to static value rather than Dynamic float |