John C. Jensen

Unity Developer

Unity Game Developer specializing in C# programming

Space Roguelite Prototype

This was another solo Unity project, designed and coded by me, using free placeholder ship sprites I found here.

The concept behind this game was “Slower-paced naval combat, but in space.” Most space action games place the player in the role of a small, agile fighter craft, so exploring the mechanics of controlling a larger, slower ship with multiple weapon slots interested me.

Instead of expecting to be able to dodge every enemy shot, you must out maneuver the larger ships to keep them in your turrets’ firing arcs while avoiding theirs. Selecting the correct weapons, shields, and support items based on the enemy ship compositions was also very important.

Ultimately, while I thought the combat was fun and unique, I never found a larger game loop context that I was confident that it fit into. 

Design & Mechanics

Navigation & Game Flow

I envisioned this game using procedurally generated maps. For each level, a main path of travel nodes was generated. Several optional side paths that led to bonus items were also generated.

As space doesn’t have walls, (That we know of?) the player had a scanner that would point him toward the nearest uncleared travel node. Nodes could be empty, have an enemy group, or an objective protected by an enemy group.

Since the player’s ship is quite slow, to avoid painful travel times, the player’s ship could dramatically increase its speed when not in combat.

Once all of the level’s objectives had been destroyed, the warp gate at the end of the path would unlock, and the player could proceed to the next area.


Visualization of an early iteration of level generation

Weapons & Items

Player and enemy ships each consist of some configuration of Turret, Shield, and Utility slots. Turret slots each have individual facings, but weapons placed into those slots have their own firing arc within that facing. Items can also have a random prefix that alters their base statistics.

Example weapons:

Laser- 90 degree firing arc, low damage, high velocity, can target all ship types

Photon Cannon- No firing arc, high damage, low velocity, can’t target fighters

Particle Beam- 360 degree arc, very low damage, can’t target fighters

Example shields:

Directional- Prevents all damage from a specific direction, short cooldown

Omni Shield- Briefly prevents all damage, long cooldown

Shield Booster- Passively increases shield regen, and reduces the time a shield takes to begin recharging after taking damage


Early Inventory UI

Combat & Enemy Ships

Successful combat is based on analyzing the enemy ship composition, choosing the best load-out for the situation, and correctly selecting your targets while maneuvering to minimize damage taken. 

Many of the larger, slower-turning ships have deadly weaponry with limited firing arcs, while the more agile ships have weaker weapons that they have no trouble keeping trained on you.

Each enemy type has multiple counters. For example, the Bomber’s seeker torpedoes turn slowly and are easy to dodge if you can focus on avoiding them, but sharp turns might prevent you from avoiding a Battleship’s firing arc, so you might consider devoting your Utility slot to a Point Defense laser to shoot down the torpedoes.

Early shot of combat with a slapdash UI

Enemy Navigation & AI

This was my first game that required enemies with a “smart” AI. Since every ship moved like a naval ship, taking time to accelerate and requiring forward movement to turn, I gave each type of ship an ideal distance and ideal angle from their target that they would attempt to maintain.

For example, the Battleship’s ideal distance is “close” and ideal angle is “90 degrees” from its target, so at long distances it would face the target to close the distance, before gradually rotating to pull alongside it.

Enemies “ideal” states also changed based on their damage state or the status of their weapons. Most ships would attempt to temporarily disengage if their shields were low, to give them time to recharge. A Bomber wants to face its target until it has fired its torpedoes, then it wants to be far away until they’re available again.

Early on I realized that a good strategy was to simply run from the biggest, slowest ships in a group so that you could isolate and destroy the faster, weaker ships that could keep pace with you.

Since that obviously wouldn’t fly, I gave the larger ships short range jump drives that would warp them to a random location near you if you got too far away from them. Turns out having a Battleship suddenly in firing range is a great cheese deterrent.