THRALL
7 Weeks
Gameplay / Product Owner / Design Lead / Sound
14
Unreal | Jira | Miro | Perforce
Trailer
Overview
THRALL is a narratively driven FPS horde slasher about creative combat and emergent strategy, where you, as a ghost without any abilities apart from moving and enthralling the living, need to possess enemies to use their unique combat abilities to survive.
This was my largest team to date, and despite varying Unreal experience, we succeeded through flexibility and strong communication across crafts.
In-game screenshots
Responsibilities
I led player and combat design, AI and Enemy spawner reworks, SFX implementation, and oversaw the soundtrack.
As Design Lead and later PO, I:
- Guided the team’s creative direction.
- Supported and later took charge of production planning, priority setting, and scope management.
- Wrote and maintained the GDD as our shared reference and ensured the implementation matched the intended experience.
Player & Combat Design (Gameplay)
I prototyped the player movement and abilities for the ghost, Knight (melee), and Bombardier (ranged) classes. When designing the abilities, since the game is about taking over your enemy to use their abilities, they had to be equally engaging from a player and enemy standpoint. For gameplay depth, we also needed each class to have distinct movement and utility. I focused on making abilities feel responsive and impactful to support the game’s power fantasy setting. Balancing across classes required constant evaluation of pacing, responsiveness, and readability.
Player mechanics showcase
Since the Possession ability is the game’s main mechanic, I spent much time refining the ability’s channeling and transition times and range to make it easy to use in hectic fights.
To reinforce gamefeel and player feedback, I also implemented dynamic camera shakes, adaptive FOV changes, and subtle timing adjustments to emphasize the weight of combat actions. Leading the majority of external playtests helped me translate feedback into clear design adjustments, resulting in smoother class dynamics and more engaging combat interactions.
In-depth: Bombardier class
Blueprint
My goal for the Bombardier, as a playable class and enemy, was a ranged area-control class focused on timing and positioning. To help players make precise throws, I implemented a trajectory preview arc that dynamically adjusts to the player’s aim. For some defensive utility, I designed the bombs to stun hit enemies on impact, which rewarded accuracy as well. I also gave bombs a visible blast radius, using emissive materials so it’s always visible, for player clarity. Explosion timings, damage ranges, and cooldowns were iterated based on tester feedback to balance the impact.
If CanThrow is True, Started (pressing left mouse button) activates the trajectory arc Niagara system.
Triggered (holding down left mouse button) calls Predict Projectile Path, which calculates the trajectory path through a PredictProjectilePathParams structure with Bomb Source’s (scene component childed to the camera) world location as its starting location, and its forward vector multiplied by a Speed variable as launch velocity. The prediction result’s Path Data (array) goes into a ForEachLoop, whose Array Element Location goes through a vector array of locations to use and adds to it. When the ForEachLoop is completed, it finally sets the trajectory’s position array. Since On.Triggered is on every tick, I added a Clear Array function to the Vector Array at the start of the logic flow for better performance.
Completed (releasing left mouse button) calls the animation and SFX, spawns the bomb (NewThrowable) at the Bomb Source with the player as Owner (to avoid player collision), and deactivates the trajectory arc. The bomb then calls the custom function Ignite Object, which makes it explode.
Event.Hit sets visibility and rotation of the blast radius, while logic for realistic rotation of the bomb (over a certain velocity) fires on tick. Velocity also controls playing the SFX (important UX feature to warn the player about unseen enemy bombs) via OnComponentHit, which also handles changing the AI state to stunned if it collides with an enemy. Event.Destroyed calls the explosion logic and effects at the bomb’s transform.
In-depth: Knight class
Blueprint
I designed the Knight to be a short-range, area-of-effect tank focusing on brute force and risk vs. reward. When the gameplay programmer and animator had implemented the first iteration based on the prototype, I balanced the class into viability for the game’s horde combat. As the player is often surrounded, I had to work a lot with adjusting HP, move speed, and the sword hit radius to achieve proper survivability and impact.
Due to how player depth perception works compared to an in-game camera, making the sword’s collider and hit radius feel sensible was an interesting challenge that required a lot of tweaking.
Sword box collider test
As another unique passive, I also implemented a stronger forward dash that knocks away enemies it hits to give the player more momentum, as playtesters easily got overwhelmed and surrounded.
An extra collider (DashCollision) activates on dash. A cast ensures that if the collider overlaps with enemy AI, their braking friction factor is lowered for a short duration, they’re knocked away through Launch Character, and enter a stunned state. Launch direction is set by Get Direction Unit Vector, subtracting the player’s location from the hit enemy’s location, multiplied by the Melee/Knight component’s knockback amount.
AI & Spawner Rework
I assisted the AI programmer in expanding on a previous developer’s work by taking ownership of enemy spawner behavior and combat flow. My goal was to make encounters varied and dynamic rather than relying on raw enemy count. Collaborating closely with the AI programmer allowed me to validate changes quickly and focus on how enemy composition and pacing shaped the player experience. This gave us a combat loop that scaled naturally in challenge and tempo, with reactive encounters supporting the game’s intended rhythm.
AI Spawners setup
Constellations & Spawner Setup
To better control the fighting pace and difficulty progression, I designed, built, and tested enemy team constellations through a data table set up by the AI programmer in which I defined team compositions and difficulty tiers. With the data table connected to a spawner, I then set its spawn thresholds and tiers to spawn. The spawner then chose constellations randomly to avoid predictable spawn behavior.
I tuned AI movement and behavior values, such as HP, dodge chance, and repositioning speed, in parallel to secure an engaging game flow both in horde and duel fighting.
The change improved the game loop as it allowed us to minimize wave downtime and even out difficulty spikes by avoiding overwhelming the player with enemy numbers and unbalanced encounters.
With more time, we would have included timers and thresholds on the spawners to control spawn signals and intervals in more detail.
Sound Design
I established the overall audio direction early on, creating a detailed document specifying style and function goals for SFX and music to keep the soundscape cohesive, and implemented them using Audio Components and box triggers.
Apart from player feedback and immersion, audio had to support the game’s narrative focus. To achieve this, I decided to go for full VO (with team members and myself as voice actors) to enhance the storytelling and worldbuilding, and mapped out all instances that required SFX, along with narrative beats with the narrative designer, to enhance the user experience and pacing.
In-depth: Dynamic Layering, Music Composition, Sound Design
Event Blueprints & Implementation
Another designer and I composed the soundtrack, where I did the title and dungeon themes in Logic. For player immersion, I used dynamic layering in the soundtrack’s Metasounds to have the music react to the intensity shifts when entering/exiting combat.
Setting events for cuing music versions
Activating/Deactivating the events
After setting up events to stop and start the music versions in the Audio Director, events in the AI Manager control when to call them. The result was that the music reacts to gameplay intensity, transitioning between combat and exploration/spirit versions seamlessly based on what’s happening in-game.
Sound Design & Implementation
As we had issues with third-party software versus version control, with little time to spare, all SFX were implemented directly in-engine, which limited my audio mixing abilities but saved us time. I handled attenuation, spatialization, and occlusion to anchor sounds naturally in the environment and assist the player in combat. Whether it was an explosive impact or more subtle UI feedback, I aimed to tune each cue to enhance clarity and reinforce the tactile feel of the gameplay.
Design Lead & PO
- 7-week schedule (5 sprints), minimal crunch
- 100% bugs fixed • 85 % delivery rate • 3.5-day avg cycle time
I guided key system design decisions to align with our goals, managed the GDD, and continuously balanced ambition with scope to keep the development focused and achievable. I worked closely with programming to validate implementation vs vision and with the art director to ensure the art aligned with the creative intent, providing clear requirements for art, animation, and VFX to support the player experience.
When prioritization became necessary, I had transparent discussions about features to deprioritize, focusing on production impact vs player value. By keeping communication open and clear, we kept morale and focus up even when cutting back.
What I learned
This project made me a more decisive manager and communicative designer with better tools for balancing ambition with production reality. Balancing hands-on design with scope management taught me a lot about split focus and making clear, value-driven decisions, which made me better at connecting creative direction and production management.
Designing class abilities that were fun to play yet challenging to fight pushed me to think more holistically about balance. Feature creep became a real test of discipline, where the designer in me wanted to explore freely, while the Lead and PO in me had to keep us focused. “For the good of the game” became our guiding motto when making tough decisions.
Reworking the AI and combat flow late in development reinforced the importance of flexibility and tight collaboration with programming, and showed how small and targeted improvements can outweigh riskier reworks.