Hello, I'm Elvin Nicholson

First Class in BSc (Hons) in Games Technology from UWE Bristol

I have a strong background in game development, with experience in Unity, lower level engines, creating developer tools in WPF, and VR development. I received The Dean's List award for my academic achievements in the 2021-22 academic year, and is shortlisted for 2024 TIGA Graduate of the Year: Programmer and Best Student Game.

Game Projects I've worked on
Project ZipZap
Project ZipZap
C#
Unity
Project ZipZap is an isometric fast-paced movement-based combat game.

Project ZipZap is an isometric fast-paced movement-based combat game set in a robotic dystopia city. The project was made by a group of 11 developers over 7 months and was shortlisted for TIGA Awards 2024 for "Creative Assembly: Best Game". The game features 5 different levels and a boss fight. Players are able to use dash abilities to dodge attacks and deal damage to enemies. There are 3 dashes, each with their own unique abilities and ultimate that can synergize with each other.

In this project, I worked on the player functionalities, player VFX and the boss' procedural animation. The player uses standard Unity character controller as its base while the different dashes inherit from a parent dash class. The player also uses animation keyframes during dashes to ensure that the VFX and other functionalities line up perfectly with the animation.

The VFX that I worked on was made using a combination of Shader Graph and VFX Graph. Some VFX such as the wind effect from dashes, stamina ring around the player and time capsules uses models with custom UV to line up the textures from Shader Graph. The final boss has procedural animation made using inverse kinematics.

VR Safe
VR Safe
C#
Unity
VR
Online Multiplayer
VR Safe is a multiplayer VR training simulation that evaluates the users' hazard perception analysis using eye tracking.

VR Safe is a multiplayer VR training simulation that evaluates the participants' hazard awareness, adherence to safety protocols, and responses to dynamic site conditions using eye tracking. The tool has multiplayer features that allows up to 3 participants who must work collaboratively to identify hazards, conduct safety inspections, and respond appropriately to changing conditions while executing the task.

It simulates a busy construction site, where a critical concrete repair task must be conducted at a height of 15 meters. The repair is necessary to fix damaged or deteriorated concrete on a structural column, which is crucial for ensuring long-term structural integrity and safety. The task requires the safe use of a Mobile Elevated Work Platform (MEWP) and strict compliance with Work at Height safety regulations.

Three key roles are involved in the VR training scenario. The Supervisor who are responsible for site inspection, hazard identification, and task briefing. The MEWP Operator who ensures MEWP pre-use checks, stability, and safe manoeuvring. The Concrete Repair Technician who focuses on work-at-height safety, PPE compliance, tool security, and hazard mitigation while performing the repair.

StageCraft
StageCraft
C#
Unity
VR
Online Multiplayer
StageCraft is a VR application that allows students to practice their presentation skills in front of a mock audience that can respond with questions.

StageCraft is a VR application that allows students to practice their presentation skills in front of a mock audience that can respond with questions and give feedback to the presenter. The project is a paid client work funded by UWE and was developed by a team of two. The project utilizes OpenAI Whisper to transcribe the presentation audio and is then questions are generated using GPT 3.5 based on the contents of the presentation. The questions are then sent to AWS Polly text-to-speech system so the audience members can verbally interact with the presenter.

Throughout the presentation various data are collected to find points of improvement for the presenter. The system will detect how often filler words are used and long pauses during the presentation. At the end, a heatmap of where the presenter is looking will be generated based on head tracking data.

VIS Studio
VIS Studio
C#
Unity
VR
VIS Studio is a shared VR application that can simulate heatwaves and flooding in the Bristol city centre based on real-world data.

VIS Studio is a shared VR application that can simulate heatwaves and flooding in the Bristol city centre based on real-world data. This application was made in Unity for the UWE VR Cave as client work for a UWE inhouse studio. In this project I colaborated with 2 other developers and played the role of a project leader whose responsibilites include communicating with the client, managing tasks among team members, and ensuring the final deliverable was in line with client specifications.

