GAME 1303 Instructor Handbook


Companion documents


The teaching content from the eight tier READMEs, consolidated. The tier folders were a delivery mechanism; the project is now the source of truth, but this material isn't in the Deployment Guide and is worth keeping.

Part 1 — The seven ideas worth teaching

Each tier has one concept that, once a student has it, makes the rest of that tier obvious. These are the whiteboard moments.

1. Events connect things, not code

Tier 1's spine is UnityEvents. Health.OnDied doesn't know what a RespawnManager is; you connect them in the Inspector. That's why the twelve wirings in Deployment Guide §5 exist, and why roughly three quarters of "it doesn't work" is a missing connection rather than a bug.

Teach it by deliberately leaving one unwired and asking why nothing happens.

2. Hurtbox vs Hitbox

The one idea to teach before any combat.

Keeping them separate lets a hurtbox be smaller than the sprite (fairer), lets a boss have a weak point, and — with the Physics 2D matrix set so Hitbox only meets Hurtbox — means hit detection never interferes with movement collisions.

Tier 1's DamageOnContact is still right for hazards. Hitbox/Hurtbox is for anything that fights back.

3. Modules negotiate over one button

PlayerInput in Send Messages mode calls OnJump on every component of the player. So DoubleJump, WallSlideJump, LadderClimber, RailRide and GrapplingHook all hear the same press and defer to each other in a fixed order: the controller if grounded or in coyote time, then wall jump, then ladder, then double jump.

Whichever module owns the body sets controller.MovementLocked = true so the base controller stops writing velocity, and clears it when done. That's the entire coordination mechanism — no state machine, no manager.

4. A hazard is a toggled damage component

Trigger collider + DamageOnContact + something switching that component on and off. Once students see this, they can build any trap in their pitch without new code.

Want Build
Always-deadly spikes / acid Trigger + DamageOnContact (Instant Kill) — no hazard script needed
Bottomless pit KillZone under the level
Timed flame jet CyclingHazard + a particle system
Electric arc that stuns ElectricZone
Pop-up spikes SpikeTrap, Timed or Triggered
Ceiling shock ElectricZone, Always On, wide thin trigger
Slamming piston Crusher (auto-measures its drop)
Saw blade SpinningSaw + MovingPlatform to patrol

The fairness rule: every timed hazard has a Warning Time with a shake or warning sprite. A trap the player couldn't have anticipated isn't difficulty, it's a coin flip. Nicholas's whole game rests on this.

5. Grid movement lives or dies on queued input

GridMover finishes each step before starting the next, and remembers one press made during a step. That single detail separates a grid game that feels responsive from one that seems to eat your inputs. If a student says "it ignores my presses," they're reading input per-frame instead of queueing.

6. Everything narrative shares one memory

Every Tier 6 system reads and writes flags through ChoiceFlagManager. A dialogue line sets met_the_ghost; a door requires it; a WorldStateSwapper repaints the room; an EndingSelector checks it at the end. Students never wire narrative systems to each other — they agree on flag names.

Name your flags before building anything. Lowercase with underscores, on the whiteboard. HasAll("found_key, !alarm_tripped") handles compound conditions with negation, same syntax everywhere.

7. Levels can be text

MazeLoader turns a block of characters into a level. Iterating a maze in the Scene view is slow; editing seven lines of text is instant, versionable, and pasteable from a spreadsheet.

###########
#....T....#
#.###.###.#
#....P....#
#.###.###E#
###########

Worth demoing to the whole class, not just the maze students.


Part 2 — Design conversations worth having

These came out of reading the pitches. Each is a real decision the student should make consciously.

Lazaro — Apep's Trial. Prototype the 3D↔2D camera switch on a flat grey box level before any art or level design. The mechanic either feels good or it doesn't, and he wants to know in week two, not week ten. Also: use the trigger's Reposition Player field to snap onto the 2D plane — ending up off-plane and appearing to walk into the background is the classic bug in this genre.

Chris — Last Delivery. His pitch says monsters "steal the food," so DeliveryObjective treats cargo, not health, as the resource. A hit drops food you scramble to recover; arriving empty fails the delivery. That gives tension without combat, which suits a delivery robot better than a health bar. He can add Health.OnDamaged → LoseOne if he wants both.

Fozaan — MythoClash. Skipping should feel like a real temptation, which means the risk must be visible. OnThreatLevelChanged exists so the UI can show "threat rising." A gamble the player can't see isn't a decision. Also: pick one currency system — ExperienceWallet or Tier 4's unlock costs. Two things meaning "Drachma" is a bug factory.

Rhys — Cozy Critters. He was explicit that the pet must not die from inattention, so nothing in Tier 7 can kill it. NeedStat decay is per minute: at the default 3/min a full bar lasts over half an hour. Low needs make the pet slower and sadder, never dead. PersonalityTracker is descriptive, not a score — there's no wrong personality, which is what keeps it cozy.

Mena — Detective Liz. The dilemma that makes the game: the flashlight recharges only while standing still, and standing still in the dark fills the dread meter. Also, LightSensitiveEnemy is deliberately separate from the beam's Hitbox — the interesting part isn't damage, it's that ghosts behave differently in light. That's what makes the flashlight a tool rather than a gun.

Tony — Zap Attack and Sanad — Store Simulator are the two largest scopes in the class (40+ levels with online leaderboards; 3D with AI customers and an economy). Worth an early conversation about a vertical slice.

Nicholas — Cutthroat Course is the smallest complete game and the best first full build for anyone. Tier 1 + Tier 4 and nothing else.

Sylvia — Commission Witch. Her three brew grades feed brews_perfect / brews_passable / brews_ruined counters, which EndingSelector reads directly. "Different endings based on what you collect" resolves with no new code.


