Unbound
Project 3 at The Game Assembly, a 2D precision platformer game
Synopsis
As a wrongfully imprisoned monkey, you break out. Navigate through a hazardous, futuristic city to escape your pursuer and reach an off-world colony.
Development
Unbound is a 2D precision-platformer game made in 13 weeks by Primal Crowd, 13 students at The Game Assembly in Malmö.
Contributions
My primary contributions this project was animation implementation, the banana pickup system and implementation of functionality and feedback for interactables and drone enemies.
Animation system
I developed a system to read sprite sheets into running animations with transitions to the correct character states. The system was made modular in order to use it for every element in the game with more than one animation. This made it easy to swap out characters with minimal code changes and provided us with the opportunity to freely costumize the transitions and states for each animated model.


The pickup system
I implemented a pickup system that with tracked progress between runs. We wanted the collectibles to be a fun extra challenge. Therefore I implemented a an invisible collider that level design could place out in their levels and prevented the collectible from being collected until the player reached this collider. As a visual representation of this I made sure the collectible followed the player as a kind of companion until the criteria was met. When the player reached the checkpoint it would trigger the final animation of the collectible, updating and sliding in the collectibles counter and update the json-file, thereby saving the progress for later runs.
The json file was also used in order to visually represent the number of collectibles achieved in the level select menu as shown above. If you would replay a chapter, the collected collectibles had a different color in game, to make it easier to destinguish the ones you had collected from the ones you had yet to collect.


Interactables, functionality & feedback
All inte interactables had two or three animation states to give the player feedback and ensure readability. They all could use the same modular animation system as the playable characters. I also added matching background glow colors for all the animation states to make them stick out from the surroundings.
Dash refill
The functionality for this interactable was quite simple. It was only a matter of refilling the dash meter and making sure it could only be interacted with when in the correct state.
Below you can see an example of a dash sequence using the interactables and with added camera shake as feedback.


Keys and doors
I also implemented interactables that were acting as keys to open doors. You had to collect them all to make the door unlock. The tricky part of this implementation was to connect the right keys to the right doors in levels that had multiple similar sequences.

Drone enemies
The drone enemies were by far the most challenging due to the sprite sheets being off centered and the spiking electricity bolts being a seperate element which had to be implemented on top of the drones. The sprite sheets were off centered because the drones had long tentacle-like wires flowing behind them, but this meant I had to do some extra math to translate the enemy and its hitbox in the correct direction. I ultimately had to do different types of calculations depending on if they were moving horizontally or vertically as well as taking into account what direction they were facing at the beginning of the scene. Below you can see a showcase of all the different movement patterns.

What I learned
During this project I learned how to convert sprite sheets into running animations and I'm very proud of the modular animation system that was used for all the animations in game. It was quite challenging to connect the animation system to the player controller because the player controller naturally were missing a few states that was needed for animations to work seemlessly (f.ex. the animation system needed a state for landing, whereas the player controller only checked if you were grounded or in air). This waranted some workarounds, but I managed to make it work.
The collectibles system was also very challenging because there were so many was things could go wrong and cause bugs or errors. One example of this was the values not being read correctly or updated correctly from the json file, causing collected bananas to remain uncollected or overwriting important data in the file, thereby creating wrongful information for the level select menu, wrong banana colors in game or losing progress.
As briefly mentioned above, I also gained a lot of experience in combining sprite sheet elements as well as configuring sprite sheets that were different in concern to pivot points. It's fair to say I learned the hard way that in future projects I will demand sprite sheet elements to be centered correctly to avoid having to create functions for variations of behavior using this sprite sheet.
Credits
Primal Crowd
Programming
Ylver Blum Buer
Elias Ronefors
Philip Eriksson
Abraham "Bam" Alberto
Christian Le
Graphics
Dante Norling Eklöf
Oliver Andersson
Morgan Wildmark
Emil Nilsson
Level Design
Erik Gatewood
Alvin Berthet
Animators
Theo Hübner Sallis
Rebecca Kornemalm
Music
Abraham "Bam" Alberto
Oliver Andersson
Voice Acting
Philip Eriksson
Theo Hübner Sallis
Third Party
TGE The Game Engine by The Game Assembly
FMOD Studio by Firelight Technologies
Level building in Unity by Unity Technologies
Sound effects by Soundsnap, Abraham “Bam” Alberto and Oliver Andersson





