Tiernan Watson

Overview

Welcome! I'm Tiernan, an alumni of University College London (UCL) Computer Science and avid game developer. I absolutely love making games and working in 3D space, but I have done more than that too!

The languages I am most proficient in are C++ and C#, but I can also use Python, GLSL and anything else I can learn pretty quickly!

You can find me on Twitter too.

Projects

URaider

C#, Unity, 3D Math

This solo project is a fully-featured action-adventure game framework for Unity that has climbing, combat, swimming, inventory and more. It is mainly based off the 2006-2008 era of Tomb Raider and uses extracted 3D assets from TRAOD (2003).

Player Controller

I built a decorator class on top of the Unity Character Controller to enhance player movement. One of the most important features was allowing the player to slide off slopes that are too steep.

Player State

I built a state machine from the ground up to control Lara's state. Example states include locomotion, climbing and swimming but there are many more. This means states can be easily added/removed in the future.

Physics

This project had some interesting problems to solve including ledge-targetting and grapple swinging. Ledge targetting involved finding the target upwards and forwards jump velocity using kinematic equations based on the ledge position relative to the player. Grapple swinging used the equation for the movement of a pendulum to provide controlled but believable motion.

Animation

I authored some of my own custom animations for this project in Maya using an IK Rig. Example animations include rope and pole swinging, as well as ledge climbing. These were controlled by using the an animation graph in Unity, as well as a class that provided an animation interface in C#.

Inventory

Lara has an inventory which is represented by a horizontal 3D ring like the classic games. This was done using circle equations.

Interactions

Lara can interact with items in the environment such as medipacks or doors. To manage these, colliding with an object adds the item to a script that manages possible interactions and pressing action looks through these to get the best one.

Source Code: GitHub (Code reference so no 3D assets)

Playable Demo: Dropbox (Oct 2021)


TombForge Game Engine

C++, OpenGL, Jolt Physics SDK, GLM

This is a game engine I am developing with C++ and OpenGL capable of playing 3D levels.

Rendering

The renderer has been written with OpenGL and has a few different shaders to use. One of the features of the renderer is the OctTree that is used for culling off-screen objects; it is populated when a scene is loaded and branches that are not visible are culled using frustum and plane intersection algorithms.

Future plans for the rendering include implementing physically-based rendering (PBR) and global illumination.

Animation

The engine contains its own 3D animation system. I have implemented my own Skeleton, Animation and AnimPlayer classes to store and play skeletons and their animations. Blending is also included so that animation transitions are smooth. Root motion is processed and allows accurate character movement.

Future plans include implementing an IK solver for features like accurate foot and hand placement.

Player Controller

Like my URaider project, player state is managed through a state machine except it is done through C++. The player state machine uses a proxy class to protect the underlying Lara data struct. Another approach could have been to use interfaces, or simply add accessor functions and make the data private, but this was the quickest approach at the time.

Physics

The project has the Jolt physics SDK integrated and is used for the player controller and level collisions meshes. Above you can see debug rendering enabled.

Serialization

Serialization takes place both in binary and human-readable JSON depending on the asset. Levels are serialized in JSON to help protect against corruption, but if I was to build a shippable game from this, they would probably end up in binary. However, meshes, for example, are serialized to binary by default.

Asset Management

Although the project makes use of smart pointers, there is also a base AssetLoader class that various asset types can extend from such as textures. This makes it easy to ensure that only one instance of a certain asset is in memory at a given time. It also gives more control over when assets are cleaned up.

Handles are used in areas like the renderer to reference certain assets such as a texture's GPU instance.

Source Code: GitHub (No 3D assets included)

Note: some areas of code will need to reviewed for potential refactoring.


TEngine

C++, ECS, Memory Management, Maths

This is an older game engine I worked on that was not finished, but I have included it because I spent time developing my own maths classes and memory management, such as a stack allocator and other types of allocators.

It also had an Entity-Component-System (ECS) architecture in the works.

Source Code: GitHub


Island Defence

C#, Unity, Procedural Generation (Perlin)

This is my entry for Search for a Star 2020. Although, I was only able to spend two days on the project due to other commitments, I did produce a procedural map generator that uses Perlin noise for height. The base project already included random 2D generation for a flat plane.

