A Unity 6 arcade-style basketball game prototype built to demonstrate clean architecture, SOLID principles, and AI-assisted development using GitHub Copilot and Codex.
Role: Solo Developer — Architecture, Gameplay Systems, Input System, Physics Tuning
Engine: Unity 6 (6000.2.0b12) · Language: C# · Input: Unity Input System v1.14.1
- Arcade machine where the player throws basketballs into a hoop.
- Progressive difficulty levels: static hoop → moving hoop → timed challenges.
- Virtual joystick controls direction, force, and angle — parabolic shot trajectory based on joystick input.
This project showcases production-grade architecture applied to a small-scope game:
| Pattern | Implementation |
|---|---|
| Service Locator | Decouples IInputManager from consumers via ServiceLocatorProject / ServiceLocatorScene |
| SOLID — SRP | Each class has a single responsibility: InputManager, BallController, PlayerController |
| SOLID — OCP | New levels and input methods can be added without modifying existing classes |
| SOLID — DIP | PlayerController depends on IInputManager abstraction, not a concrete implementation |
Assets/_Scripts/
├── Core/ # Interfaces, services, ServiceLocator
├── InputSystem/ # InputManager, input logic
├── Dependencies/ # Installers (Bootstrapper, InputSystemInstaller)
└── Player/ # PlayerController, BallController, shot logic
InputManagerimplementsIInputManager- Events:
AimStarted,AimPerformed(Vector2),AimCanceled - Property:
AimVector
| Parameter | Value |
|---|---|
| Rigidbody.mass | ≈ 0.6 kg |
| Drag | 0.1 – 0.2 |
| Angular Drag | 0.1 – 0.2 |
| Bounciness | 0.7 – 0.8 |
| Friction | ≈ 0.2 |
This project was developed using GitHub Copilot and Codex as active development partners:
- Architecture decisions and code generation guided by
AGENTS.md - Spec-Driven Development workflow with structured prompts
- CI/CD pipeline with Unity Test Framework (EditMode & PlayMode)
- Unity Test Framework: EditMode and PlayMode tests
setup.shautomates environment setup: Unity Hub, Android SDK/NDK, .NET, Git LFS- Test results output to
test-results/