Exercise 2 — The Verb

GAME 1303-001 · Unity 6.x · Week 3 — Tuesday, September 8
In class, 10:30 – 11:45 · 2 points · Submit by end of class


The skill

Every game has one verb it is actually about. Mario is jump. Portal is place-a-hole. Tetris is rotate-and-drop. Everything else in those games exists to make that one verb interesting.

Beginning designers add verbs. Experienced designers remove them until one is left, then spend all their time making that one feel extraordinary.

Today you pick your verb, build it in isolation, and tune it until it feels like something. Not your whole game — one action, on a bare test course.

By the end of the block you will have: one mechanic, working, tuned, in a build, that a stranger can feel the quality of in ten seconds.

This exercise and Ex 3 — Rules & States together feed Milestone 2 — Core Game Mechanic (Week 5). What you build today is the thing you will demo in two weeks.


What you need


Part 1 — Choose your verb (10 min)

Pick one. It should be the verb from your Week 2 pitch. If your pitch didn't have one, that's useful information — pick the closest and talk to me during lab.

Verb What it is Good for
Dash A burst of speed in a direction, with a cooldown Platformers, bullet-hell, anything about momentum
Grab / Throw Pick an object up, carry it, throw it Puzzle, physics games, Portal-likes
Shoot Spawn a projectile that travels and hits Shooters, tower defense, action
Swap Trade places with an object or a marker Puzzle, teleport-based movement
Grapple Attach to a point and pull toward it Traversal, momentum platformers
Interact Context-sensitive use of the thing you're facing Narrative, adventure, walking sims

Narrative track: Interact is your verb. Puzzle track: usually Swap or Grab.

Write your verb at the top of a text file now. One sentence: "The player dashes through hazards that would otherwise kill them."


Part 2 — Build a test course (15 min)

A verb can't be evaluated in an empty room. Build the smallest possible space that makes it matter.

1. Make the ground

Empty GameObject → Box Collider 2D, scaled into a long floor. Add a Sprite Renderer with a plain square if you want to see it. Name it Ground.

2. Add three tests

Three obstacles, each slightly harder than the last, spaced along the floor:

Verb Your three tests
Dash Three gaps: one you can jump, one you must dash, one needing dash + jump
Grab / Throw A block to carry to a target · a gap to bridge with the block · a switch to hit by throwing
Shoot A close target · a distant target · a moving target
Swap A swap to cross a gap · a swap through a wall · a swap onto a moving platform
Grapple A ceiling anchor · a swing across a gap · two anchors in sequence
Interact Three objects that respond differently — a door, a note, a lever

Greybox only. Coloured rectangles. Do not make art today.

3. Add a reset key

Select your Player → add the GameStateManager helper to an empty GameObject named GameManager. Set Restart Key to R.

You will press R several hundred times in the next hour. Set it up now.

✅ Checkpoint 1 — a floor, three escalating obstacles, and R restarts the scene.


Part 3 — Implement the verb (30 min)

4. Add the input action

Open Assets/Input/PlayerControls. In the Gameplay map, add one action named for your verb:

Verb Action name Type Bindings
Dash Dash Button Left Shift · Right Trigger [Gamepad]
Grab / Throw Grab Button E · Button West [Gamepad]
Shoot Fire Button Left Mouse · Right Trigger [Gamepad]
Swap Swap Button Q · Button North [Gamepad]
Grapple Grapple Button Left Mouse · Right Bumper [Gamepad]
Interact Interact Button E · Button South [Gamepad]

Click Save Asset. Same trap as last week.

Because Player Input is set to Send Messages, an action named Dash automatically calls a method named OnDash. The name is the wiring — there is nothing else to connect.

5. Wire it up

Dash — already in the helper. On PlayerMove2D, set enableDash ✔. Tune dashSpeed, dashDuration, dashCooldown.

Grab / Throw — add the Grabber helper to Player. Set grabRange, holdOffset, throwForce. Tag objects you can pick up as Grabbable — add a Rigidbody2D and Collider2D to each.

Shoot — add the Shooter helper to Player. Make a projectile prefab: sprite + Rigidbody2D (Gravity Scale 0) + Collider2D set to Is Trigger + the Projectile helper. Save it into Assets/Prefabs/, then assign it to Shooter's projectilePrefab. Tune projectileSpeed, fireRate, lifetime.

