G—P / FMX 320 / Semester / Week 12

Week 12 · Phase 3 — Interactivity

Blueprints II: game feel, score, win state Project 3 due · crit

A character that moves is a tech demo. A character that moves, picks something up, and the whole screen rewards you for it — that's a game. Today we add the missing half: events that fire on contact, a tiny loop with a goal and a win state, and the "juice" that turns a correct interaction into a satisfying one. Same mechanic, wildly different feel.

Sessions Mon Nov 16 & Wed Nov 18 · 2:00 – 3:50 pm · CCB-134 Bring your player Character from Week 10
By the end of this session you can

Mon 2:00 · Brief Feedback is the game

Players don't feel your graph; they feel your feedback. The gap between a functional pickup and a great one is almost entirely presentation — and presentation is a skill you can learn deliberately.

Events and messaging: who talks to whom

Last week you used Event Tick for continuous movement. Pickups are discrete — they happen at one instant — so they're an event problem. When the player's capsule overlaps a coin whose collider has Generate Overlap Events on, Unreal fires On Component Begin Overlap on both. Inside it, the coin doesn't reach across the project and edit the score directly; instead it announces that it was collected. Something else — a score manager — is listening and reacts. That decoupling is the whole point: the coin knows nothing about the UI, and the UI knows nothing about coins.

You have two idiomatic tools. An Event Dispatcher is a broadcast the coin fires ("On Collected"); anything can Bind Event to it and react — one-to-many, great for "when this happens, everyone who cares responds." A Blueprint Interface is a shared vocabulary of functions any Actor can implement, so the player can call Collect on whatever it touches without knowing its class — great for systems talking to systems. Today you'll touch both and feel the trade-off: broadcast versus a typed contract.

The smallest complete loop

A game loop needs three things: a goal (collect all the coins), feedback (the score ticks up, the coin pops), and a state that resolves (you win when the count hits zero remaining). That's it — that is a game. Everything else is elaboration. Building this tiny loop end to end teaches the shape you'll scale up for Project 3: something to do, a signal that you did it, and a condition that ends it.

Game feel, a.k.a. juice

Juice is the layer of non-essential feedback that makes an interaction feel physical: a quick squash-and-scale pop on the coin as it dies, a particle burst where it was, a crisp sound, maybe a tiny screen or UI number bump. None of it changes what the game does. All of it changes how the game feels. The craft is timing and restraint — feedback should be fast (100–200 ms), tied to the moment of contact, and stacked so multiple senses confirm the same event. Over-juice and it's noise; under-juice and it's lifeless. Today you calibrate that dial by hand.

State of the Art · Small teams, bigger reach

If one creative technologist directing agents can do what took a small team, the economics of indie games shift — and the new bottleneck is taste and QA, not raw output. Your head-to-head today is practice for a real hiring question. Discussion: where does a human have to stay in the loop?

Blueprints · OpenAI Codex

Mon 2:45 · Guided lab A coin, a score, a win — with juice

We take your Week 10 character and build a complete micro-loop around it. Start with the plumbing, then layer the feel on last — you can't juice something that doesn't work yet.

  1. Make a collectible with an overlap

    Create a coin Actor Blueprint (a Sphere Collision plus a Static Mesh is fine), and make sure the collision component has Generate Overlap Events checked and an overlap-friendly collision preset. An overlap volume detects contact without physically blocking movement — the player passes through it and Unreal reports the overlap instead of bouncing off it.

  2. Detect the pickup

    On the coin's collision, add an On Component Begin Overlap event. Cast the Other Actor to your player Character (or check a tag) so only the player collects it. Confirm the event fires with a temporary Print String before you build anything on top of it.

  3. Announce the pickup with an Event Dispatcher

    Add an Event Dispatcher OnCollected to the coin and Call it inside the overlap event, then Destroy Actor. The coin's only job is to broadcast "I was collected" — it must not know the score exists. Alternatively, implement a Blueprint Interface Collectible and have the player call it; both decouple the coin so you can add reactions without touching it again.

  4. Build the score UI

    Add a Game Mode or manager Blueprint that holds an int, binds to the coin's OnCollected dispatcher, and increments on each collect. Create a UMG Widget Blueprint with a Text block, add it to the viewport on BeginPlay, and bind the text to the score so it updates whenever the value changes.

  5. Wire a win state

    Count total coins at BeginPlay (Get All Actors of Class); when collected equals total, flip to a win: show a "You win" UMG panel and disable input. A loop needs an ending — without a resolve condition you have an activity, not a game.

  6. Add the pop

    Before the coin destroys itself, scale it up and back over ~150 ms — a Timeline node driving Set Actor Scale is the clean way. This squash-and-pop is the single highest-value piece of juice: it puts a punctuation mark on the exact frame of contact.

  7. Add particles and sound

    Spawn a short Niagara burst at the coin's location and play a pickup cue with Play Sound at Location. Two extra senses now confirm the same event. Tune the volume and particle count down until it feels crisp rather than busy.

  8. Play, feel, lock it in

    Play the whole loop: walk over coins, watch the score climb with a pop-burst-sound on each, hit the win state. Adjust one timing value until it feels right, then save and zip a dated backup. Trust your gut here — if it feels good, it is good.

Wed 2:00 · Agent lab Two agents, one pickup, a hiring decision

You now know exactly what a satisfying coin pickup takes. Give the identical task to two agents and judge them like you're deciding who to hire.

Prompt 1 · Head-to-head: add a coin pickup with a satisfying pop
In this UE 5.8 project, add a coin pickup: an overlap volume that detects the player, broadcasts an Event Dispatcher on collection, increments a score shown in a UMG widget, and gives it a satisfying pop — a scale punch via a Timeline, a Niagara burst, and a sound — before the coin is destroyed. Explain your approach and each decision as you go.

Give this same prompt to both Claude Code and the Codex CLI, each in its own copy of the project so the results stay separate. Compare three things: the approach (dispatcher vs. interface, structure), correctness (does it compile and feel good in Play In Editor), and how clearly each one explains itself. Write up which you'd hire and why — cite specific nodes, not vibes.

Before you call it done

Wed 3:10 · Crit / share Whose coin feels best?

Everyone plays their loop on the projector and we do a blind gut-check: which pickups actually feel good, and why? We pull apart the timing — was the pop too slow, the sound too loud, the particles too much? Then each person delivers their hiring verdict from the AI lab: Claude Code or Codex for this task, and the specific evidence. The lesson lands when the room realizes two correct solutions can feel completely different, and that the difference is craft you control — not something the agent decides for you.

Homework — due before Week 12

TaskDeliverable
Fold the collectible loop into your Project 3 vertical slice with tuned juice.A level where the loop plays start to win, with a clip.
Add one more feedback layer of your choice — screen shake, a UI number bump, a combo counter.The new feedback working in the level, plus a note on the timing you chose.
Prep your vertical slice to present next week and bring a final-project idea to pitch.A one-paragraph final pitch drafted in your process log.

Resources