Astral Productions - Technical Gameplay Design

Job Overview

I co-founded Astral Productions to push forward both gameplay design and technical tooling while developing our current project, Astral Plague. Though this is an indie effort, I approach every system as if it were built for a fully funded, AAA-scale production — prioritizing scalability, iteration, and team growth.

Highlights of my work include:

  • Tool Development: Built lightweight, flexible tools to expand design functionality and accelerate iteration — including a fully bespoke branching dialogue system and a Google Sheets importer for rapid data-driven iteration.

  • Combat Design: Designed scalable, data-driven combat mechanics leveraging Unreal’s Gameplay Ability System and custom tools to balance depth, clarity, and responsiveness.

  • Systems & Movement Design: Prototyped custom spline-based character movement and camera controls for a hybrid 2.5D title, enabling dynamic player traversal not seen in comparable projects.

This role allows me to combine hands-on technical implementation with high-level design vision, sharpening the same skills I bring to collaborative AAA environments.

Some of my other pages contain content that is being developed for this project, I would highly recommend looking at them for more detail. I'll be adding additional info to this page over the coming months as we move to a playable demo.

Want to read something specific? Jump to…

  1. Tooling

  2. Reinventing Movement in 2.5D

    1. Spline-Based 3D Navigation for 2D Characters

    2. Mapping Movement to a Spline

    3. RVT Spline

    4. PCG Integrated World

Reinventing Movement in 2.5 D

Spline-Based 3D Movement for 2D Characters

Okay, that’s a lot of words—so what does it actually mean?

Essentially, while there are plenty of 2D, 3D, and even 2.5D games, very few fully side-scrolling titles preserve the freedom of movement you find in a 3D game. I wanted to explore that intersection. What if a player could move with true omnidirectional control—like in a 3D action game—while still following a guided side-scrolling path? And what if that path wasn’t locked to a flat axis, but could twist, curve, and branch, shaping traversal in a more dynamic and spatially interesting way?

Mapping Movement to a line…

The first thing I had to do was decide an approach, Unreal's spline were an obvious choice as they were lightweight and flexible while offering my just enough existing support and info to not require a bunch of additional legwork.

In the first prototyped iteration I grabbed directional input from the player's Input Action (X Value) to determine if the player was moving left or right. Once I had this value I could access the player's current spline owner and run through a series of functions to get the Actor's closest point on the spline. From there you almost need to do the inverse which is simply move forward or backwards on the spline, then convert that spline on the point back to the player's location.

It's important to note, because we have full 3D movement, the player's movement is rarely directly on top of the spline. They are usually off to the top or bottom, so retaining a persistent offset is important. This is key when later discussing the player's dash or other movement abilities.

Functionally this is a somewhat simple setup: Get spline -> Find Closest Point -> Transform Point -> Set Actor's Rotation. It's when the system begins to expand and account for more than basic movement that complex interactions occur.

Spline Rotation Adjustment Function. Called by *most* movement actions.

Choosing A Spline Owner

One of my main objectives was to fully embrace a 3D environment with multiple paths, which meant building a system that could dynamically transfer a player’s owning spline whenever they encountered a new route.

To achieve this, I needed to handle four things:

  1. Spline bounds

  2. Path validity and overlap

  3. Path priority

  4. Path transition

For brevity, I’ll briefly walk through each:

Spline Bounds

Splines in Unreal typically use very few points, which makes their bounds unreliable for path ownership. To fix this, I subdivided the spline in the construction script. By defining a width and dividing by collider size, I could spawn colliders at each subdivision. This gave me far more accurate path bounds, minimizing gaps or overlaps.

Path Validity & Overlap

Without guardrails, the camera would snap aggressively the moment a new spline was detected. To prevent this, I implemented a short timer system that checked two things:

  • Is the path valid? (basic safety check)

  • What type of path is it?

In this system, main paths always took priority over side paths. However, certain “unique” paths (like overlooks) could even override main paths. Each type also had its own overlap duration requirement: unique paths would take over ownership quickly, while side paths required a longer overlap before control shifted.

This layering gave us more natural transitions. Combined with environmental art cues to visually distinguish side routes, it prevented abrupt snapping while still allowing flexibility in player movement.

