Prize Kingdoms is a mobile game I worked on while at INK Games where I focused on full-stack feature development, performance optimizations, and cross-team collaboration. Below, I’ll dive into the details of one of the key features I developed, the first time user experience (FTUE).
The First Time User Experience (FTUE) is crucial for engaging new players. I designed and implemented a comprehensive FTUE system that guides users through the game mechanics, ensuring they understand how to build their kingdoms and participate in challenges. In Prize Kingdoms, the FTUE consists of sequences of steps that the player must complete to progress through the game. Each sequence is triggered by some in game event that the player performs.
These diagrams illustrate the API and server architecture I designed for the first time user experience.
The FTUE sequences are defined on the client and are represented by scriptable objects. Each sequence is a scriptable object that contains references to a trigger scriptable object and a list of step scriptable objects. The sequence scriptable object is pretty straightforward, but the trigger and step scriptable objects required custom editor code. I needed to be able to have a generic list of variables that could be any defined type I needed. Below you will find a couple of screenshots as well as a gif to demostrate the various data objects.
The FTUE runs inside of an Update loop inside of a pure .NET class, `FtueService`. It takes the next available sequence (if there is one) and awaits on the specified UniTaskCompletionSource to be completed. Once it is, the sequence commences and the steps (tasks) are ran. The visuals of the FTUE are implemented using MVC principles where there's a screen controller that builds and runs sub-tasks, that based off a data model, makes changes to the view (prefab). The view scripts are very minimal and just have accessors to needed properties.
This video provides a small snippet of the FTUE in action. It showcases the various steps and how they are triggered by player actions.