This project is not meant as a polished project, so the gameplay should be not be taken as anywhere near finished, the highlight is more the map generation.

Project: Itch.io


Portals

C#, Unity, 3D Mathematics

This recreation of the portal effect was made using Unity's (new at the time) scriptable rendering pipeline (LWRP). It works by having cameras attached to each portal, as well as a reference to its partner portal. The player's position is taken locally to a portal, and then transformed to world space out of the partner portal. This can be used to set the camera's location and rotation, after which it renders to a texture.

Source Code: GitHub


2178: Resistance

C#, Unity, Rope Swinging (Pendulum model)

This was a 2-3 week project created for Sumo Digital's Search For A Rising Star 2019 competition. It is a prototype that includes third person shooter style gameplay, along with adventure-style movement while not in combat. We had to work from a given base Unity project.

I created my first rope swinging system with this project with simple harmonic motion. The player can grapple defined points in the levels and swing, adjust their rope length, and turn around. They can also perform basic ledge grabs and climb up. The enemies in the game patrol using waypoints and attack if the player is within range and they can see the player.

Rising Star Finals

Download + Report: Itch.io page
Source Code: BitBucket


VR Cycling

C#, Unity, VR, Oculus

This was my project for the academic year 2018/19. My role was team leader, and our task was to create a Unity virtual reality experience for professional cyclists to help them train.

The project uses a VirZoom exercise bike and a Gear VR headset. The input data includes the cycling speed from the pedals and head yaw and roll. Records are kept on the user performance such as their top speed and distance travelled. We connected this app to the cloud for multiplayer and implementing 3D spatialised audio.

Source Code: GitHub

Employment

Football Manager 2022 and beyond - Sports Interactive (Aug 2021-current)

C++, C#, Unity

Currently I work for Sports Interactive on their long-running sports series Football Manager. I started off fixing bugs but have grown to have ownership of areas of the codebase as a part of the graphics team.

During my time there, I have developed graphical systems from scratch by meeting with both technical and non-technical stakeholders to identify requirements and tasks. I've gained experience with Unity shader graph, performance profiling and console development, as well as writing C++ and C# code.


GOSH DRIVE AR Friend (Summer 2019)

C#, Unity, Vuforia, .NET Core (Web API), SQL, SCRUM meetings

I spent the summer of 2019 developing an app at Great Ormond Street Hospital's DRIVE unit. DRIVE stands for digital research, informatics and virtual environments; they perform research for GOSH using techniques such as machine learning.

Working in a agile methodology, I was tasked with creating an augmented reality app with a virtual pet that is in a way similar to a tamagotchi. The goal was to provide an educational tool for patients, as they have to perform similar needs (such as hand washing) to their own.

Further to this, I created a visual scripting system inspired by Unreal Engine's Blueprints, so that new experiences can be created by non-technical staff. For example, infection control could make an experience with lots of hand washing throughout the day.


Project Fizzyo (Summer 2018)

C#, Unity, SCRUM meetings

I spent the summer of 2018 working alongside the UCL Institute of Child Health and Microsoft software engineers to debug and improve the games that were developed for Project Fizzyo. This project aims to improve the enjoyment and adherence of airway clearance treatment for kids living with cystic fibrosis.

My role was to fix the games up and improve them. I participated in stand-up meetings with Microsoft engineers.

Web & Other Projects

iHostPro (2012)

iHostPro

iHostPro was a web hosting company I started with two friends when I was 13. This was one of my first early insights to a professional arena. We offered budget hosting on our own dedicated server using Linux.

Newry Chat (2011)

Newry Chat

This was a social a network I started on my own for the people of my hometown. It used PHP & MySQL and provided functionality similar to Facebook at the time.

Lara Society (2009 - 2013)

This was my first real venture into proper web development. Originally, I had a fansite made with a free website editor in 2006. This made me want to learn HTML/CSS, which I then used to create my own Tomb Raider fansite that I integrated with PHP-Fusion. It featured a forum and news section, as well as galleries and information.

The website is credited, along with other fan sites, in the 2013 Tomb Raider game.

Contact

I am happy to hear about any potential opportunities.

You can reach me via my email: tiernanwatson 'at' gmail.com