Project type: Game
Date: 19-03-2024
Status: Finished
Software used: Unity, Visual Studio
Language used: C#
Role: Lead Developer
Team size: 3 developers en 4 artists
About the project
In this project, I worked as part of a team for our client, Paladin Studios. The client wanted a fun cooperative game that could be played by people of all ages. The game therefore needed to feature a unique mechanic that was easy to learn and understand.
The result is a co-op party game in which players control a train and must deliver packages to the correct stations in the shortest time possible. Along the way, players may encounter damaged sections of track that cause damage to the packages and the train. These must then be repaired as quickly as possible.
In this project I worked on the parts below.
State Machine
For this project, I built a reusable state machine. This ensures that the correct UI is always displayed. A useful feature of this system is that you can set a parent state. This allows you to easily reuse the base UI, with child states simply adding specific new UI elements. I applied this in the lobby, for example: the interface there is largely the same for both the host and the client. However, thanks to this system, I was able to easily configure it so that the client sees the text “Searching host…,” while only the host sees the “Start Session” button.
Player Manager
The Player Manager is responsible for spawning players and automatically assigns them a random character model. A player is only spawned when someone in the lobby presses a button using a keyboard or controller.
It is possible to use multiple input devices on a single client. A total of up to 6 players (input devices) can participate in a session, and it doesn’t matter how many different devices (clients) they are distributed across.
This process takes place over the network. The client sends a request to the host to spawn a player. As soon as the client has received the spawned player from the host, I immediately assign the correct input device to this new character.
Multiplayer Lead
As part of my role as Lead Developer, I contributed to all the features in the game. Since I had researched the networking plugin for our game (FishNet), I helped my teammates with the networking aspects of their features. This ensured that everything worked properly when the game was played with multiple devices in the same session. This included systems such as the grabbables and the train controller.
Popup System
I created the popup system to make it very easy to add new pop-ups, complete with standard fade-in, fade-out, and hover animations. Since we needed a wide variety of pop-ups for this game, this was a crucial system.
In addition, the system allows popups to appear when the player is nearby. Think, for example, of an interaction button that becomes visible above the player as soon as they are near an object they can interact with.
Finally, it’s also easy to inherit from the base popup, allowing us to set specific conditions. A good example of this is the coal popup: by inheriting from it, I could easily set it so that this popup only appears on screen when the coal in the furnace drops below a certain level.
Damage and Repair System
The Damage and Repair System manages all objects that sustain damage during the train ride. This damage worsens whenever the train travels over a section of track in poor condition. Players must continuously repair the package lockers with a hammer to prevent damage to the packages. If a package is placed loose in the train, it immediately sustains damage, which ultimately costs points. Additionally, the oven can break down, causing the train to come to a complete stop.
I’ve made this technically easy to use in systems. For example, to make an object repairable, the class simply needs to implement the IRepairable interface. The hammer then automatically searches for this interface within its range to perform the repair. I’ve also created a base-damagable and base-traindamagable to make it easy to create new objects that can sustain damage.


























