Liana Pigeot: Portfolio and articles

Writing about things

article-hero

Prototyping soulslike gameplay in Unreal Engine 5

Liana Pigeot

Published on January 25, 2024

A lot of my side-project time is spent prototyping gameplay, either for fun or for learning. I ship enough games at work, so sometimes I just want to do the fun part of prototyping. In this case, I was experimenting with soulslike gameplay in Unreal Engine 5. Part of it was to be better at action gameplay, part of it was to learn more of Unreal’s features, as there are always new workflows to try.

How the project went

This game was prototyped in a week, with the goal of making a very configurable system to create an action RPG with soulslike combat mechanics and very customisable enemies, weapons, combo system, AI, etc. I also made a prototype of a boss fight.

Another thing I wanted to replicate was perfect parrying and flurry attacks which you can see in games like Sekiro, where bosses have choreographed combos that you need to perfect parry in rhythm. Similar to in Sekiro, in this prototype there is an orange posture gauge that gets depleted when hit. but if you parry (or perfect parry, which has a different timing), the enemy’s posture gets depleted instead. I implemented the posture system in such a way that the perfect parry window diminishes every time you fail, punishing players for spamming the parry button as they’d make the window tighter during a flurry attack.

Here’s a video of the prototype boss enemy with the flurry attack I created.

In this video, the boss enemy is doing a flurry attack combo, and the player keeps parrying in time. Eventually the boss gets staggered when its posture is fully depleted.

It all works with a mix of anim notifies, gameplay tags, and tweaks to animations. In fact I wrote a document explaining the workflow for creating new weapons, attacks, combos etc. back then as a friend wanted to play with it.

Tech solution

  • I created reusable actor components to handle combat logic in a way that is completely data-driven with nothing hardcoded. Among other things:
    • characters have a gameplay tags component which lets them contain some gameplay tag
    • An actions performer component which manages a state machine for what actions and state the player can be in. The actions performer has functions to activate a skill which will take data in the form of input actions, sound cue, anim montages, gameplay tags, states etc. This means any character can use any weapon or action (and in fact I created my enemies by just giving them variants of combos the player uses)
    • A combat component which handles overall combat logic
    • A component for stats
    • Most of those also had interfaces to abstract interacting with their public functionality without the need for hard reference to classes
  • The ability, combo, actions etc system makes heavy use of data assets. A designer can come in and fully create new ones by adding new gameplay tags, creating anim montages, placing anim notifies on them, and creating the various data assets.
  • Granular data assets are used so each ability is its own data asset. This allows reuse, for example a character’s combos is a data asset which itself uses data assets for attacks. It also reduces checkin contention with source control, as unreal files are binary (I was working on this alone, but I always try to keep in mind how a real big team would work).


© 2025 Liana P, Built with Gatsby