Unmasked Truths: Shattered Dreams
A narrative mystery adventure inspired by Danganronpa and Ace Attorney, built in Unreal Engine 5 with SuperPROTEIN Studios.
Growing with the project
I joined Unmasked Truths as a part-time programmer while working another full-time job. For the first year, development meant evenings and weekends, fitting the project around my day job as my responsibilities grew. The story was already written and fully voiced, while much of the art production was just beginning. There was a lot to work out about how that script would become a playable game, and balancing both jobs made that first year particularly demanding.
A year into the project, I was offered a full-time role. Being able to give the game my full attention was a big turning point, with much more creative freedom to shape its direction. My role has since grown into Creative Technical Director and Lead Designer.
We work with over 50 collaborators across art, design, writing, voice acting, music, QA, and more. I lead the programming and game design, working closely with the other disciplines to turn ideas into something we can build. I work through proposals with the directors and give feedback as designs develop with the artists. Alongside the engine work, I build tools that let the team bring their own work into the game.
I've also taken on team management and mentoring, including six months working with a junior UI programmer. Keeping communication open is a big part of the role, whether we're reviewing work together or deciding what we can realistically achieve. It's been a gradual shift from implementing individual features to taking responsibility for how the game comes together.
Sharing the game with players
We took Unmasked Truths to Gamescom 2025, excited to share what we'd been working on with people beyond the team. After so much time developing the game, getting to put it in front of players on a show floor felt like a big step.
Our most recent showcase was Tokyo Game Show 2026, which was a real success for the team. We were excited to bring the game to Japan and share it with a new audience. Taking a project that began as a finished script all the way to an international show has been something to be proud of.
The trip came with an unexpected adventure: our final day at the show was cancelled due to a typhoon. It also happened to be the day we were moving hotels! The team loves an adventure, though that was a little more than we'd planned for.
Play the current demo
We've released multiple demos as development has progressed, and our current demo is available on Steam now. You can try the game for yourself and get a feel for the story and the world we've been building.
Play the demo on SteamStreamers and a growing community
T10Nat visited us at Tokyo Game Show (whom we love!!), and we've also had coverage from lots of other streamers for our Steam demo. It's exciting to see the game reaching people through their channels, as well as through our own demos and showcases. Seeing the great reactions players have to our game is exactly what we make games for.
The community around Unmasked Truths has been growing too. Seeing people follow along while we're still building the game has been a welcome part of the journey.
- Steam wishlists
- 10k+
- X followers
- 2.9k+
- Discord members
- 1.8k+
As of October 2026.
Project challenge
Building the dual-camera dialogue system
Our dialogue originally used one camera, moving between characters as they spoke. The team wanted to show two characters at once, similar to Danganronpa. In our game, though, the characters are placed in a full 3D world, so showing a second view meant rendering the environment again. With Switch 2 as a performance target, that was a substantial cost.
I spent two weeks designing the system and trying different approaches. I staggered the cameras across alternate frames and reduced how often the secondary view updated, but the result looked choppy. Lowering the render resolution helped, with the smaller view rendering at a lower resolution than the main one. Eventually, I found that freezing the secondary view while the other character was speaking felt much smoother than updating it intermittently.
Detailed backgrounds were still expensive, especially foliage. I added gentle fog and distance occlusion for the dialogue cameras, along with a cheap seven-directional blur. The built-in blur was too costly for the effect we needed.
I worked back and forth with our UI artist on five layouts, each framing the two views at different angles. Getting their motion and masking to work in Unreal took a lot of iteration. I used retainer boxes and colour-keyed masks to achieve the look, accepting some GPU cost where it was needed for the effect.
The camera work also exposed problems elsewhere. Sprites could appear before their textures were ready, causing white flashes, and blends sometimes reported that they had finished too early. These glitches were especially visible when fast-forwarding. I built a custom sprite-loading system and refactored the transitions so the current view finishes its camera movement and sprite changes before dialogue switches to the next view. The wait is usually only milliseconds, but it stopped those small glitches from slipping through.
I tested the system in one of our most demanding scenes: all 13 characters outdoors, surrounded by foliage, with the campus building at full detail behind them. It had dropped to around 15 FPS even on powerful PCs. My camera and rendering changes brought it to roughly 60–90 FPS in the heaviest moments. Further optimisation with the 3D team brought the scene to 140+ FPS.
I'm particularly proud of this system. A request for a new dialogue presentation ended up pushing me to improve the loading and transitions throughout the game.
Project challenge
Leading the game's UI design
Unmasked Truths has over 100 different UI screens, and a huge part of the player experience depends on how they look and feel. Alongside the programming, I've taken on lead UI design, working closely with our UI artist and the directors. My background in graphic design, followed by marketing and frontend work during university, has been useful here.
The class-trial screens needed the most iteration. One particularly demanding minigame took around two weeks to design and assemble in Figma before I even started implementing it in Unreal. I pushed for a cohesive layout and worked through how its components would move together. The presentation had to make the gameplay exciting while keeping it clear enough to follow.
Our process involved a lot of back and forth. I sketched alternatives, put together sample layouts, and demonstrated how I wanted the motion to feel. Our UI artist developed the artwork and refined the animation samples, which I then recreated in UMG. Bringing those designs into the engine often meant another round of adjustments for functionality or consistency with the rest of the game.
Some of that work also meant revisiting the gameplay rules with the directors. With the story already written and recorded, we had limited room to change things. I worked through what was feasible to implement and how it would feel to play, then brought those decisions back into the UI design.
The directors were impressed by how ambitious the interface had become and the thought going into every detail. Seeing it come together in-game made that work worthwhile, and they were delighted with the result. The main menu and the in-game tablet also went through several revisions and have received really positive feedback.
When players started comparing the UI's look and feel to Persona, I knew we'd reached something we'd been aiming for. That was our reference for the quality of the presentation. Hearing that comparison from people playing the game made all the iteration feel worthwhile.
Project challenge
Matching 12,000 voice lines to the script
The original game had around 6,000 recorded voice lines. The recordings arrived as thousands of files whose names corresponded to a giant spreadsheet. The original script didn't use those filenames, so I needed to connect each written line to its recording. Some lines had been cut, and the spreadsheet's wording sometimes differed from the script to reflect what was actually said.
I'd initially been focused on building the text dialogue system. Once I faced the scale of the recordings, matching them all by hand wasn't something I seriously considered. I built script-to-Ink conversion tooling and wrote Python scripts to attach the voice IDs. The matching allowed for differences in wording. When that didn't find a match, it used the IDs of the surrounding lines to infer the missing one. If that wasn't enough, it made a best guess using the line and scene numbers together with the speaking character.
Every guessed match received a searchable comment in the generated script. Narrative designers could find and verify those lines while revising dialogue and adding scene behaviour, keeping the uncertain matches visible for review.
I used the same voice IDs as localisation keys, looking up translated text in Unreal data tables by row name. Unvoiced lines, such as dialogue choices, received their own IDs through a new loc tag in the script. This kept localisation straightforward to integrate across the game.
Japanese voice-over came much later in development, bringing the total to roughly 12,000 recorded lines across both languages.
The first time I had an entire scene voiced in-game with just a few clicks was a huge relief. The tools could also batch-convert hundreds of scenes in one call. Automating the matching saved an estimated hundreds of hours of manual work.
There is still plenty of scene authoring to do. Narrative designers add sound and music cues, write function calls for specific behaviours, and create scene states in the editor. The tooling handles the bulk conversion and matching work, leaving those decisions with the people designing the scenes.