Engine: Unity 3D
Responsibilities: Character movement, Rope generation, level creation.
Engine: Custom DirectX 11
Responsibilities: Asset pipeline, core update loop, physics engine, collision engine, player movement, level loading, level editor, asset creation, rope generation.
Download a full development diary here, including code snippets.
For my game engine architecture project, we were asked to recreate the 1984 classic Jet Set Willy. For this task we had to work in a small group, producing an initial prototype, Game Engine, Final game, and level editor.
For the prototype, I was responsible for producing the player movement and ropes. The player was a simple 2D platform controller, allowing the player to run and jump in the level. I also gave it the ability to wall slide/jump and skid along the floor to duck under obstacles.
The ropes I developed were generated at runtime using a number of nodes which were connected together using physics constraints. Simply rotating the top node of the rope based on the sine wave caused the ropes to swing. Using these ropes, I developed a harness system that allowed the player to latch on and climb up and down the length of the rope.
For the main game engine, due to the team composition, I ended up working on the engines core systems, allowing other team members to focus more on gameplay features. I implemented an asset management system that could load in sprite sheets and slice them according to a JSON file. Every texture asset in the game was stored in a flyweight pattern to make sure they were only loaded into memory once.
I also worked on the level loading system that loaded a tile map from a JSON file. The file was structured to hold individual instances of objects rather than just a tile grid. With this in mind, I built a level editor in Unity which allowed the placement of various tiles as well as gameplay objects. It even allowed you to define enemy pathing behaviours. This editor exported a created level into the DirectX engine.
The game engine used tilemap collision to keep the game running optimally. Any Collisions were resolved through impulses. To ensure accurate collisions the game engine ran a fixed update loop for collisions and physics calculations.
I created a level editing tool in Unity that my team used to produce all of the game’s levels. The level editor featured tile editing as well as a drag and drop system for adding game logic. The game logic objects are all serialised to a file allowing unique instances to have unique information, for example using the tool you can define enemy patrol points.
My final contribution to the main game was the rope system. Similar to the prototype they were constructed out of a series of nodes, however, this time they did not rely on physics. Instead, I calculated the individual node positions by exploiting polar coordinates.