The project features a digital twin of the Bristol city centre and a realistic wave simulation made using the Gerstner wave formula with vertex shaders, transparency and reflections to create a lifelike appearance. I was also responsible for creating the system that manages the various changes to the environment depending on the policies chosen by the user to combat environmental changes.

Unity Dialogue Editor
Unity Dialogue Editor
C#
Unity
A dialogue editor development tool made using Unity's graphview system.

Unity Dialogue Editor is a tool made within the Unity Editor using the graphview system which allow developers to create dialogue trees without coding. It uses a node based system similar to Unity's Shader Graph and VFX Graph.

The editor consists of 4 dialogue nodes: Start, End, Single and Reply nodes. Start and End nodes simply tells the system where the dialogue starts and ends, while the Single node displays a dialogue text. The Reply node allows the player to select a reply during a dialogue which can be used to create branching dialogue paths based on the player's choices.

The system also contains a simple in-game dialogue UI which reads in data from dialogue trees made using the tool.

For more information, a report of this tool is available here.

ML-Agents
ML-Agents
C#
Unity
Machine Learning
This project aims to determine whether it is possible to train a single machine learning agent to play multiple distinct games.

This project aims to determine whether it is possible to train a single machine learning agent to play multiple distinct games. The project uses the Machine Learning Agents (ML-Agents) Toolkit to train agents within Unity. 4 Agents have been trained to play a simple snake and flappy bird game for 2 million episodes. The first two agent; the SnakeAgent and BirdAgent were trained only in their respective game as a control group to determine the expected reward when trained under normal conditions.

The SnakeAndBirdAgent was trained to play both games alternatively. The agent was trained in snake game for 500 thousand steps, then it was trained for another 500 thousand steps in flappy bird. This process repeats until a sum of 2 million steps. Another agent, the SnakeWithBirdAgent was trained in both games simultaneously for the same number of steps. In the end, the SnakeAndBirdAgent was only able to play the last game it was trained on, while the SnakeWithBirdAgent was able to perform well in both games simultaneously.

ML-Agents
Forced Perspective in VR
C#
Unity
VR
This project explores how forced perspective can be implemented in a virtual reality environment.

This project aims to explore the implementation of forced perspective game mechanics in VR. Forced perspective is an optical illusion technique that affects the appearance of an object, making them appear bigger, smaller, further, or closer than they are. This technique is used as the main premise of the puzzle game Superliminal. One of the main challenges of this project is the fact that VR gives precise depth perception while forced perspective relies on the ambiguity of depth.

Another challenge of this project is creating the collision detection system for the picked-up objects. The scale of objects is constantly changing as the object moves based on its perspective from the player which makes collision detection very difficult. Moreover, the object has to be moved in front of the closest obstacle seen from the player's perspective which requires an accurate collision detection system.

The final collision detection system divides the object into a 3D grid points that resembles the shape of the object through raycasting. Then these points are used as raycast targets with the player's camera as the origin. The raycast with the closest collision point will be the closest obstacle and the object is moved to this point and scaled accordingly so the player does not notice any change in size.

The project also features an anamorphic projection system using decals and render textures. Anamorphism is an optical illusion where the viewer is required to view a distorted projection from a specific vantage point to see a recognizable image.

Afterlife DirectX
Afterlife in DirectX 11
C++
DirectX 11
A recreation of the Afterlife game, made from the ground up in DirectX 11 with C++.

Afterlife in DirectX 11 is a recreation of the Afterlife game made in DirectX 11 with C++. This part of a university assignment and was done by a group of 5 people over 4 months. The assignment simulates the environment of a small game studio and follows the agile project management approach. As such, I learned a lot about team dynamics and got used to scrum meetings where the group discuss with each other regarding the progress of the project.

