Janky Spline Tiler

Janky Spline Tiler is a toolset that uses the Unity 3d spline package along with prefabricated 3d models to tile and conform 3d models along a spline path to speed up the creation of easily customisable structural and environmental features.

Overview

During my own work I encountered limitations in the functionality of other developers tools that at times would halt my progress all together.

Out of frustration and the determination to have a tool that just did what I needed it to do I created Janky Spline Tiler.

What I needed

When working with other spline based meshing tools there are three main categories they seem to fit into: extrusion based, single repeated mesh, and Instanced repetition.

Extrusion uses a 2d shape and extrudes it along the length of the spline creating the 3d mesh. This is great for creating a simple mesh with procedural UV's but is incredibly limited in its use cases.

Single repeated mesh workflows add much more creative control by repeating and conforming a supplied 3d model along the length of the spline and are great when needing to simply create a single mesh.

Repeated instances are similar to the single repeated mesh method but instead of creating a single mesh, individual meshes are repeated and conformed along the spline. This creates many individual meshes within your scene which can quickly impact editor performance.

What I needed was something similar to a single mesh workflow but allowed me to use multiple meshes or "tiles", swap out tiles at any given point in the spline, include all materials and submeshes within a tile in processing, and then combine them all together into a single mesh.

The Unity 3d spline package

When working with spline meshing there are two non-negotiable musts that users need to supply to generate a result; Definition of a spline path or shape, and defining the geometry that would be used for meshing.

Janky Spline Tiler uses the Unity 3d spline package as the backbone for a users creation and manipulation of splines. I chose this approach rather than creating my own spline system as it provides users the ability to layer the functionality of other existing tools over the top of Spline Tiler, work with a stable and well documented spline system, and sidesteps the need to learn how a bespoke spline system functions.

As I decided to leverage an established spline creation system, I was able to fully focus on the second of the two musts - geometry.

What do developers need?

Developer are often time poor and need fast effective solutions that work out of the box. From my own experience, tools that make me work to make them work destroy flow and block me from generating the outputs that I need to create valuable progress. Solutions need to be intuitive, sensible, and flexible but most importantly - do the job I am purchasing them to do.

The customers

My target customers group were small indie developers and studios, and predominantly users within who would be responsible for building levels. While these customer would be the core target, I also wanted to consider how effective my tool might be for studios at scale.

Modularity

To keep things flexible and adaptable my tool would need to be appropriately modular. I wanted modularity to not just feature in the tools system architecture but also in the workflow supplied to customers. To achieve this I had to answer two important questions:

  • How do I make preparing assets for spline meshing as easy as possible?
    Spline Tile - This component is attached to an asset and automatically identifies the mesh boundary. The mesh boundary then is used in mesh generation operations.

  • How do I make generating the spline mesh as easy as possible?
    Janky Spline Tiler - This component is attached to a spline and simplifies how the spline mesh will be generated into an intuitive UI and automatically regenerates the mesh based on changes to the spline.

Brute force iterations

While very rarely the best method for designing and developing a product, I began without a predefined plan. I knew that this was going to start with a technical discovery that would culminate into a product rather than a planned design to development product cycle. I also wanted developing this tool to be fun and engaging, and so approaching it like a child playing with putty helped me not turn development into something I might eventually loose interest in.

I began by creating small test components that performed specific functionality for the purpose of better understanding the boundaries and requirements of Unity's spline system.

This let me rapidly iterate through concepts that would act as foundations for the system. This loose, chaotic, exploratory research step provided insights and considerations into the future systems architecture and what I would needed to consider as I began to build the tool.

I did not do this unaided - I am not a programmer. I used AI to help me with navigating iterations, complex issues and providing input when I hit walls.

As I iterated, each component became larger and more complex but every 2-3 iterations, I actively stepped back and spent time refactoring and simplifying the code .

Condensing

Through each iteration the form and functionality became more defined until I had a foundation that I felt was solid and modular enough to work from.

I then pivoted onto implementing a front-end experience that would connect everything together for users.

What I arrived at was a system comprised of 4 core, 2 front-end, and 3 helpers scripts.

For brevity I'll only touch on the 4 core scripts making up this system.

The Product

Spline Tiles

The Spline Tile component is the most important component within the system. Without this script the spline meshing system does know have the basic information required to know what a tile is.

