Exercise 1 — First Playable
GAME 1303-002 · Unreal Engine 5.8 · Week 1 — Tuesday, August 25
In class, 10:30 – 11:45 · 2 points · Submit by end of class
The skill
Every game is a loop of input → response. Before you can design how a game feels, you have to be able to get a thing on screen and make it answer the player. That's today.
You will also set up the project conventions you use for the next fifteen weeks. Ten minutes of folder discipline now saves hours in November.
By the end of the block you will have: a character on screen that moves with both keyboard and gamepad, tuned by you, running in a packaged build.
What you need
- Unreal Engine 5.8, installed via the Epic Games Launcher
GAME1303_Helperscontent pack — Canvas → Files → HelperScripts- One sprite or texture. Yours, drawn in the first hour, or the provided
placeholder_character.png. A 32×32 square with a face on it is completely acceptable today. - A gamepad if you have one. Lab has a few.
Part 1 — Project setup (15 min)
1. Make your project folder first
Before you open Unreal, make a folder for the whole project — not just the Unreal part:
MyGameName/ ← everything about your game lives here
Docs/ ← One Sheet, Game Design Doc, level maps
PC_Builds/ ← packaged Windows builds
Put it somewhere that is not a synced cloud folder — OneDrive and Dropbox corrupt Unreal's Intermediate and Saved folders.
This structure matters all semester. Your packaged builds and your documents live beside the Unreal project, never inside it. A build placed inside Content/ gets scanned by the editor, which is slow, messy, and bloats your project.
VR tracks add a
Quest_Builds/folder for.apkoutput.
2. Create the Unreal project
Epic Games Launcher → Unreal Engine 5.8 → Launch → Games:
- 2D / Puzzle / Narrative tracks: Blank template, Blueprint, Starter Content off
- 3D / VR tracks: Third Person template, Blueprint, Starter Content on
Name it MyGameName_Unreal and set the location to your MyGameName/ folder.
You should now have:
MyGameName/
MyGameName_Unreal/ ← Unreal made this
Content/
Config/
Intermediate/ ← never back up
Saved/ ← never back up
Docs/
PC_Builds/
3. Enable Paper2D (2D tracks only)
Edit → Plugins → search Paper 2D → enable → restart the editor.
4. Make your Content folders
In the Content Browser, inside Content/, create exactly this:
Content/
Art/
Audio/
Input/
Blueprints/
Maps/
UI/
Everything you make goes in one of these. Imported packs and plugin content will add their own folders alongside — that's fine, leave them alone. In Week 13, when your project has 400 assets, this is the only reason you'll be able to find anything.
5. Import the helpers
Right-click in the Content Browser → Migrate the GAME1303_Helpers pack in, or drag the provided .uasset files into Content/Blueprints/.
6. Save your level
Content/Maps/Sandbox. Save it now, and press Ctrl+S every time you look up from the screen for the rest of the semester.
✅ Checkpoint 1 — folders exist, helpers imported, level saved with a name.
Part 2 — The character (10 min)
7. Import your art
Drag your PNG into Content/Art/.
8. Set the import settings
Double-click the texture. In the Texture Editor:
| Setting | Value |
|---|---|
| Compression Settings | UserInterface2D (RGBA) |
| Filter | Nearest for pixel art · Default for smooth art |
| Texture Group | UI or 2D Pixels |
| sRGB | ✔ |
Save.
2D tracks: right-click the texture → Sprite Actions → Create Sprite. Open the sprite and set Pixels Per Unit = 1 under Sprite → Rendering, then note your character's height in Unreal units.
Unreal's world unit is 1 cm. A human character is about 180 units tall. Whatever scale you choose today, write it down and do not change it later — every speed and distance you tune from here is expressed in these units, and changing the scale silently invalidates all of them.
9. Create the pawn
2D tracks: right-click Content/Blueprints/ → Blueprint Class → Character. Name it BP_Player. Open it, delete the default Mesh usage, and Add Component → Paper Sprite, assigning your sprite. Set the sprite's rotation to (0, 0, -90) so it faces the camera in a side-on setup.
3D / VR tracks: use the template's existing BP_ThirdPersonCharacter, or duplicate it into Content/Blueprints/ as BP_Player.
10. Place it and possess it
Drag BP_Player into the level at 0, 0, 100.
Select it → Details → Pawn → Auto Possess Player → Player 0.
✅ Checkpoint 2 — the character is visible in the viewport, at a sensible scale, and possessed on Play.
Part 3 — Enhanced Input (20 min)
Unreal 5.8 uses Enhanced Input. Do not use the legacy Project Settings → Input axis mappings — they are deprecated, and they are not accepted in this course.
11. Create the Input Actions
Right-click Content/Input/ → Input → Input Action. Make two. The names must match exactly — the helper Blueprint looks for them.
| Asset | Value Type |
|---|---|
IA_Move | Axis2D (Vector2D) |
IA_Jump | Digital (bool) |
12. Create the Mapping Context
Right-click Content/Input/ → Input → Input Mapping Context. Name it IMC_Default. Open it.
Add IA_Move with four keyboard bindings plus the stick:
| Key | Modifiers |
|---|---|
W | Swizzle Input Axis Values → YXZ |
S | Swizzle Input Axis Values → YXZ · Negate |
A | Negate |
D | (none) |
Gamepad Left Thumbstick 2D-Axis | (none) |
The Swizzle and Negate modifiers are how four separate keys become one Vector2. W and S drive the Y axis, so they get swizzled; S and A point backwards, so they get negated. This is Unreal's equivalent of Unity's 2D composite, and it trips up everyone the first time.
Add IA_Jump with Space Bar and Gamepad Face Button Bottom.
Save both assets.
13. Add the mapping context to the player
Open BP_Player → Event Graph → from Event BeginPlay:
Event BeginPlay
→ Get Controller → Cast To PlayerController
→ Get Enhanced Input Local Player Subsystem
→ Add Mapping Context (Mapping Context: IMC_Default, Priority: 0)
Compile and Save. Without this node, no input reaches your character at all — it's the single most common reason a first Unreal setup does nothing.
✅ Checkpoint 3 —
IA_MoveandIA_Jumpexist,IMC_Defaultbinds keyboard and gamepad, and the mapping context is added on BeginPlay.
Part 4 — Movement (20 min)
14. Wire the movement
In BP_Player's Event Graph, either add the BP_PlayerMove component from the helper pack, or wire it directly:
EnhancedInputAction IA_Move (Triggered)
→ Action Value (Vector2D) → Break Vector2D
→ Add Movement Input (World Direction: Right Vector, Scale: X)
→ Add Movement Input (World Direction: Forward Vector, Scale: Y)
EnhancedInputAction IA_Jump (Started)
→ Jump
2D side-scrolling: use only the X output, and set Character Movement → Plane Constraint → Constrain to Plane ✔ with a plane normal of (0, 1, 0).
15. Press Play
Your character should move. If it doesn't, jump to Troubleshooting below.
16. Tune it — this is the graded part
Select BP_Player → Character Movement (CharMoveComp) in the Details panel:
| Value | What it does | Try |
|---|---|---|
Max Walk Speed | Top speed in cm/s | 200, then 600, then 1200 |
Max Acceleration | How fast you reach top speed | 500, then 4000 |
Braking Deceleration Walking | How fast you stop | 500, then 4000 |
Jump Z Velocity | Jump strength | 300, then 900 |
Gravity Scale | Fall weight | 1, then 2.5 |
Play with each at both extremes before settling. Notice that acceleration changes the feel far more than speed does — high speed with low acceleration feels like ice, low speed with high acceleration feels responsive and heavy.
⚠️ Values changed during Play In Editor reset when you stop. Once you find numbers you like, stop, and set them on the Blueprint's defaults so they persist.
17. Write down your decision
In your MyGameName/Docs/ folder, make a text file Ex01_notes.txt with:
World scale: character = 180 uu tall
Max Walk Speed: 520
Max Acceleration: 3000
Braking Deceleration Walking: 2600
Jump Z Velocity: 620
Gravity Scale: 1.8
Why: I wanted it to feel responsive but weighty, like Celeste rather
than Mario. 600 overshot my platforms, so I dropped to 520 and raised
acceleration to 3000 so it reaches top speed almost instantly without
actually being fast. Gravity 1.8 makes the fall snappier than the rise.
Three sentences minimum, naming a specific reference or intention. This paragraph is one of your two points. "I made it feel good" earns nothing; the example above earns full marks.
✅ Checkpoint 4 — movement works on keyboard and gamepad, values are deliberately set on the Blueprint defaults, notes written.
Part 5 — Package and submit (10 min)
18. Package it
Platforms → Windows → Package Project.
Package into MyGameName/PC_Builds/Ex01/.
This is why PC_Builds/ sits beside the Unreal project rather than inside it — the editor never scans it, and you can zip it without dragging the whole project along.
Set your startup map first: Edit → Project Settings → Maps & Modes → Game Default Map → Sandbox. Otherwise you package an empty level.
Packaging today, in Week 1, on a project with one character in it, is deliberate. The first package always surprises someone, and it's much better that it happens now than in Week 15. It also takes several minutes — start it and write your notes while it runs.
19. Record it
15–30 seconds of screen capture showing the character moving. Use the Windows Game Bar (Win+G), OBS, or your phone pointed at the monitor. Quality is not graded.
20. Submit
Zip these three things as lastname_ex01.zip:
PC_Builds/Ex01/— the whole folder- Your recording
Docs/Ex01_notes.txt
Canvas → Assignments → Exercise 1. Due before you leave.
Rubric — 2 points
| Criterion | Pt | Met when |
|---|---|---|
| Implementation | 1 | Packaged build runs · character moves on keyboard and gamepad · no blueprint or output-log errors · texture import and world scale set deliberately |
| Design decision | 1 | Movement values deliberately changed from defaults, saved on the Blueprint, written down, with a stated intention or reference naming what you were going for |
Both are met-or-not-met. Late submissions earn the Implementation point only.
Troubleshooting
Nothing moves.
Check, in order: the Add Mapping Context node is wired to BeginPlay; IMC_Default is the context selected there; the character is set to Auto Possess Player 0; your IA_Move bindings have the right Swizzle and Negate modifiers; you saved both input assets.
The character moves in only one direction, or diagonally when it shouldn't.
Your Swizzle/Negate modifiers. W and S need Swizzle YXZ; S and A need Negate.
The character moves but won't jump.
IA_Jump must be bound on the Started trigger, not Triggered. Check that Character Movement's Jump Z Velocity isn't 0.
The character falls forever.
There's no floor. Place a cube or a Landscape under it, or Add Component → Box Collision on a placed actor.
The sprite is invisible or faces the wrong way (2D tracks).
Paper Sprite component rotation should be (0, 0, -90) for a side-on camera. Check the sprite's material is a translucent unlit sprite material.
The packaged build opens an empty level.
Project Settings → Maps & Modes → Game Default Map.
Blurry pixel art.
Texture → Filter → Nearest, Compression → UserInterface2D (RGBA), Mip Gen Settings → NoMipmaps.
If you finish early
- Test the gamepad properly and adjust the stick deadzone in the Input Action's modifiers.
- Add an
IA_Dashaction and wire it to a Launch Character node. - Set your character's scale to half and observe what happens to every value you just tuned. This is why you don't change scale later.
- Open the helper
BP_PlayerMoveand read the graph. You are not expected to build this, but you should be able to find the node that applies walk speed.
Before next week
Week 2 is your Game Pitch, live, three minutes. Bring a reference image and, if you're pitching a puzzle game, a paper prototype. See milestone-1-game-pitch.md.