For U
#006A six-stage first-person experience on what algorithmic feeds leave behind. The reward lasts seconds; the debt comes back as emptiness. Most anti-addiction work casts you as the victim — this one makes you the accomplice.
- Année
- 2026-ongoing
- date
- 2026.07 – Present
- dimension
- 1920×1080
- media
- Unity / C# / MCP-assisted development
- role
- Solo concept-to-production designer & technical artist
A — THE SIX STAGES
Stage 6 only works if the data is real. The first build looked finished and was fed by a random number generator — placebo data, at the climax of a work about confronting an authentic trace of yourself. I rewired it to read the actual interaction frequencies from the first five stages.
B — THE LEVEL IS THE LOOP
Stage 3 is Sisyphus: a stone on a closed path, where letting go is the only way out. The easy build is a straight corridor that teleports you back to the start. Instead the track is an actual Möbius strip, generated at runtime from its parametric equation.
public static Vector3 GetMobiusPoint(float u, float v, float R)
{
float r = R + v * Mathf.Cos(u * 0.5f); // radius wobbles as the band twists
return new Vector3(r * Mathf.Cos(u),
v * Mathf.Sin(u * 0.5f), // the half-angle is the twist
r * Mathf.Sin(u));
}
240 segments around the ring by 8 across the band — 2,169 vertices, 3,840 triangles, rebuilt whenever a parameter changes.
Two things only surface once you actually build one:
_RenderFace = Both and enables the _DOUBLE_SIDED_ON keyword on its own material.GetMobiusPoint is public and static, so the stone is positioned in parameter space instead — it travels along u.Push u from 0 to 2π and the stone arrives back where it started, on the other face. The
loop isn’t scripted or triggered. It’s the geometry. OnValidate() regenerates the mesh
live in the Scene view, so the ring can be re-proportioned without entering Play mode.
C — HOW IT’S PUT TOGETHER
Sixty-one C# scripts across eight domain-scoped folders — one per stage, plus _Core and
UI_Dialogue. Nothing is grouped by type, so a stage can be opened, changed or broken
without touching any other stage.
Stage4_OfficeStage3_Sisyphus_CoreUI_DialogueStage2_FaithStage1_PrimalStage5_FeedStage6_FutureStages talk to each other through a static event bus rather than direct references — a
stage raises SceneComplete and doesn’t know or care what is listening.
The restructure happened partway through, with the project already in a playable state. It
was done through Unity’s own asset database rather than by moving files in Finder, so every
GUID and .meta file survived and no prefab, scene or material reference broke.
D — ONE MATERIAL, SIX STAGES
The corridor walls are a live video feed. Its decay across the stages — the warp, the speed trails, the glitch, the drain to silence — is not six sets of authored assets. It is one shader with seventeen exposed floats, ramped over the course of the stage.
Nine effects stack inside a single pass, each gated on its own parameter:
atan2, radius from length, then an arc offset of sin(angle * 3 + r * 10 − t) pushes the UV outward along its own bearing.floor(uv.y * 8); each band gets a hashed horizontal offset that re-rolls eight times a second.smoothstep, blended against a channel-rotated copy of itself (col.gbr) so the frame bleeds inward.Six of the nine are pure UV arithmetic — they rearrange where the texture is read from
rather than reading it more times. Only the trails and the chromatic shift add taps, and
they sit in opposite branches of the same if, so they never run together.
Every layer is an if (_Parameter > 0.01) away from costing nothing at all. A stage that
doesn’t want the vortex pays for one comparison. That is what makes ramping the whole set
from a timeline affordable, and it is why the escalation could be tuned by dragging
sliders instead of rebuilding scenes.
E — SEE IT IN ACTION
The full walkthrough, all six stages end to end.