Tools and Articles
"Babel Fish" - Sentence Generator
Babel Fish was a Test Driven Development project I worked on in my free time in an attempt to save Avid Games money translating cards. The idea was to take the ability config JSON files and turn those into consistent text using fragments of sentences and substituting words.
The project went well, I started out with ov er 4800 unity tests for the existing abilities and as I worked through making the tests pass I identified lots of problems with our current system, and continued to make progress without hitting any mutually exclusive problems.
The end goal was to make all the wording on the cards consistent and remove any deprecated configurations, updating them to the new style, while also making the card data better suited for automated testing. Once I had the core systems working, I was able to adapt it to create a easy to user interface where the user could configure the ability quickly and easily using drop downs and get an instant preview of how the ability text would come out. This was designed to replace the existing process which involved a spreadsheet with hundreds of columns where each attribute of each ability requiring someone to enter a number in the correct column, a system that was very prone to human error.

CUE Power Analysis Tool
The CUE Power Analysis Tool (or CUEPAT for short) was a tool I developed using Google Charts, it was fairly simply loading in the abilities data and had some good quality of life features such as showing card images and ability text when the mouse hovered over cards.
I initially created the tool after I realised a automation framework would not be viable due to the way abilities were configured, and I wanted to understand this system better and provide a tool to help the company balance upcoming releases, and make informed game design decisions as we were releasing cards on a rapid schedule and weren't able to test each release for power.

Material Manager
The Material Manager was a simple Unity tool I developed to ensure animated materials did not get unintentionally edited.
In Unity, if you don't create a bespoke material instance, and you have an animated shared material it's easy to accidentally cause changes while working in the editor, especially if the editor exits play mode mid animation.
It's the sort of a mistake that is easily done, and often only the animator will understand the cause if a material starts to look different.
While this is easy to mitigate in many situations, I was working remotely with developers that didn't know all the ins and outs of materials in Unity so to prevent clutter in git, and prevent the other developers accidentally commiting a material in a state that would impact an animation I developed the material manager to track any animated materials and store a copy of all the material settings. The tool would check these settings whenever the project was saved and revert and unintentional changes that weren't saved to the Material Manager tool.
Side project development blog - June 2020
Island Generation Process and Iterations
Armed with my island generation tool and my texture blender tool I’m now able to quickly make simple procedural islands and texture them in a couple minutes.
The process is simple, bringing in noise texture and a mask as a base I can quickly make an island mesh with the island creator component and save that to a prefab, creating a heightmap for that island.
Running the heightmap through the texture blender with generic rock, sand and grass textures I can make a simple believable island texture and adjust the scale and affected areas of each texture quickly with the live preview.
Once happy with the preview I can export the image to the project with a single click and drop it on the material to see it on the island in 3D.
The next step will obviously be to automate and randomised this entire process, but to do so will take some time to tweak and fine tune the random ranges used as input so as to not generate complete garbage.

Texture Blender Tool
I decided my Island generation tool would need to generate textures but I thought this logic would work best as a standalone tool, it also didn’t need to just be a script as I could also write a custom editor window and UI for a texture mixing tool in Unity.
I gave the texture blender 2 modes, first is a simple multiplication mode which was easy to add in, the second mode blends textures according to heightmap values, which is how I intend to create believable procedural textures for the islands.
The tool can be used entirely through method calls without using the UI as all the functionality is separate from the editor window class.
I’ve got the Preview and main settings such as blend type and live preview first.
The height map information is only show in heightmap mode.
The majority of the settings are collapsible or displayed depending on the selected mode. so that you can make space to see the preview while you adjust settings.
The preview is optimised to 128x128 pixels, but exported images are larger and displayed when possible.
While this tool was predominantly designed to generate island textures from a heightmap at runtime it will also have a lot of other applications, such as creating generic terrain. You can see a quick mock up of a low poly mountain range I made here.

Island Terrain Generator Tool
For a new side project I wanted to be able to procedurally generated islands and maps at runtime, so I thought it would be fun to write some tools to help automate this process.
I began fairly simply generating a mesh in Unity, I considered using a vertex shader for mesh manipulation but in the end decided to go with a C# tool as it was something I had less experience in and wanted to learn more about. Also I wasn’t too worried about the performance of this tool as it could easily run during a loading screen and I didn’t need it to work instantaneously.
Once I have a simple grid generated I could adjust the Y position easily with a height map, I then took this a step further blending it against a mask texture, as well as mixing in a secondary texture.
Finally I added controls to adjust the scale and offset the position of the source textures. Although I was surprised to run into some issues with this and because of some caveats with how I’d constructed the mesh and was iterating through the vertices, I was unable to copy paste my preferred method of offsetting the UVs by (0.5, 0.5) making an adjustment with the texture centred and returning them to their original position after the transformation.
The next step was to create a texture for the island terrain, for this I would need to have some way of retrieving the data from the procedurally generated island so I decided to export a simple height map whenever a mesh was created.













