
Project Details:
Hortalius is a first & third-person action adventure game where the player is shrunk to half a centimetre tall and lost in a garden. This project presented unique development challenges due to massive scale differences between objects and character control / navigation challenges. The game features both narrative systems and classic survival gameplay, with resource harvesting, base-building, crafting, inventory, and equipment systems.
Key Responsibilities:
• Lead Developer: Responsible for the majority of game design, gameplay programming, and systems programming on the project. Also integrating third party tools, character controller, AI, procedural animation, UI development, custom tool development, custom shader tech, and for tasking and unblocking the other programmers.
• Business Development: Developing timelines, budgets, and pitching materials to secure funding. Successfully secured competitive Creative Europe funding.
• Business Development: Developing timelines, budgets, and pitching materials to secure funding. Successfully secured competitive Creative Europe funding.
Technology Stack:
• Unity (various versions)
• C#, Visual Studio
• Built-in Render Pipeline
• Custom Shaders
• Perforce
• Miro
• Ora
Third Party Tools Used:
A* Pathfinding Pro, Amplify Shader Editor, Bakery, Rewired, Mesh Combine Studio, FPS Mesh Tool, Final IK, Ultimate Character Controller, Dialogue System for Unity, Compass Navigator Pro 2
• C#, Visual Studio
• Built-in Render Pipeline
• Custom Shaders
• Perforce
• Miro
• Ora
Third Party Tools Used:
A* Pathfinding Pro, Amplify Shader Editor, Bakery, Rewired, Mesh Combine Studio, FPS Mesh Tool, Final IK, Ultimate Character Controller, Dialogue System for Unity, Compass Navigator Pro 2
Examples

Procedural edge wear and rust
I built a custom shader for Hortalius that adds a procedural edge wear or rust effect to a standard metallic-based PBR approach. This allowed us to have the same objects throughout the game but in varying states of age and decay. It uses the material's normal map to detect edges and then applies the rust texture using a customisable noise pattern.
The intensity and reach of the rust can be modified in realtime, as can the noise scale and intensity. Since it uses the normal map, the rust naturally forms on edges, for example the rivet holes in the metal texture shown to the left. This approach allowed us to add wear and rust to objects without any additional workload, and more than doubled performance compared to previous solutions using a transparent overlay material.

Procedural Spider Animator
One of the enemies in Hortalius is a giant spider with complex behaviour. It needed to be able to walk over uneven surfaces without clipping, chasing the player across any terrain. I built a procedural animator for the spider that uses inverse kinematics components from third party tool Final IK, with a custom raycast based tool for foot placement and leg timing.
The spider's walkable area and pathing to the player were implemented using A* Pathfinding Pro, and the AI behaviour was implemented using a custom system. Animating the spider procedurally allowed us to make a boss enemy with complex behaviour that could chase the player over complex terrain. This gave the game designers free reign to build any kind of nest area for the spider.

Mining Beam System
The artists at Brain and Nerd created a 3D model for the Mining Beam in Hortalius, which I then implemented as a system. I created a mining beam controller that animated the tool, making the front section spin up over time and projecting a beam using a 3D line renderer. There was also a sound effect whose frequency matched the spin speed, a glow effect, and lightning effect.
I implemented a raycast-based targeting system and an overlay shader that made mineable objects glow when mined and then explode into shards, which fly toward the mining beam and are then collected by the player inventory system.
The mining beam system added a great deal of audio-visual polish to the game. The explosion particle effect was also designed so that it would automatically work on anything marked as mineable, making it easy for non-programmers to add new mineable items to the game.

Scanning System
One of the core features of Hortalius is that can you can scan anything to learn about it. I built a scanning tool with particle-based visuals and a holographic overlay that can be applied to any model. Anything marked as Scannable was assigned an InfoFile scriptable object containing information on the item, which is collected by the player and can be viewed in the UI.
I also integrated the scanning system into the crafting system and building mechanics. Any time the player scanned a craftable item or construction component or item they were automatically given the blueprint for that item. This gave us a completely freeform system that game designers could use to rapidly add new items to the game the player could scan and learn to make.

Procedural environment shader
In Hortalius we needed all objects to have a consistent visual detail and scale, but we had to use the same objects at drastically different scales and also had to combine meshes using batching for efficient rendering. For our environmental assets such as rocks and dirt I created a scale-invariant environment shader system.
We used a third party tool called Mesh Combine Studio to combine our environment geometry into efficient batches for rendering. I extended the tool with a custom process that baked the scale of each object into an unused UV channel in the vertex stream, then created a shader that read that for use in its own texture scale.
Finally, I created a single material that used texture arrays for the environment materials so different environment objects could be batched together.This approach reduced render load of the environment by over 90%, increasing the frame rate from around 30 to over 270.

Character Controller Integration
We chose to use Opsive's Ultimate Character Controller in Hortalius rather than building our own from scratch. This saved us months of dev time and allowed us to add movement techniques like climbing, crawling through holes, vaulting over obstacles, and balancing on ledges that came with the controller.
Integrating the controller came with its own set of challenges, however, as it was designed around its own inventory, equipment, and ammo systems we didn't need and didn't want to use. I built scripts that acted as interfaces between the character controller and our own systems to make it work. We were able to implement all of our tools using parts of the controller's weapon system, climbing and crawling systems, and even a jetpack system.














