Part 3 — Build recipes per game

Configuration-level, beyond the script lists in Scripts by Game.

Game The build
Cutthroat Course Tier 1 player + SpinningSaw, CyclingHazard (fire), KillZone (acid), SpikeTrap, Crusher, ElectricZone (ceiling), LevelExit. RespawnManager Use Lives = 3. Wire OnGameOver → AudioManager.PlaySFX with his funny sound.
Commission Witch Platformer + FloatingEnemy ghosts + Door/LevelExit (Collect on ingredient ItemTypes) + Interactable order board → RecipeChecker + EndingSelector with three thresholds.
Zap Attack Dash (Invulnerable ✓ + child Hitbox toggled by OnDashStarted/Ended), WallSlideJump, RailRide + power-line Rail objects, ElectricZone, Door (green electricity, Consume off), LevelData/LevelSet/LevelSelectMenu × 4 sectors, LevelTimer.
Spark of Corruption CharacterSwapper + 4 CharacterDefinitions: Fire Aprice → MeleeAttack, Dash; Servant → GrapplingHook, DoubleJump; Archer → ProjectileShooter, WallSlideJump; Sorcerer → ProjectileShooter, Glide. Breakable walls with Min Damage set so only the Sorcerer opens them.
Roach Invasion CharacterSwapper, Separate Health ✓ (5/3/2/3 per insect). Bee → Glide + DoubleJump. Wire Health.OnDied → CharacterSwapper.OnCurrentCharacterDied instead of RespawnManager.OnPlayerDied, and OnRespawned → ReviveAll.
Missile Man Sprint + MomentumLauncher with a disabled child Hitbox and big knockback. Don't add MeleeAttack — he doesn't punch.
Hot Air No PlayerController2D. BalloonController + FuelSystem + GrapplingHook (Aim = Mouse) + Checkpoint/Respawn. Wire OnRespawned → BalloonController.ResetMotion and FuelSystem.RefillFull. Scatter FuelPickups and rotated WindZone2Ds.
The Magnet MagnetPull + HoldPoint child; metal props on the Metal layer with MetalObject + a disabled DamageOnContact. Breakable crates that drop loot.
Stardust Dash, WallSlideJump, MeleeAttack, ComboCounter (wire AttackHitbox.OnHit → RegisterHit and Health.OnDamaged → ResetCombo).
Apep's Trial All three controllers on one object + 3 Cinemachine cameras + CameraModeSwitcher + ModeSwitchTrigger at each threshold. Brain Default Blend: Ease In Out, ~0.6s.
MythoClash EncounterManager + MonsterEntry assets + ExperienceWallet. Fixed-camera arena. Monster prefabs need Health + Hurtbox only.
Last Delivery TopDownMover + DeliveryObjective/DeliveryPoint/DroppedCargo + LaneSpawner traffic mixed with Tier 2 EnemyChase (Free) monsters — predictable plus unpredictable is what makes a route a puzzle.
Weenie Maze GridMover (Continuous) + SnakeBody + TreatSpawner + MazeLoader. Static camera framing the board. OnSelfCollision → GameManager.GameOver; treat's OnCollected → SnakeBody.Grow.
Anabasis Interactable + DialogueRunner memories, WorldStateSwapper transforming the world, PushBlock + PuzzleSwitch, EndingSelector. Wire OnRespawned → PushBlock.ResetPosition or testers get softlocked.
Detective Liz Whole Light/ folder + ClueJournal + FloorTransition (one scene, five floors) + DialogueRunner. Ghosts = FloatingEnemy + EnemyChase + LightSensitiveEnemy. Needs URP with a dark Global Light 2D (~0.15).
Cozy Critters NeedStat × 3–4 + PetBrain + CareAction per button + PersonalityTracker + SaveSystem (offline decay). TopDownMover with AI Controlled ✓. Static camera.
Store Simulator FirstPersonController + PickupCarry + ShelfSlot + StoreEconomy + CustomerAI/Register/CustomerSpawner. Bake the NavMesh first or nothing moves. Use autoServe to test the economy before building interaction.

Part 4 — Audio asset list

All 39 sound names the kit references, in one place. Add clips with these names to AudioManager's Named Sounds list, or change the field on the component. Missing sounds fail silently.

Player jump · dash · launch · push · stairs · fall Combat swing · shoot · hit · thud · break · zap Hazards spike_warn · spike_pop · crusher_slam · alarm Pickups & progress collect · door_open · door_locked · switch_on · level_complete · clue_found Signature mechanics magnet · throw · rail_on · mode_switch · flashlight_click · flashlight_empty · brew · success · fail Delivery cargo_lost · delivered Store sim pickup · drop · stock · beep · cash Pet sim care · click

A single shared SFX pack covering the first three groups serves most of the class.


Part 5 — Design decisions in the code

Why things are built the way they are. Useful when a student asks, or when you're deciding whether to change something.

Tier 1

Tier 2

Tier 3

Tier 4

Tier 5

Tier 6

Tier 7

Tier 8


Part 6 — Teaching order

The sequence that gets the most understanding per session:

  1. Scene basics + Tier 1 player. Move and jump. Nothing else.
  2. One hazard, one checkpoint. Introduces UnityEvent wiring with two connections.
  3. Cutthroat Course as a full build. Complete game, no combat, no collectibles.
  4. One enemy. Introduces Hurtbox/Hitbox, the one concept that doesn't explain itself.
  5. Tier 3 modules. One at a time — Dash first, it's the most satisfying.
  6. Split by project. From here the games diverge; students need their own tier, not everyone's.

Steps 1–4 are common to every student regardless of pitch. Step 5 onward, the Scripts by Game document tells each student what they need.