Coop Horde Shooter – Personal Project
This is a side project I started in Unreal 4 to learn more about programming multiplayer games in Unreal. As I had no experience with this I started by completing Tom Looman’s course on multiplayer games in Unreal 4. After completing the course I took the coop horde shooter project and moved it into Unreal 5 and expanded on it.
Weapons
At the end of the tutorial, the player characters and advanced enemies could only hold one weapon and that weapon had to be assigned in their Blueprints.
To change this I implemented an actor component called the WeaponHandlerComponent. This has a weapon inventory, the ability to add and remove weapons and to switch between the weapons the player already has. All weapon-switching functionality is run on the server to keep all players in sync.

Game Mode and Game State
The tutorial version of the game mode took two enemy types and would randomly spawn an increasing amount of them per wave until all players were dead. I changed this so the enemies per wave were set using a data object where you can add multiple enemies types and how many of each one you want that wave. I then updated the game mode to work through each wave and then the game can end when it reaches the last wave or it can keep using the last wave.

Enemy AI
After the changes to the weapons, it was now possible for enemies to run out of ammo, they would keep positioning themselves correctly but couldn’t fire. To fix this I added a new branch to their behaviour tree that checked the ammo on their equipped weapon. If an enemy is out of ammo it’ll check if they have another weapon with ammo to switch to and if they don’t it’ll find the nearest weapon pickup and go to it.

PS1 Inspired Horror Game- Personal Project
A smaller side project I’m working on is an interaction system for a PS1-inspired horror game. Right now it’s a small interaction system where the player can pick up items, add them to their inventory and use them on other interactable objects, e.g. the player can pick up a key and use that to open a door.
Player Interaction Component
The player has a UPlayerInteractionComponent actor component that is used for handling interactions on the player’s side. It stores a list of actors with the UActorInteractionComponent that the player is currently overlapping. When the player presses the interact button it selects the component with the highest priority that’s currently active. It can then handle that interaction failing or succeeding.


Actor Interaction Component
Any object that the player can interact with has a UActorInteractionComponent on it. This component checks that it’s owner has a collider with the correct tag on it and if it does binds functions to the begin and end overlap events. The component has functions for when the interaction starts, ends, succeeds and fails.
For common behaviours like picking up or using items, I implemented child classes (UPickUpItemInteractionComponent and URequireItemInteractionComponent). These can be added to any actor and as long as the colliders are setup they’ll work. For less common behaviours I added an interaction interface, so UActorInteractionComponent will check if its owner implements that interface in either blueprints or C++ and then call those functions as well as the default start/end/success/failure ones.
Gates of Amenti – University Final Year Project
Platform | PC, PS4 |
Engine | Unity |
Team Size | 12 |
Duration | 1 year |
Year | 2018 |
Gates of Amenti is a sci-fi Metroidvania-inspired game. This was part of my final year project for my BSc in Computing for Gaming. I worked in a group of 12 with people from other courses.
My role was to develop AI for all non-boss enemies in the game.
There’s a free demo avaliable on itch.io.
For another assignment, I also ported the game to PS4. This involved optimisation work, updating menus to work with a controller and adding workarounds for plugins that didn’t work on PS4.
