Game Engineering Portfolio
Freight Hopper
Husky Game Studio - Software Engineer
Freight Hopper
Physics-based, fast-paced, first-person platformer game
A short 10-level game to relax or compete for better times
Developed a Finite State Machine (FSM) API by:
researching existing solutions
receiving feedback from my engineering peers
iterating on it until it was easy to use
The player character, trains, and turrets utilize this API to control behaviors
Written for Unity 2020.2.1f1 in C#
The FSM regulates events and user inputs to trigger appropriate behavior
Reducing code complexity and improving readability
Created for my Applied Computing Capstone at the University of Washington Bothell
Featured on the Cross Reality Collaboration Sandbox Research Group, directed by Dr. Kelvin Sung.
The code from this project will be used in future game development courses by other students, found on my GitHub.
Learn about my custom Trains and Lasergrid building tools below.
B.A. Applied Computing Capstone Poster
Presented to my classmates and UW Bothell peers, this poster shows my capstone experience. From being onboarded onto Husky Game Studio, conceptualizing the FSM, graphically representing the FSM API, to the cycle of its development. For a better view of the image's graphics, click here.FSM API Organization:
A state machine must inherit the abstract class FiniteStateMachineCenter
States must inherit the abstract class BasicState
Sub-state machines must inherit from the abstract class SubStateMachineCenter, and must have a valid parent state
I wrote a tutorial for anyone to use my API and create their own FSMs. Check it out here!
Train Builder. Check out the Train Builder GitHub.
Enums to identify carts and cargo types
Repeat actions functionality to quickly create long and tall trains
Automatically links trains carts together with Unity Joints
Can increment per cart and make mid-train edits
Lasergrid Builder. Check out the Lasergrid Builder GitHub.
Set custom dimensions, like the number of laser layers in the grid, lasergrid width, and laser thickness
Customize which lasers in the grid are active
Minimized number of collisions to improve performance
Only one collision box per laser group. If there are gaps in the lasergrid, each group separated by a gap gets their own collision box
The lasergrid can be translated and rotated by the developer and the builder will generate lasergrid correctly using 3D mathematics
Raycasting Hierarchical Bounding Volume API
University of Washington Bothell - Game Engine Development
Studied technical fundamentals of game engines such as:
Software architecture, input, resource management, textures, animation, coordinate systems, object behaviors and interactions, camera manipulations, illumination and special effects, physics, and scene management
My work was based on the 2D game engine developed by Dr. Kelvin Sung, using Javascript.
Created a Hierarchical Bounding Volume (HBV) API
Improves ray cast collision performance from a time complexity of O(n) to O(log(n))
Collaborated with two classmates in its development. My work included the HBV's construction, storing of game objects, and traversal for collisions
Play the Two Games that Use the HBV API Here
(Must Run on Chromium Browser)
The ray cast (the red line), checks if it collides with the head node of the HBV
If it does, then it continuously recurses down the tree's children until it reaches a leaf node with game objects (the blue boxes)
Then it will check if it collided with the game objects
Rapid Game Prototyping
University of Washington Bothell - Independent Study
Made three game mechanic prototypes, advised by Professor Mark Chen
My goal was to learn a reliable process to quickly prototype game mechanics and to challenge myself in learning different aspects of game development
I wrote an outline so that others may use my process to begin prototyping their own projects. All of the projects were made in Unity 2020.2.1f1 in C#
Prototype 1 - One Juicy Mechanic
Prototype Target: make a simple mechanic, flipping a lever, feel as good as possible
The features in this lever include light levels dimming/brightening, the color of the lever handle and side lights changing, and randomly determined spark visual effects for extra flair
I learned how to manage event triggers and integrate audio/visual effects. In the future, I would like to explore other systems I could add to increase its juiciness
Prototype 2 - Fighting Game Controller Interpreter
Prototype Target: make a fighting game controller interpreter that can be used to perform complex fighting game mechanics like “motion inputs”
I wanted to learn this subject to understand controller input management
I learned how to build a flexible pipeline of input reading and input interpretation that can be used to trigger character behaviors
In the future, I would like to expand this further so it can interpret other kinds of complex inputs like charging inputs, fresh and stale inputs, and more
In the Input Moves Interpretation Demo, the player is making inputs on an XBOX gamepad:
Input Move 1 (Quarter-Circle): down, down-forward, forward + Punch button => Fireball
Input Move 2 (Half-Circle): back, down-back, down, down-forward, forward + Punch button => Red Fireball
Each joystick direction is associated with a value (Joystick Directions to Values). So when the player successfully performs a Quarter-Circle or Half-Circle with the joystick and presses the Punch button, they will perform the associated ability
Interpreter Organization:
Read Unity's input system for joystick coordinates and button presses
Convert joystick coordinates into direction values and package an array of the frame's input
Track inputs for duplicates and determine if its a new input or a repeated input
Record last 15 frames of inputs
Track for button presses. If a button is pressed, compare if the last 15 frames contain a stored input move in the dictionary. If there is a legal match, perform the ability.
Prototype 3 - Simple Dialogue System
Prototype Target: Make a dialogue system so the player could make branching decisions and repeat previous dialogue
I learned how to make a simple dialogue system suitable for linear visual novels and how to manage coroutines for asymmetric processing