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


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 .apk output.

2. Create the Unreal project

Epic Games Launcher → Unreal Engine 5.8 → Launch → Games:

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_Move and IA_Jump exist, IMC_Default binds 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:

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


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.