Jet Game

Fast-paced jet combat score attack built in Unreal Engine 5

Jet Game is a solo personal project developed over one week, combining fast-paced jet combat with score attack gameplay.

As the sole programmer and designer, I was responsible for all aspects of the project — from flight mechanics and combat systems to level design and UI.

Team Size

  • Solo

My Role

  • Programmer
  • Designer

Duration

  • 1 Week

Tech Stack

  • Unreal Engine 5
  • C++ & Blueprint
  • GitHub

Context

  • Personal Project

My Contributions

Flight System

  • 3D pawn movement via Floating Pawn Movement
  • Tuned flight feel for fast, responsive control

Combat Systems

  • Projectile & missile firing system
  • Lock-on targeting with gimbal lock solution

HUD & UI

  • Inclinometer ball for pitch/roll feedback
  • Health and acceleration readouts
  • Time-to-clear score display

Gameplay Video


Technical Breakdown

Lock-On Targeting & Gimbal Lock

Building a lock-on system for a fully 3D aircraft introduced a classic problem — gimbal lock. When using Euler angles to track and rotate toward a target, certain orientations caused the rotation axes to align, losing a degree of freedom and producing erratic snapping behaviour.

Solving this required switching the rotation representation to quaternions, which avoid the singularity entirely and interpolate smoothly across all orientations.

  • Euler angle rotation caused gimbal lock during steep climbs and dives
  • Resolved by converting to quaternion-based slerp for target tracking
  • Lock-on scans within a cone angle to acquire the nearest valid target

Failure Conditions, Pickups & Score

The game puts pressure on the player through two concurrent failure conditions — a countdown timer and a health pool. Running out of time or taking too much damage both end the run, forcing the player to balance aggression with survival.

Scattered throughout the level are pickups that grant bonus score, rewarding exploration and risk-taking on top of the core time-to-clear objective. This layered approach gives skilled players something to optimise beyond simply clearing targets as fast as possible.

  • Countdown timer — reaching zero ends the run
  • Health system — taking damage can end the run independently of the timer
  • Score pickups reward exploration and risk
  • Dual failure conditions create tension and encourage aggressive play

UI Systems & Inclinometer

The inclinometer ball — a classic aircraft instrument showing pitch and roll — was implemented by using a SceneCapture2D component pointed at a physical ball in the world. The captured image was then fed into the HUD as a texture, giving an accurate real-time read of the jet's orientation.

While functional, this approach has a cost: a SceneCapture renders the scene an additional time each frame. In future I would replace this entirely with a Material shader that takes pitch and roll as scalar parameters, driven at runtime through a Dynamic Material Instance. This eliminates the extra render pass and keeps the effect GPU-friendly.

  • SceneCapture2D used to render a physical ball into a UMG texture
  • Approach works but adds an extra render pass per frame
  • Future improvement: Dynamic Material Instance with shader-driven parameters

What I Learned

Technical

  • Gimbal lock is a real problem in 3D rotation — quaternions are the right tool
  • Floating Pawn Movement is well-suited for aircraft without needing full physics simulation

Process

  • Shipping a complete, playable game in one week demands tight scoping from day one
  • Cutting features early is better than cutting quality late

What I'd Do Differently

  • Add enemy aircraft with AI behaviour for more dynamic combat
  • Leaderboard or ghost replay to make the time attack more replayable

Project Links