Louis Vogel
Viscera

Viscera is a fast-paced first person hack'n'slash arena fighter. We developed it as a team of 11 students in Unreal Engine 5 as our final Masters project, over 5 months and alongside our classes.

You can watch the trailer here:

The goal of the project was to build a vertical slice in a studio-sized team. As shown in the trailer, the game offers two ways to defeat enemies: a violent approach and a non-violent one. The violent approach plays like a classic melee first person game. You slash enemies to reveal their weak points, then stab those weak points to finish them. The non-violent approach is more involved. You can possess other enemies and play as them. Each time you possess a new body, you leave a trail between your current and previous one. If you manage to possess enemies in a loop and close it by returning to the first one, every enemy in the loop is removed peacefully. This may not be very clear, so here is a video showcasing this feature :



We were three programmers on the project and we split the work according to what we saw as the three main challenges: a satisfying character controller with responsive movement and good juice, a solid enemy AI that reacts meaningfully to the player, and someone to handle the global architecture and everything that did not fall under the first two tasks.

I handled the character controller. I worked closely with one of the two game designers to build the best version we could. We benchmarked several games such as ULTRAKILL, Boomerang X, and I Am Your Beast.

I did two main things to make the controller easy to fine tune. The first one was to use a data-driven, component-based approach. Each component was responsible for exactly one behavior (movement, attack, and so on). Components listened for inputs, then looked at the shared player data to decide what to do. For example, if the player tried to attack, the PlayerCombat component checked the PlayerData.CanAttack helper method, which returned true only if the player was not already attacking or dashing. This approach made the system very clear for the designer, since they always knew exactly where to tweak a behavior.

The second thing I focused on was making every behaviour as modular as possible through exposed variables. This is a common practice, but it was important for this project because it let the designers iterate quickly.

This was also my first experience creating a full game in Unreal Engine. I really enjoyed using the engine, especially because it was a great fit for the project thanks to its built-in AI tools and first person templates. What I liked less was how hard it can be to "break the mold". In my opinion, if you want to do something in a way the engine was not originally designed for, it is noticeably harder than in Unity.