Amy Shifts Gears

The biggest solo project I have taken on so far. This is a classic adventure game with a unique 3D visual style, implemented in Unreal Engine 5. Amy, a bright young mechanic, explores an old institute, filled with machinery and robot characters, in order to rescue her dearest (mechanical) friend.

The setting and backstory are best explained in this prologue concept I made (in Blender and Grease Pencil, of course):

The bulk of the game framework is now implemented, and around 20% of the story content. I did show the game at a few playtest sessions! The main character, setting, and visual style were very well-received.

I also learned that designing an adventure game is no easy feat: players generally completed the demo successfully, but guiding them through the story without mental overload (too many open puzzles and story details), while not being too linear on the other hand – a challenge!

All in all, game development was moving along well. I began to realize, though, bringing this to a finish would probably require two more years of work. Also, as I continued to flesh out Amy’s universe, I got dissatisfied with not being able to tell more of that world, feeling the setting of this one game being to restrictive.

Eventually – not an easy decision – I decided to put the project on hold, and start over with Amy’s World, now in active development since 2024. I plan to pick up Amy Shifts Gears after the release of that game, as one story in the then-established universe. Let’s see how that goes.

I did get to learn and achieve a lot in UE5 during the year I was working on this project! Here are a few highlights:

  • Optimizing lighting for performance: I started out with Lumen, and then switched to baked lighting. The game runs decently on my iPad Pro now – great for showing it around!
  • Blender asset pipeline: There are a lot of quirks to get the Blender -> FBX -> UE5 export / import right – especially when it comes to animation. I set up my workflow to have assets in collections in Blender, and export them with one click into UE5, using a custom Blender add-on. I am generally happy with the low-poly stylized look, which also happens to be pretty efficient, being texture-less and using Blender’s modifiers to great effect.
  • Niagara particle systems: In this gameplay clip, the fireflies were implemented using Niagara, with quite a bit of logic behind it. I made a Youtube tutorial about this!
  • Lua-based story / dialog backend: I have used inkle’s ink scripting language before, with Unity. At the time, there was nothing comparable for Unreal, so I went on to implement my own framework. Also, I wanted full programmability in the story script. I came up with an idea for a Lua-driven system, based on co-routines and closures. Lua is easy to integrate into UE5 as a plugin. This system is working really well already – only the syntax is still horrible! A very simple interaction may look like this:
function Door_Interact()
    C {
        { "Open", ls.STICKY, W(function()
            if (ls.HasItemState("Door", ls.ITEMSTATE_LOCKED)) then
                T "[It's locked.*Ah, t|][|T]here's enough other stuff to explore first."
            else
                TAG "action open"
            end
        end)}
    }
end