This component provides:

  • The tiles boundary - The scale of the tile on each of its local axis.

  • The tiles length axis - The axis that specifies the orientation of the tile. This is the axis that will conform along the splines length.

  • The tiles flex limits - How far, in world units, the length of the tile can be scaled to better fit the length of the spline.

  • The tiles parent - This is, within the tiles hierarchy, the root for recursive mesh and material searching operations.

Janky Spline Observer

The Janky Spline Observer component is responsible for notifying other components of updates to the spline.

This component provides:

  • A predefined check interval - This is a fixed rate coroutine used to check if the spline data has changed. It allows for users to reduce how often the mesh is regenerated when editing the spline.

  • A bool to toggle of regeneration - When working with large complex meshes editing with regeneration checks can cause too much overhead and so this has been supplied for said use case.

Janky Spline Tiler

The Janky Spline Tiler component is the power house of this system and provides all mesh generation logic.

This component provides:

  • Editing and defining the tile set - User controls for supplying the tiles that will be used for spline meshing with additional height and width scale controls.

  • Randomisation - Offers both random seed and fixed seed based random tile placement with per tile weighting amounts. This allows for runtime randomisation.

  • Tile segment overrides - The ability for the users to specify what tile appears at what point along the spline. Overrides fix a tiles placement meaning that when using randomisation the specified tile will always generate at the specified position.

  • Additional mesh generation controls - Options to ignore the roll along the spline, Generate a mesh collider for the spline mesh, and weld tile seams on regeneration.

  • Export mesh to FBX - This uses the unity FBX exporter package and lets users simply export the generated spline mesh to a FBX file.

Additionally this script combines all tiles meshes, sub-meshes, and materials into a single mesh while preserving all UV mapping.

Janky Spline Snapper

The Janky Spline Snapper component a utility component used to attach a knot within a spline to a specified gameobject.

This component provides:

  • A knot selection workflow - The ability to directly specify what knot will be attached to the gameobject within the scene view.

  • Knot orientation editing - Rotational offsets to help make sure the knots connection to the supplied gameobject is seamless.

  • A persistent connection - Once a seamless connection has been made, any changes to the gameobject will additionally update the spline knot and so the spline. This means that editing your level and spline meshs becomes extremely efficient.

Working with developers

Studio contact

After releasing Janky Spline Tiler to the Unity Asset Store I was overjoyed when a team member developing the game Kinstrife reached out to enquire about the products functionality and whether it would be suitable for use in their game.

This began a conversation that allowed me to establish deeper insights into the functionality from the tools they wanted and how I might update my product to meet their needs.

A valuable new feature

Their team were specifically looking for a tool that, in addition to spline mesh generation, would allow them to optimise the generated mesh using LOD's (Level of detail processing) for better runtime performance.

They found that other tools generated a single mesh as an output and at this time that is exactly what Janky Spline Tiler did. This was an issue as when using LOD systems the calculation of what level of detail should be rendered is based on the distance from the camera to the pivot point of the 3d model. For large meshes this means that a low level of detail was often being selected for rendering even though the camera was close to the mesh.

I researched some available options that would not require my system to pivot to a Repeated Instance workflow.

What I eventually attempted to implement was a chunking system based on a world space 3d grid. This worked well at first but I quickly realised that this caused issues with polygons that crossed between chunk boundaries.

I then found a new release by unity on an import feature that would be arriving in a future version of unity. This feature would automatically LOD meshs on import reducing a couple of refactoring considerations that I had was stuck on.

Finally I landed on implementing a chunking system generated chunked meshes based on a specified number of tiles. After testing I found that this method worked well for both existing LOD systems and the future functionality coming to unity.

I offered the Kinstrife team a free copy to test if the new chunking functionality met their needs which, with positive feedback, resulted in them purchasing Janky Spline Tiler.

Something spooky

Haunted Roads

While I created some documentation and tutorial videos for those considering or purchasing Janky Spline Tiler, where I put most of my effort was into an example project that would be included in the product.

The example, Haunted Roads, is a fully functioning first person horror game. While not that scary, it was a great way of providing customers with tangible reference for how the product functions, its flexibility, and level construction capabilities.

I additionally released Haunted Roads to Itch.io as a pre-purchase demo. Unexpectedly, a youtuber picked up and played the game on their channel which was a surprise bonus.

Results & Impact

Janky Spline Tiler was a huge undertaking but is exactly what I hoped to be able to provide to the community.

At this time sales have been consistent as well as a humbling amount of positive feedback and surprisingly few complaints.

© 2025 Vincent Beatty