In this project, I worked on creating the entire building system, a texture manager, and an isometric camera. The building system is built on a vertex-based quad game object that I made which can change its dimensions to fit a texture. This quad game object is used for the tilemap system and to display the buildings that appear in the game. I also worked on the functionalities of every unique building in the game and a supporting population system.

The textures used throughout the building system are managed by a texture manager that I made based on the flyweight design pattern. Essentially, the texture manager significantly reduces the memory usage from the game by sharing a reference to the texture amongst similar objects using C++ pointers. The texture manager that I made managed to reduce the memory usage of the game from around 3 GB to only 500 MB, and also significantly reduces the load time when starting the game.

Another role I worked on was to create the isometric camera for the game. It was done by creating an orthographic projection matrix and offsetting the camera from its target by a specific value which was calculated using trigonometric equations to achieve a 30 degrees isometric view. Moreover, I also worked on translating the 2D mouse position to a 3D in-game world position. This was done by un-projecting the 2D mouse position and using the result in a parametric equation to find the correct in-game world position.

Afterlife Unity
Afterlife in Unity
C#
Unity
A Unity rapid alpha build of the Afterlife game originally made by LucasArts, published on 1996.

Afterlife in Unity is a recreation of the Afterlife game made by LucasArts made in 2 weeks with a team of 6 people as a university project. The aim of the project is to create a rapid alpha build of the game in Unity as a preparation for porting it to DirectX 11. Essentially, Afterlife is an isometric city builder, but you are managing both heaven and hell which have different requirements to earn the most amount of money.

In this project, I was responsible for creating the entire building system and the functionalities for the buildings. The building system consists of the tilemaps for both planes, how the player interacts with the map, the zone systems, and the making the road sprites automatically adjust themselves accordingly when other roads around them are added or removed.

TicTako
TicTako
C#
Unity
WebGL
A Tic-Tac-Toe fan game of the VTuber group Hololive EN, also the first game I have ever released.

TicTako is a classic Tic-Tac-Toe game themed around the popular VTuber group Hololive EN. This was the first ever game I have ever published and is also my introduction to game programming. The game was finished a month after I started development, and I did a lot of research and self-study regarding Unity, C#, and the algorithm used for the AI in the game.

TikTako can be played solo against an AI that uses the minimax algorithm to determine its best move, and I added some shortcut within the algorithm to significantly reduce the time it takes to calculate. The game can also be played by two players through local multiplayer. All the assets within the game are fully hand-drawn by me, with a lot of animated elements.

The game was published back on the 4th of August 2021, and within the first week of its release on itch io, it garnered over 1,400 plays. After its initial release, the game has been getting a steady number of players, and as of 2023, it has been played over 3,000 times.

Race Creator Unity
Unity Race Creator
C#
Unity
A designer facing tool that allows for the creation of a racing system within Unity without having to code anything.

The Unity Race Creator is a designer facing tool created within Unity which allows designers with no programming knowledge to create and modify a racetrack on a pre-existing game world. This was achieved by utilizing the custom window feature within the Unity engine. The Race Creator custom window has a number of options that is used to initialize the race, such as the number of checkpoints and the timer settings.

These values and more customization features can be found from the custom inspector that appears when selecting the race game object created by the Race Creator. Level designers can easily change the mesh, texture, and manage each checkpoint from this custom inspector without having to do any coding.

The Unity Race Creator also comes with a standard UI which displays crucial information such as the timer, lap counter, minimap and a waypoint to the next gate. All these values are stored in a separate class from the core racing system so a UI designer can easily use these values to create their own UI without having to interact with the source code of the game. The files of the project follows the structure of a Unity custom package, so it can be easily distributed to other computers or Unity projects.

For more information regarding this project, please refer to the Unity Implementation section (Page 4) within the Report Document.

Race Creator RayLib
RayLib Race Creator
C++
RayLib
A system that allows for the creation of a racing system within RayLib that only requires minimal programming experience.

