The mechanics are solid. But right now it's a prototype — not a game.
🎮 Prototype vs. Complete Game
Prototype
Starts mid-race with no context
No clear win or lose condition
Can't restart without the editor
No way to know who built it
Fun to build — awkward to hand to someone
Complete Game
Opens to a menu that sets expectations
Has a clear win and lose condition
Player can restart, quit, or return to menu
Credits give attribution and closure
A stranger can pick it up and play it
📋 Minimum Requirements
For full credit, your completed Blade Racer must include all three of the following:
1. Main Menu REQUIRED
A title screen where the experience begins. At minimum: a Play button and a route to Credits.
2. Complete Game Loop REQUIRED
The player can start a race, play to a defined win or lose condition, then return to the menu. No dead ends — every state connects back.
3. Credits Screen REQUIRED
A screen (or overlay) that credits the developer(s), any third-party assets used, and the course and institution.
Everything else is bonus. Get all three working and connected before exploring extras.
🎨 Your Game, Your Way
The requirements define the what — not the how. These are design decisions you get to own:
What ends the race? — Crash limit, distance goal, timer, score threshold, or something else entirely?
What does winning look like? — High score? Finishing a track? Defeating a boss drone?
What's on your menu? — Settings? Difficulty select? A garage for pre-race upgrades?
How do your credits play out? — Static text? Scroll? A post-victory cinematic?
What extras do you want? — Sound, leaderboard, multiple tracks, pause menu?
There is no wrong answer here. Build the game you want to build — just make sure all three required systems are complete and connected.
🖥️ Step 1: Building Your Main Menu
What you need:
A dedicated Menu scene set as scene index 0 in Build Settings
A Canvas with your game title and navigation buttons
At minimum: Play and Credits buttons
using UnityEngine.SceneManagement;
public classMainMenuManager : MonoBehaviour
{
public voidOnPlayClicked()
{
SceneManager.LoadScene("GameScene");
}
public voidOnCreditsClicked()
{
SceneManager.LoadScene("CreditsScene");
}
public voidOnQuitClicked()
{
Application.Quit();
}
}
Keep it clean. A readable menu with clear buttons beats a flashy one that confuses players. Style it after you finish wiring everything up.
🔄 Step 2: The Game Loop
A complete game loop moves through defined states:
Menu → Countdown / Start → Gameplay → Game Over or Victory → Restart or Menu
Choose how the game ends — or invent your own:
Crash Limit — Three crashes = game over
Distance Goal — Survive a set track length to win
Timer — How long can you last? (survival mode)
Score Threshold — Reach a target to advance or win
Decide your end condition before you write any code. It determines what your GameManager needs to track and what events need to fire.
🗂️ Game State with GameManager
Your existing GameManager Singleton is the natural place to own overall game state — a straightforward extension of what you already built:
public enumGameState
{
Menu, Countdown, Playing, GameOver, Victory
}
public classGameManager : Singleton<GameManager>
{
public GameState CurrentState { get; private set; }
public voidSetState(GameState newState)
{
CurrentState = newState;
EventBus.Publish("GameStateChanged", newState);
}
public voidStartGame() => SetState(GameState.Playing);
public voidTriggerGameOver() => SetState(GameState.GameOver);
public voidTriggerVictory() => SetState(GameState.Victory);
}
Pattern in Action: The Event Bus broadcasts state changes — your HUD, audio manager, and UI panels all respond without the GameManager ever knowing they exist.
💥 Game Over & Win Screens
Two solid approaches — pick what fits your design:
Option A: Separate Scenes
Clean and easy — each outcome is its own scene
Load your Game Over or Victory scene when state changes
Each scene has a Restart button and a Return to Menu button
Option B: Canvas Overlay
More seamless — the race world stays visible behind the panel
Subscribe to the GameStateChanged event via Event Bus
Toggle panel visibility when state hits GameOver or Victory
// Game Over panel subscribing via the Event BusvoidOnEnable()
{
EventBus.Subscribe("GameStateChanged", OnStateChanged);
}
voidOnStateChanged(object state)
{
gameOverPanel.SetActive((GameState)state == GameState.GameOver);
victoryPanel.SetActive((GameState)state == GameState.Victory);
}
🎬 Step 3: Credits Screen
Your credits must include:
Your name (and any collaborators)
Course: CSCI 3213 — Game Programming, OCU, Spring 2026
Any third-party assets used (art, music, fonts, sound effects)
Implementation options:
Static Scene — A Canvas with text and a Back to Menu button. Simple and reliable.
Scrolling Text — Animate a TextMeshPro element upward with a Coroutine
Post-Victory Sequence — Credits roll after a win cinematic or ending card