One of my main objectives was to fully embrace a 3D environment with multiple paths, which meant building a system that could dynamically transfer a player’s owning spline whenever they encountered a new route.

To achieve this, I needed to handle four things:

  1. Spline bounds

  2. Path validity and overlap

  3. Path priority

  4. Path transition

For brevity, I’ll briefly walk through each:

Spline Bounds

Splines in Unreal typically use very few points, which makes their bounds unreliable for path ownership. To fix this, I subdivided the spline in the construction script. By defining a width and dividing by collider size, I could spawn colliders at each subdivision. This gave me far more accurate path bounds, minimizing gaps or overlaps.

Path Validity & Overlap

Without guardrails, the camera would snap aggressively the moment a new spline was detected. To prevent this, I implemented a short timer system that checked two things:

  • Is the path valid? (basic safety check)

  • What type of path is it?

In this system, main paths always took priority over side paths. However, certain “unique” paths (like overlooks) could even override main paths. Each type also had its own overlap duration requirement: unique paths would take over ownership quickly, while side paths required a longer overlap before control shifted.

This layering gave us more natural transitions. Combined with environmental art cues to visually distinguish side routes, it prevented abrupt snapping while still allowing flexibility in player movement.

Accounting for Movement Abilities

A major consideration for this system was how to handle movement abilities. Basic movement along the spline was straightforward: rotation was continuously adjusted to match the spline, so the player’s motion naturally aligned with the path. But abilities that moved the player by a fixed offset—for example, dashing 100 units forward—didn’t work with this approach.

The solution was simple in principle but crucial for feel. After calculating the end point on the spline, I determined the offset and set that as the target location for root motion. However, since root motion doesn’t adjust rotation by default, I also had to apply rotation updates. Without this, abilities produced unnatural, straight-line motions that ignored spline curvature.

This is the key point: the system lives and dies on whether characters convincingly follow the spline. Any diagonal or disconnected movement (not driven by player input) breaks the illusion immediately. Imagine if, instead of rotating continuously, a character just moved forward and then snapped downward—it would feel exactly like AI pathfinding, which often looks awkward and robotic. The player should never be asking themselves “why is my character moving like that?” when using core movement or abilities.

Spline Dash Ability - Uses GAS.

RVT Path

To create path system, I designed a workflow that takes spline input (via PCG) and converts it into material data via Runtime Virtual Textures suitable for rendering and terrain interaction. The process begins by obtaining spline data via PCG tags. This data is then parsed for additional information such as a spline volume/size.

Once the core spline data is obtained we actually need subdivide the spline as our in-world spline has very few points. After subdivision a new spline is spawned via a spline mesh and a special material that maps to a RVT is implemented.

This mesh is only used for RVT data and has neither collision nor visibility. This RVT data can then be obtained in other materials (I use a global Landscape material) and mapped to the designed texture. This enables smooth integration with terrain materials, additional effects like blending dirt or foliage suppression, and ensures the paths feel naturally embedded into the environment without heavy manual sculpting or texture painting.

In addition, I also do some other actions inside of the PCG graph such as spawning rocks/pebbles on the path as well as spawning trees outside of the path's bounds.

Early Prototyped Path Using Generic Materials & Textures. Everything is spawned via PCG, no manual placement.

Final Note

The thing about this system it's its applicable for more than just my 2.5D application. You could also use this as a way of setting up a scripted path for a quest or perhaps pathfinding for AI. It isn't as though this system was designed and siloed off, it does support other direction if I or another designer wanted to do something diferent with it.

About

Gameplay Designer

B.S. Interactive Design

3+ Years Exp.

Resume

Location

Columbus, Georgia

Will relocate

All content on this site was designed and developed by Cole Andrews, unless otherwise noted. Any third-party tools, assets, or references are credited where applicable.

About

Gameplay Designer

B.S. Interactive Design

3+ Years Exp.

Resume

Location

Columbus, Georgia

Will relocate

All content on this site was designed and developed by Cole Andrews, unless otherwise noted. Any third-party tools, assets, or references are credited where applicable.