Exercise 2 — The Verb

GAME 1303-002 · Unreal Engine 5.8 · 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 packaged 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, action, 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 games
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. VR track: Grab — it is the foundational VR verb, and everything else builds on it.

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

Place Actors → Basic → Cube. Scale it to (20, 4, 0.2) for a long floor. Name it Ground.

Turn on grid snapping in the viewport toolbar and set it to 50 — greyboxing without snapping wastes twenty minutes on alignment nobody will ever see.

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

Use cubes. Do not make art today.

3. Add a reset key

Drag BP_GameState from the helper pack into the level. Set its 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 level.


Part 3 — Implement the verb (30 min)

4. Create the input action

Right-click Content/Input/ → Input → Input Action:

Verb Asset Value Type Bindings in IMC_Default
Dash IA_Dash Digital (bool) Left Shift · Gamepad Right Trigger
Grab / Throw IA_Grab Digital (bool) E · Gamepad Face Button Left
Shoot IA_Fire Digital (bool) Left Mouse Button · Gamepad Right Trigger
Swap IA_Swap Digital (bool) Q · Gamepad Face Button Top
Grapple IA_Grapple Digital (bool) Left Mouse Button · Gamepad Right Shoulder
Interact IA_Interact Digital (bool) E · Gamepad Face Button Bottom

Add it to IMC_Default and save both assets.

5. Wire it up

Dash — add the BPC_Dash component to BP_Player. In the Event Graph:

EnhancedInputAction IA_Dash (Started)
  → BPC_Dash → Try Dash

Tune DashSpeed, DashDuration, DashCooldown on the component's Details.

Grab / Throw — add BPC_Grabber. Wire IA_Grab (Started) → Toggle Grab. Set GrabRange, HoldOffset, ThrowForce. Grabbable actors need Simulate Physics ✔ and the Grabbable tag.

Shoot — add BPC_Shooter. Make a projectile Blueprint: Sphere mesh + Projectile Movement component + Sphere Collision set to generate overlap events + the BP_Projectile parent. Save into Content/Blueprints/, assign to BPC_Shooter's ProjectileClass. Tune ProjectileSpeed, FireRate, Lifetime.

Swap — add BPC_Swapper. Set SwapRange and SwapTargetTag; tag your swappable actors to match.

Grapple — add BPC_Grappler. It needs a Cable Component on BP_Player for the visible line. Set MaxRange, PullSpeed, AnchorTag.

Interact — add BPC_Interactor to BP_Player, and the BPI_Interactable interface to each object. Implement On Interact on each actor with whatever should happen — move a platform, toggle visibility, print a string.

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 restore your movement values.

9. Write your notes

Docs/Ex02_notes.txt:

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

DashSpeed:    2400
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 Max Walk Speed 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 — Package and submit (5 min)

10. Package

Platforms → Windows → Package Project into MyGameName/PC_Builds/Ex02/.

Start the package before you write your notes — it takes several minutes and you can work while it runs.

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 Packaged build runs · the verb fires on input and works · three escalating tests exist and are completable · no blueprint or output-log 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.
The new Input Action must be added to IMC_Default, and both assets saved. Confirm the EnhancedInputAction node in the Event Graph is the right event — most verbs want Started, not Triggered.

The dash goes through walls.
On the collision component, set CCD (Use CCD) ✔. Fast movement tunnels through thin collision without continuous detection.

Grabbed objects fling wildly.
The BPC_Grabber should set Simulate Physics off while held. Confirm DisablePhysicsWhileHeld ✔ on the component.

Projectiles never disappear.
Lifetime is 0, or the projectile has no Initial Life Span. Set it to 2–3 seconds. Left running, you will have 4,000 of them and a frozen editor.

"Accessed None trying to read property..."
Something in your graph is null — usually a component reference you never assigned, or a cast that failed. Double-click the error in the Message Log; it jumps to the node.

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, Niagara, sound, and camera 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 level. Keep the project — you will open it again. Your One Sheet is also due next week in Canvas.