Swap — add the Swapper helper. Set swapRange and swapTargetTag. Tag your swappable objects to match.

Grapple — add the Grappler helper. It needs a LineRenderer on the same GameObject. Set maxRange, pullSpeed, anchorTag.

Interact — add the Interactor helper to Player and the Interactable helper to each object. On each Interactable, hook its OnInteract UnityEvent in the Inspector to whatever should happen — move a platform, enable an object, print a line.

6. Press Play and get it working

Do not tune yet. Get it functioning first, then stop and move to Part 4.

✅ Checkpoint 2 — the verb fires on input and does something visible. All three tests are completable, even if it feels bad.


Part 4 — Tune it, then subtract (15 min)

7. Tune against a reference

Name a game whose version of this verb you admire. Open it if you have it. Then tune yours toward it.

For every verb there are three questions:

Question The value
How long does it last? dashDuration, lifetime, pullSpeed
How often can I do it? dashCooldown, fireRate, grabRange
How much does it commit me? Can you steer mid-dash? Cancel a throw? Move while shooting?

The third one is where the design lives. A dash you can steer is a movement option; a dash you cannot steer is a decision. Neither is better — but you must choose, on purpose.

8. Run the subtraction test

Turn off everything except your verb.

If the answer is yes to either, your verb isn't carrying the game yet — the movement is. Change the obstacles until the verb is required. This is a design decision, not a bug, and it's the one this exercise is really about.

Then turn movement back on.

9. Write your notes

Docs/Ex02_notes.txt:

Verb: Dash — "The player dashes through hazards that would otherwise kill them."

dashSpeed:    22
dashDuration: 0.15
dashCooldown: 0.6
Steerable mid-dash: NO

Reference: Celeste. I wanted the dash to be a commitment, not a
steering tool, so I locked direction at the moment of input. At 0.25s
duration it felt floaty and forgiving, so I cut it to 0.15 — now you
have to aim before you press, which makes the third gap actually
tense instead of automatic.

Subtraction test: with moveSpeed 0 I could not clear gaps 2 or 3.
Gap 1 was still jumpable, so I widened it.

The subtraction test result is required in your notes. It is the difference between a full and half score on the design point.

✅ Checkpoint 3 — values tuned deliberately, subtraction test run and course adjusted, notes written.


Part 5 — Build and submit (5 min)

10. Build

File → Build Profiles → Windows → Build into MyGameName/PC_Builds/Ex02/.

11. Record

15–30 seconds showing all three tests being completed with your verb.

12. Submit

Zip as lastname_ex02.zip:

Canvas → Assignments → Exercise 2. Due before you leave.


Rubric — 2 points

Criterion Pt Met when
Implementation 1 Build runs · the verb fires on input and works · three escalating tests exist and are completable · no console errors
Design decision 1 Values tuned with a named reference · the commitment question answered on purpose · subtraction test run, result recorded, course adjusted if needed

Troubleshooting

The action does nothing.
Action name must match the method name — Dash → OnDash. Check spelling and capitalisation, confirm the action is in the Gameplay map, and click Save Asset.

The dash goes through walls.
Rigidbody2D → Collision Detection → Continuous. Fast-moving objects tunnel through thin colliders on Discrete.

Grabbed objects fling wildly.
Set the held object's Rigidbody2D.isKinematic true while held — the Grabber helper does this if disablePhysicsWhileHeld is ✔.

Projectiles never disappear.
Projectile.lifetime is 0. Set it to 2–3 seconds. Left running, you will have 4,000 of them and a frozen editor.

The verb feels laggy.
Check you are not applying it in FixedUpdate with a low physics timestep, and set Rigidbody2D → Interpolate → Interpolate.

Everything works but feels like nothing.
That's normal, and it's the whole point of Week 6 (Ex 4 — Juice It), where you add animation, particles, sound, and shake to this exact mechanic. Today is about the underlying values.


If you finish early


Before next week

Ex 3 — Rules & States builds win and lose conditions onto this exact scene. Keep the project — you will open it again. Your One Sheet is also due next week in Canvas.