This project is a result of an art test wherein I was given a week to create a zombie horde-style game using the Unity Engine and implementing an HLSL shader, a state machine, and some form of 3D vector math.
I began by creating a player controller so that I would be able to more easily test things in the future. This was my first time working in Unity, but I had several small, unfinished projects in Godot, so I was able to reference some of them to quickly create basic movement for the player.

If the result was greater than the zombie's view angle, that meant that the zombie was facing toward the player. After that, I sent a ray-cast from the zombie to the player to detect if the first object hit is the player. If both of these are true, the function returns true, if not, it returns false. Using this, the zombie was able to detect the player, and this met the requirement for 3D vector math.

After downloading and implementing assets and creating a basic environment, I began work on the enemy zombie AI. I began by creating a flowchart for what the state machine would look like.
In the default Update() function, I created a switch statement, switching on a state enumerator, then I created a function for each state of the machine. Each update, the zombie script checks what state the zombie should be in, and runs the corresponding function.
In each of the functions aside from the attack state, I needed some form of player detection. In order to achieve this, I implemented a function that simply returns a boolean based on whether the player is within the sight angle of the zombie and there is nothing between them. I started by calculating the dot product of the zombie's forward vector and the direction to the player.

With the state machine done, all I had left from the requirements was an HLSL shader. I decided that some form of river of sludge running through the middle of the map would work best. In order to make it look like it was flowing while still matching the cartoony style of the rest of the project, I used a sin wave with the world position to generate striped colors, and a sin wave with the game time to generate movement. I spent some time tweaking values to exaggerate the effect to a degree that I was happy with, and I was finally done.
I only had a few hours left before the end of the art test, so I created a build for both Linux and Windows for testing, fixed a few bugs that I found, and turned it in.
While there are a few minor things that I would fix if given the time, I'm overall very happy with the result.