The RayLib Race Creator is similar to the Unity Race Creator, but its built on RayLib. RayLib is a low-level game engine with no interface, visual helpers, or editors like Unity, so everything in RayLib is done through C++ scripting. The biggest challenge of this project was creating an easy-to-use environment for level designers to create and modify a race without having to interact with the source code of the game. To tackle this problem, the JSON Level Editor was made using Windows Presentation Foundation (WPF).

Because RayLib has less features than Unity, I had to create my own system in order to replicate the features present within the Unity Race Creator. For example, a combination of linear and trigonometric equations was used to display the waypoint to the next checkpoint correctly. A similar system is also used in the pathfinding algorithm of the AI racers present within the game. The AI racers can automatically progress throughout the race and compete against the player. These AI racers also has an adjustable difficulty that can be tweaked through the JSON Level Editor.

More information regarding the algorithm used for the AI can be found in the Racing Bots section (Page 10) within the Report Document.

Since the scripting for RayLib is done in C++, I had access to pointers so all the assets for the race are managed using smart pointers. Meshes and textures are only loaded once at the initialization of a level and a reference to them is shared to all the checkpoints to avoid each checkpoints having their own mesh and texture, which leads to significantly better optimization.

JSON Level Editor
JSON Level Editor
C#
XAML
WPF
An application made using WPF to easily create and modify a JSON file used for a game level through an interactive UI.

The JSON Level Editor is a tool made using Windows Presentation Form (WPF) to modify a JSON file used to load a race in the RayLib Race Creator. It allows level designers to create a new racetrack and modify them through a visual interface without having to code anything. The level editor has a number of features that gives a lot of flexibility to level designers to tweak aspects of racetrack such as the position, mesh, textures and number of checkpoints using the interactive UI.

Moreover, the tool can also add AI racers into the race by simply clicking a button, and the difficulty of each AI racers can be easily tweaked in the same panel. All this information is displayed in a 3D viewport which responds to the changes in real-time, similar to the scene view in Unity.

Prior to this project, I had no experience in creating a Windows application. However, I managed to finish the entire level editor within 5 days by doing a lot of research and self-study.

More information regarding this tool can be found in the WPF Level Editor section (Page 7) within the Report Document.

Platformer
Get Therapy
C#
Unity
Mobile
A dialogue based mobile puzzle game that touches on the complexities of therapy in a lighter tone.

Get Therapy is a mobile puzzle game made in Unity which deals with the complexities of therapy in a lighter tone. The gameplay consists of tapping on thought bubbles to progress through a therapy session. Depending on what the player says, the conversation will branch off into different endings.

In this project, I was in charge of creating the entire title and level selection of the game, the sprites and animations of both characters present in the game, the system that changes the colour of the background depending on the patients mood and building the game to mobile.

The level selection screen of the game can be controlled by performing a swiping gesture on the mobile device. This was done by detecting the direction of the swipe in script and then performing the appropriate animations. Both characters present in the game are made using Unity skeletal animation feature and was also animated by me within Unity.

The background colour throughout gameplay will reflect the mood of the patient. If the patient is feeling positive, the background will turn green, and it will turn red if the patient is feeling negative. This was done by having a variable that tracks the patients mood which is changed whenever the player chooses a dialogue options. The wavy effects on the background was achieved by playing a pre-rendered videos made in Adobe Illustrator.

I was also responsible for building the game to mobile, which is the target platform of the game, and managing the pull requests of the GitHub repository throughout the entire development of the game.

ShutteredMinds
Shuttered Minds
C++
SFML
Networking
An online multiplayer game networked using TCP sockets and features 2D raytracing.

Shuttered Minds is a multiplayer co-op game where you have to survive the cold night in an abandoned prison by fueling furnaces to stave off the cold. The game supports online multiplayer using SFML's TCP networking modules and can support any number of players. The game also features 2D raytracing for the lighting system to recreate the eerie atmosphere of an abandoned prison.

