Super Sonic Fish
A physics based roguelike arcade shooter
University Project | Unity Engine 6 | C# | Game designer / Programmer
This project was part of my study at Hanze, going from creating a business idea and building a game based on the target audience we are trying to appease. The process started from researchinbg the gaming market to making a demo of our game.

We had the honor to win the
"Best of festival" at our study's
A bit about the project
Choosing on what kind of game we'd want to make came down on compromising between what we saw was populer in thae market versus the team's skillset on how well we think we can execute a concept. Our game was initially going to be a horror that was physics based (another sub category that showed popularity), except we found players much more engaged when shooting the enemy which had us pivot to what we have now.
Why Make It Physics Based?
Looking at the number of games that surpassed 1,000 wishlists on Steam and the Youtube viewership each category receives on average among other statistics, physics based games were one of the categories that stood out in performance. I have a couple theories why that is, and it has to do with how physics creates a more widely interpretable environment. One of the pillars that make a game fun is the learning of a system to find optimal strategies to beat the game. It stops being fun when the player feels like they've found the best strategy they can keep on executing which often is the end state a player has with a game with replayability. To keep the player in a state of learning and iterating on strategies, you need to either hide the stats or create enough variables so the player cannot easily figure out a winning strategy. I think the ideal is the game is balanced in a way the player feels compelled to explore all strategies the system enables. Having a system based on physics is a great way to harden deciphering the best strategy with the number of variables it introduces and lengthening the enjoyability of a game.
​
I also think there's an aesthetic aspect physics brings that gives games an easy way to gain authenticity at relatively low cost. Games with physics can get away with less polish since physics in games are always a little janky, and players are already primed to expect that as part of the aesthetic and charm.
As a designer I was responsible for
-
Managing the Game design Document
-
Designed the core gameplay loop
-
Designed 5 diffrnt enemy AIs
-
Balncing the game
The enjoyability of the game
The core gameplay loop goes like this: Avoid touching enemies -> shoot at enemies -> collect xp orbs -> level and choose an upgrade. Most of the fun at first comes from getting to know the enemies and bosses, learning to lay of the land for the first time. Anygame that has enough of an identity can enduce novelty in the player, giving enough dopamine in the new content to find it enjoyable. The hard part is having the player find enjoyment after the initial experience, after they know what to expect from the game. This require the game to temp the player in pursuin some sort of goal in tha game. This game tackles this in 2 ways. First is the high score, prompting the player to do better, mastering the mechanic and competing with themselve and others. The other relies on the player's curiosity. The upgrades the game offers encorages diffrent strategies which are ambigous on which is better, prmopting the player to try all of them out. This game will typically stop being fun when the player has experienced all possible strategies and or acheived a high enough score relative to how much time they are willing to spend to increase their mastery.
Coding Showcase
Unity Engine 6 | C#
As a progreammer I was responsible for...
-
Projectile based shooting
-
Player Physics Movement
-
Camera System
-
An object pooling system
-
Destruction Effect
-
​3 diffrent enemy AIs
-
Optimisation
-
​Audio Management
-
VFX Management
Sonic Fish AI
Object Pooling
This AI dynamically switches between a passive, pathfinding-based "NavMesh" mode and a physics-based Attack mode depending on how long it has last seen the player. In its passive state, the AI uses standard navigation to patrol between waypoints that are selected to cross near the player's position, and it will automatically enter a "Chase" mode if it patrols for too long without action. (Only physics based on final demo)​
Object pooling system to reduce overhead from instanciating and destroying objects by reusing GameObjects instead of frequently creating and destroying them. It allows you to define multiple pools in the Inspector, specifying unique tags, prefabs, initial counts, and parent transforms, which are pre-instantiated and stored in queues during initialization.
The system has global access with GetPooledObject to retrieve and activate an available instance (dynamically creating a new one if the pool is empty) and ReturnObjectToPool to deactivate objects and return them to the queue. It also manages hierarchy organization by ensuring returned objects are correctly reparented to their specific pool containers.
When switched to the aggressive physics state, the AI disables standard pathfinding to hover and ram directly at the player using explosive force bursts. This mode utilizes a specialized state machine that scans for obstacles before lunging; if a barrier is detected, the AI autonomously decides whether to jump over it or execute short, lateral "steps" to navigate around it, ensuring continuous pursuit through complex terrain.
Flying fish AI
Physics-based enemy that uses a Proportional-Derivative (PD) controller to smoothly pursue a target moving in an orbit around the player in a wave. Behavior is managed by a State Machine that reacts the the environment. The AI actively try to avoid obstacles when its raycast sensors detect obstacles, trying to move on an open side or back track backwards to avoid getting physically stuck. Periodically, if close enough to its waypoint, with a line of sight to the player, it will take time to "Aim" and "Shoot", braking to a halt to fire at the player before resuming its orbital path.
Artillery Whale
Crab AI
The whale controls a tracking turret designed to function on a moving platform. Its primary behavior is to scan for a the player in the same way as the Sonic Fish AI. When player is in view, the turret rotates its base (horizontal yaw) and gun (vertical pitch) independently to aim. These rotations are mathematically clamped to specific angles relative to its mount, preventing the turret from spinning unnaturally or clipping through the whale's body.
​The firing mechanism does not use standard physics gravity; instead, it spawns a bullet with a BulletArc component that follows a deterministic, kinematic path (using linear interpolation and an animation curve). The projectile lands exactly at the target's position after a fixed travel time, cconsistently creating lobbed shots regardless of the turret's movement.
The AI uses navmesh to chsae the player on ground and alteranates to a ragdoll state from external forces. A manager continuously tracks the player and calculates a valid navigation point on the NavMesh, ensuring that agents always have a reachable destination even if the player jumps or moves off-grid. This optimization prevents every enemy from needing to performe expensive pathfinding calculations individually.
​
In their default state, they use a NavMeshAgent to pursue the central target, employing a staggered re-pathing timer to prevent performance spikes. However, when hit by an external force, they disable their navigation logic and enable a Rigidbody, temporarily turning into ragdolls with increasing mass and drag to eventually come to a halt to start recovering. After a moment they snap back onto the NavMesh and resuming the chase.