Exercise 4 — Juice It
GAME 1303-002 · Unreal Engine 5.8 · Week 6 — Tuesday, September 29
In class, 10:30 – 11:45 · 2 points · Submit by end of class
The skill
Take the mechanic you built in Ex 2. Change none of its values. Make it feel ten times better.
Everything you add today is feedback — the game telling the player what just happened. Feedback is not decoration. A player who cannot tell whether their input registered will assume your game is broken, and they will be right to.
The trade secret is that game feel is almost entirely feedback, not physics. Two games with identical movement values can feel like a wet sponge and a rifle bolt. The difference is what happens in the 200 milliseconds around the input.
By the end of the block you will have: the same action from Ex 2, rebuilt with five layers of feedback, and a before/after recording that proves it.
What you need
- Your Ex 2 / Ex 3 project
- Three or four sound effects. Grab free ones from freesound.org or make them in sfxr/jsfxr — jsfxr takes about ten seconds per sound and is genuinely how a lot of shipped indie games got their audio.
Part 1 — Record the "before" (5 min)
1. Capture your baseline
Record 10 seconds of your Ex 2 verb, unchanged. Do this first. In forty minutes you will have lost all perspective on what it used to feel like, and this clip is half your submission.
Save as Docs/Ex04_before.mp4.
✅ Checkpoint 1 — a "before" clip exists, before you change anything.
Part 2 — The five layers (45 min)
Add them in this order, testing after each one. The order matters: it goes from most to least important, so if you run out of time you will have added the layers that count.
2. Layer 1 — Anticipation and follow-through (the most important, and the one everyone skips)
Nothing in nature moves instantly from rest to full speed. Add a wind-up before the action and a settle after it.
- Simplest version, no animation assets needed: animate scale with a Timeline node in
BP_Player. - Squash to
(1.15, 0.85, 1)for 0.05s before the action, stretch to(0.85, 1.15, 1)during it, return to(1,1,1)over 0.1s after. - Add a Timeline, add a Vector track, set the keys, and drive Set Relative Scale 3D on your mesh or sprite component.
Three frames of squash and stretch will do more for your game than any particle effect.
3. Layer 2 — Sound
Drag BP_SoundPlayer into your level.
Fill the Sounds array with entries named exactly: jump, dash, impact, grab — whichever your verb uses. The helper Blueprints already call those names, so the moment you fill them in, your existing graphs start making noise with no extra wiring.
Import your .wav files, then right-click each → Create Cue so you can add modulation later.
Set pitchVariance to 0.08. Then set it to 0 and press the action ten times in a row. That fatigue you just felt is what your players would have felt for an hour.
4. Layer 3 — Particles
Right-click Content/GAME1303/Feedback/ → FX → Niagara System → New system from a template → Simple Sprite Burst. Name it NS_Impact.
Settings that matter for a short burst:
- Emitter State → Loop Behavior Once, Loop Duration
0.5 - Spawn Burst Instantaneous → Spawn Count
8 - Initialize Particle → Lifetime
0.3, Sprite Size10 - Shape Location → Cone, Angle
25
Spawn it with Spawn System at Location at the moment of the action. If your verb uses BPC_Shooter, assign it to ImpactEffect instead.
5. Layer 4 — Screen shake
The helper pack ships CS_Hit, a Legacy Camera Shake asset. Call it with
Get Player Camera Manager → Start Camera Shake (CS_Hit, Scale 1.0) at your impact moment.
BPC_Dash and the other verb components already call it. Set GlobalScale on BPC_ScreenShake to 1 and play.
Now the important part: it is almost certainly too strong. Turn GlobalScale down until you can barely tell it's there, then leave it there. Good shake is felt, not seen. If a viewer would describe your game as "shaky", you have overdone it by roughly a factor of five.
6. Layer 5 — Hit-stop
The single most effective trick in action games: freeze the entire game for 2–4 frames at the moment of impact.
Make a custom event HitStop in BP_Player:
HitStop (input: Duration Float)
→ Set Global Time Dilation (0.05) // near-zero, not 0.0
→ Delay (Duration) // see the warning below
→ Set Global Time Dilation (1.0)
The trap: a
Delaynode runs on dilated time, so at a dilation of exactly 0.0 the
delay never completes and your game locks up. Use 0.05 rather than 0, and multiply
your delay accordingly — or use Set Timer by Event with Use Server Time / a
real-time timer instead.
Try 0.03, 0.08, and 0.2. At 0.2 it feels broken. Somewhere around 0.05 it feels like impact.
✅ Checkpoint 2 — all five layers present and the action feels different.
Part 3 — Subtract (15 min)
7. Remove one layer at a time
This is the graded part. Turn each layer off, one at a time, and play. Ask: did the game get worse?
You will find that at least one layer is contributing nothing, and that one layer is doing most of the work. Almost always the heavy lifter is anticipation or sound, and almost always the passenger is particles.
Cut anything that isn't earning its place. More feedback is not better feedback — a game where everything shakes, flashes, and pops is a game where the player cannot tell what matters.
8. Record the "after" and write it up
Record the same 10 seconds. Save as Docs/Ex04_after.mp4.
Docs/Ex04_notes.txt:
Verb: Dash
Layers added:
1. Anticipation squash 1.15/0.85 for 0.05s before, stretch during
2. Sound "dash" whoosh, pitchVariance 0.08
3. Particles 8-particle cone burst at the start point
4. Shake globalScale 0.35 (started at 1.0, way too much)
5. Hit-stop 0.045s on landing a dash through a hazard
Which layer did the most: hit-stop. Without it the dash reads as a
slide; with it, it reads as a punch through something.
What I cut and why: particles. With sound and hit-stop already
selling the impact, the burst just added visual noise that made it
harder to see where I landed. Cutting it made the dash MORE readable.
No movement values changed from Ex 2.
The "what I cut and why" line is the point of the exercise. An exercise that adds five layers and keeps all five usually hasn't examined any of them.
✅ Checkpoint 3 — at least one layer cut deliberately, with a stated reason.
Part 4 — Build and submit (10 min)
9. Build
Into MyGameName/PC_Builds/Ex04/.
10. Submit
Zip as lastname_ex04.zip: the build, Ex04_before.mp4, Ex04_after.mp4, Docs/Ex04_notes.txt.
Canvas → Assignments → Exercise 4.
Rubric — 2 points
| Criterion | Pt | Met when |
|---|---|---|
| Implementation | 1 | Build runs · at least four feedback layers present and firing on the action · no console errors · movement values unchanged from Ex 2 |
| Design decision | 1 | Before and after clips submitted · at least one layer deliberately cut · notes name which layer did the most work and why the cut one was removed |
Troubleshooting
The game freezes permanently after hit-stop.
Your Global Time Dilation hit exactly 0.0 with a Delay node waiting on dilated time. Use 0.05, or switch to a real-time timer.
Particles don't appear.
Confirm the Niagara emitter's Loop Behavior is Once and that you used Spawn System at Location, not Attached. In a 2D setup, check the system isn't spawning behind the sprite plane — nudge its Y.
No sound.
Sound names in BP_SoundPlayer must match exactly. Confirm the Cue is assigned, MasterVolume isn't 0, and your level has an Audio Listener (the player camera provides one).
Camera shake does nothing.
Start Camera Shake needs the Player Camera Manager, not the camera component. Get Player Controller → Get Player Camera Manager.
Squash and stretch snaps back instantly.
A Timeline stops when its owning Blueprint's graph re-enters it. Use Play from Start and let it complete, or drive scale from a Tick lerp instead.
If you finish early
- Add a screen flash — a full-screen white UMG border, opacity punched for 0.05s.
- Add camera lag: on your Spring Arm, enable Enable Camera Lag and set Camera Lag Speed to 5. One checkbox and the whole game feels heavier.
- Show a build to the person next to you and ask them to describe the action in one word. If the word isn't the one you were going for, your feedback is telling a different story than your mechanic.
Before next week
Ex 5 — Space & Pace: you build a real level with a gate, a key, and a checkpoint. It feeds the Level Map milestone in Week 8, so what you make next week is the beginning of what you submit the week after.