About Me
I am a Tools Engineer that started in the industry as an Environment Artist. I have 10+ years of game industry experience spread across environment art, tech art, and engineering. I have about 4 years of Tools Engineering experience in Unreal Engine 4/5.
I am passionate about making tools and helping content creators create high quality content faster than they ever thought they could. I am also obsessive about good tools and workflow UX and push as hard as I can to deliver tools that are easy to learn and use.
I am passionate about making tools and helping content creators create high quality content faster than they ever thought they could. I am also obsessive about good tools and workflow UX and push as hard as I can to deliver tools that are easy to learn and use.
Unity Farm Game Prototype
This is a game prototype I made in a month for a game jam. I was inspired by how much I love farming in Stardew Valley. I made heavy use of Unity's scriptable object system for the inventory, game time, farming, and interact system.
Here is a technical breakdown for these systems:
Here is a technical breakdown for these systems:
Data Driven Interacts and Inventory Using Scriptable Objects
Pick up item:
A pickup item in the world contains a reference to a 'GameItem' scriptable object. The 'GameItem' scriptable object is defined as follows:
The inventory system stores this 'GameItemData' reference along with a count of how many are in the inventory. Then the GameObject instance in the world is destroyed if the inventory add was successful.
|
Action Item:
When the user left clicks with the equipped item, the code applies the 'FarmActionItemData' to the world interactable. The 'FarmActionItemData' scriptable object is defined as follows:
For a planting a new crop action. The content has 'RemoveFromUserAfterAction' set to true, 'UpdateFarmCrop' set to true, 'NewFarmCrop' set to the crop GameObject that it will plant, and 'NewCropState' to enum state CropState.Seed.
If the interactable object the player is clicking on accepts this action then the code applies all these data changes to it. The interactable code implementation will have the logic for updating the visuals of the state change. For planting a new crop the code will spawn the seed GameObject on the FarmBlock. |
Scriptable Object Minute, Hour, and Day
An important part of the game is that progress for the crops are made at the end of each day. It is also important that I can tune how long each day takes for the player.
|
A MonoBehaviour script turns the real game seconds into the scaled game seconds using the MinutesInGameDay scaled value and writes the data into the 'GlobalGameTime' scriptable object.
The 'GlobalGameTime' scriptable object sends an event out when the Minutes(15 minute increments), Hours, and Days change. The UI subscribes to all these events to update the clock display in the top right. The crops in the world subscribe to the the Day change event. When the day changes they can check if they are watered, add a growth day, and then update the visual state if applicable. |
C# WPF Async Job System
This prototype project is an asynchronous job system that reports results to a WPF UI which operates on a different thread. This allows users to add, stop, start jobs through the UI while jobs are still running.
Example of it running using randomly generated 200-1000 ms sleep tasks:
Example of it running using randomly generated 200-1000 ms sleep tasks:
The system has a few simple layers to make it work. First is the JobTaskManager class that manages a concurrent queue of JobTask classes and the processor thread those JobTasks will be run on.
Job Task Manger:
|
Job Task:
|
IWork Interface:
Classes that use the job system must implement the IWork interface. The heavy workload of the class would be inside the WorkTask method. After the JobTask finishes with the WorkTask it automatically calls the WorkCompleted method, which can be used for any special end of process clean up steps the job might need to do.
UE4 Blend Material
Material Instance:
|
Features:
|
Maya To Substance Bake Tool
The goal of Bounce Bake is to drastically reduce setup time when baking a highpoly to lowpoly asset. It is a streamlined user interface that allows the user to interact with Substance Batch Tools inside of Maya.
From my tests it takes an artist about 20-30 minutes to setup, organize, export, and hook up all the parameters in an external baking program, and this doesn't even count the actual bake process. Bounce Bake cuts this setup time to around a minute and will generate an organized output for them on disk.
Results:
From my tests it takes an artist about 20-30 minutes to setup, organize, export, and hook up all the parameters in an external baking program, and this doesn't even count the actual bake process. Bounce Bake cuts this setup time to around a minute and will generate an organized output for them on disk.
Results:
UI and Tool Features
1) 'Config' menu allows the user to set what the default bake settings will be globally. All tool customization settings are saved to a json file.
'Support' menu lets the user open how to guide, readme doc, and report a bug through an email alias. 2) 'Make Bounce Groups' button sets up the outliner with the defined high/low group structure that will be used for baking.
3) 'Make Cage' button takes all the lowpoly meshes and creates a cage mesh with an inflate slider.
4) 'Name Match Tool' button launches a separate window that lets the user quickly organize the highpoly and lowpoly to take advantage of Substance's name match feature. Instead of doing all the naming by hand this feature lets them select the highpoly parts and lowpoly parts together to name and organize them all at once. The UI also gives a visualization of what meshes are name matched and the ability to select and isolate display the meshes. Here is the UI with an example asset:
|
5) Simple toggle buttons that turn on/off the display of the bake groups.
6) Cage adjustment controls.
7) Textures and bake settings, plus the ability to set to whatever the default settings the user set in the config menu. These bake settings are stored inside the Maya file, so returning to a Maya file will load all the settings from the previous bake that was done.
8) 'Run Bounce Bake!' button will error check the bake setup and then run the bake with all the settings. The tool will export the meshes and send the data to the Substance Batch Tools process.
9) 'Update/Create Painter File' button takes all the baked maps and lowpoly mesh and sets up a new or existing Substance Painter file with everything imported.
Bounce Bake is written in Python 2.7 using the Pymel library and Maya's built in UI methods.