Unity Essentials: Physics, UI & Gameplay Systems

Lesson 8 of 8

Final Project: Wave-Based Shooter

Combine physics, UI, input, ScriptableObjects, pooling, and save data into one small playable slice.

Requirements

  1. Use raycasting (or physics collisions) to detect when the player's shots hit an enemy.
  2. Represent enemy stats (health, speed, prefab) with a ScriptableObject, so tuning them doesn't require touching code.
  3. Pool your bullets and/or enemies instead of calling Instantiate/Destroy on every shot or spawn.
  4. Show the player's health and current score on a Canvas-based UI, updated live as the game state changes.
  5. Read player input (fire, move) using either the legacy Input class or the Input System package.
  6. Save the player's best score with PlayerPrefs, and display "New high score!" when it's beaten.

Stretch goals

  • Use a trigger collider for a pickup (e.g. a health or ammo crate) instead of a raycast hit.
  • Save more detailed run data (wave reached, enemies defeated) as JSON instead of just the high score.
  • Add a pause menu Canvas that disables gameplay input while open.

Submit your repository link below when you are done, an instructor will review it before you can mark this lesson complete. Good luck! 🚀

This lesson ends in a project. Build it on your own machine, there's nowhere to submit it here, but the brief above is everything you need.