GAME 1303 Instructor Handbook
Companion documents
- 01.GAME 1303 — Pitch Analysis — the original 17 pitches and what they have in common
- 02.GAME 1303 — Scripts by Game_v2 — which of the 115 scripts each student needs
- 03.GAME 1303 — Scripts Source — Text listings of .cs scripts
- 04.GAME 1303 — Instructor Handbook — This Guide
- 05.GAME 1303 — Deployment Guide — How to start in Unity and deploy the scripts
- 06.GAME 1303 — Mecanim Wiring Guide — Mecanim rigs, parameters, state machines
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.
- Hurtbox = "where I can be hit." A child trigger collider that forwards damage to the parent's
Health. - Hitbox = "what hurts you." A child trigger, disabled by default, that
MeleeAttackswitches on for the swing window.
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
HealthusesUnityEvent<int,int>. In the Inspector these appear under Dynamic — students must pick the dynamic entry, not the static one, or the values won't pass.- Singletons use
Instancewith?.null-checks, so a scene missing anAudioManagergoes quiet rather than throwing. Kinder for students, harder to diagnose — check for missing managers first when something "does nothing."
Tier 2
HitboxreadsComboCounter.DamageMultiplierfrom its parent automatically;Projectilegets it from the shooter. Only melee hitboxes needOnHit → RegisterHitwired by hand.EnemyChasedisablesEnemyPatrol.Activewhile chasing;FloatingEnemyyields toEnemyChase.IsChasing. All three checkKnockback.IsStunned, so a hit interrupts them.BossControllersorts phases by health percent on Awake — students can enter them in any order.
Tier 3
CharacterSwapperuses one player object with every ability component present, togglingenabledper character. Avoids the camera/PlayerInput/RespawnManager churn of swapping prefabs.enabledAbilitiesis a list of component class names — a typo silently disables the ability, so check those in class.GrapplingHookcreates its ownDistanceJoint2Dat runtime; don't add one manually.RailRidewalks theEdgeCollider2Dpolyline segment by segment, so wires can have any number of bends.
Tier 4
ElectricZoneextendsCyclingHazard— the only inheritance in the kit, and a decent five-minute lesson onvirtual/override. Students can ignore the base class and useElectricZonedirectly.Breakable's Min Damage To Break heals back damage that's too weak, so weak hits are genuinely ignored. It also forcesdestroyOnDeath = falseandinvulnerabilityTime = 0in Awake so it can't be misconfigured.SpikeTrap(Triggered) andDoor(proximity) poll withCollider2D.Overlapinstead of needing a forwarder script on the child trigger — fewer files to wire, at the cost of a per-frame check.Crusherraycasts once at Start to find its own floor, so one prefab fits any shaft.
Tier 5
SnakeBodykeeps two path entries beyond the current length so growth has somewhere to spawn — that's thesegments.Count + 2trim.LaneSpawneraddsLaneTraveller/LaneDespawnerat runtime; they're in separate files so Unity serializes them properly.MazeLoader.Clear()usesDestroyImmediateso Build() works from an editor button outside play mode.
Tier 6
DialogueRunnertypes withWaitForSecondsRealtime, so conversations still run whileTime.timeScaleis 0 (i.e. if a student pauses mid-dialogue).- Choice jumps use an explicit
pendingJumprather than rewinding the index, so a line with both agoToLineand choices can't double-jump. Flashlight2D.IsLit()is a simple cone test, independent of the Light 2D's actual shape. MatchconeAngle/rangeroughly and tune by feel, not by measuring.- This tier has the most UI wiring — budget a full session for the dialogue panel.
Tier 7
PersonalityTrackerstores counters inChoiceFlagManager, so the pet's history survives scene loads free.ShelfSlotcaps display meshes at three layers so a big store doesn't spawn hundreds of objects.RegisterandShelfSlotread the E key directly rather than through PlayerInput, because they aren't on the player. If Sanad rebinds Interact, those two lines need changing — flagged in both files.
Tier 8
CameraModeSwitcherputs aCharacterControllerand aRigidbody2Don one object. Correct as long as only one controller is enabled at a time, but it looks alarming in the Inspector — worth pre-empting.EncounterManagerauto-wires the spawned monster'sHealth.OnDied, so a monster prefab only needs Health + Hurtbox to be fightable.
Part 6 — Teaching order
The sequence that gets the most understanding per session:
- Scene basics + Tier 1 player. Move and jump. Nothing else.
- One hazard, one checkpoint. Introduces UnityEvent wiring with two connections.
- Cutthroat Course as a full build. Complete game, no combat, no collectibles.
- One enemy. Introduces Hurtbox/Hitbox, the one concept that doesn't explain itself.
- Tier 3 modules. One at a time — Dash first, it's the most satisfying.
- 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.