In this project, one of my role was to create aspects of the networking such as: creating and joining an online host, syncing the locations of collectibles across the network and syncing the fuel level of each furnace. I was also responsible for creating the raytraced lighting system and the rendering pipeline.

The 2D raytracing was achieved by first converting the wall in the tilemap into a series of lines and edge points (Refer to the 4th image in the slideshow). Afterwards, the intersections of the ray and the lines of the wall is calculated and the shape of the visibility polygon is rendered onto a render texture. Next, the render texture is used by the rendering pipeline as input for a GLSL fragment shader to create the lighting effect.

Boss Beater
Boss Beater
Python
PyASGE
A 2D turn-based PVE game with multiple maps, enemies and bosses, made in Python using PyASGE.

Boss Beater is a 2D turn-based game made in a group of 3 people as a university project. The game runs on PyASGE, which is a custom game engine made by my lecturer using Python. The objective of the game is to defeat the enemies in the desert, beach, and graveyard map without dying. The game features a unique fully animated boss with a behaviour tree for each map and some simpler enemies. The player can only perform two actions per turn, such as a ranged attack, a melee attack and moving to a different position.

My role in this group was to create the bosses with a unique AI and animations. The AI for the bosses is made using behaviour trees, which allows them to decide whether to move or attack the player and choose which attacks to use against the player based on its surroundings. The animations for the bosses are managed by an animation manager unique to each boss, which will wait until the current boss animation has finished before performing the next action.

I was also responsible for all the UI elements of the game, such as the health and stamina bar, the turn order shown on the right side of the screen, the title and game over screens. The turn order UI was done by reading the data from the turn manager that my team member made, assigning a name and an icon to each entity present within the level and displaying it in a way that is easy to understand.

PacMan
PacMan in C++
C++
SFML
A recreation of the original PacMan with an additional playable map, made in C++ using SFML.

PacMan in C++ features 4 distinct behaviours for each ghost with their own target destination for their pathfinding determined by the same algorithm from the original game. The tilemap for the game was made in Tiled and is read on runtime using tmxlite. The game has all the features of the original PacMan game: such as collectible pellets, power up pellets, multiple ghosts, and a high score tracker.

Additionally, the game also has a new unique map where the ghosts spawn in 4 different corners of the map. This was possible since the ghosts AI can take in different values for their spawning and respawn points, offering a lot of flexibility for creating even more levels.

Platformer
Frog Jump
C++
SFML
A 2D platformer game with easily customizable levels and complex movement, made in C++ using SFML.

Frog Jump is a 2D platformer game with a complex movement system. The player can perform a wall slide by holding the corresponding movement key into the wall and slowly slide down along the surface of the wall. While the player is performing a wall slide, pressing the jump button will result in a wall jump and launch the player up and away from the wall. This movement system allows for a more complex and engaging level design.

The levels in the game are made using a simple text file. The text file is then read by the game when loading a level and create game objects based on the characters and their position in the text file. As a result, it is very easy to create a new level or modify an existing one.

To complete a level, the player will have to collect a key after performing a series of jumping puzzles. The key can then be used to open a door which will complete the level. The player can also collect gems throughout the map to achieve a higher score by the end of the level.

The game also features a simple enemy which will patrol whatever surface they are on. The AI of this enemy can detect ledges and walls using simple 2D box collision and cause it to turn around in the opposite direction to avoid walking into a wall or falling off.

Platformer
Chatroom in C++
C++
SFML
Networking
A simple online chatroom with multiple channels made in C++ using SFML networking modules.

Chatroom in C++ is a simple online chatroom that utilizes the networking features from SFML. There are multiple channels in the chatroom that can be created on runtime by a client. The chatroom utilizes multi-threading to listen to messages sent by the server which is then displayed on the screen if the client is on the correct channel.

Programming Language Programming Languages I've used
  • C++
  • C#
  • Python
  • XAML
  • HTML
  • CSS
  • JS
  • HLSL
Tools Tools / Programs I've used