Sole Developer
PC
Unreal Engine 5
1
16 Weeks
Developed a Combat Component that can be applied to any character actor.
Created a Frame Rate Independent Trace System to ensure consistent attack logic.
Designed an Input Queue System that allows for easy player actions that feel intuitive.
Utilised Motion Warping and Root Motion Animations to create natural feeling attacks.
Developed a Moveset System that uses Data Tables to select Combo Actions.
Incorporated Unreal Engines Retargetting System to have movesets be applicable on any valid Skeletal Mesh, without needing to create new Animation Blueprints.
Developed AI Behaviour using State Trees to control Enemy Actions.
Created an Enemy Manager System and made use of the Environment Query System.
This project was created as a way for me to explore combat design and implementation in modern game systems. As a life long fan of combat games, I wanted to see what considerations went into making combat systems and how I could take inspirations and research from exceptional games in the genre and craft my own unique combat system. In exploring these elements, my aim was to learn more about combat design, which in turn, has many transferrable design considerations.
This system uses Animation Notify States to tell the Combat Component when to store inputs and when to try and activate them. Any action that is inputted into the queue overrides the previous queued input.
Diagram of Input Queue System.
Animation Notify States in Animation Montage.
The inputs that are stored have a maximum amount of storage time of 0.5 seconds, as anything larger than this felt confusing for players. Furthermore, this solved early issues of inputs being mistakenly triggered multiple times on activation, as they now can't once the buffer is active.
Certain actions can override the input queue by cancelling the current animation entirely. These higher priority actions include the more defensive ones such as Blocking and Dodging. This allows the player to have options, and not feel helpless, if they overcommit to attacks or get locked into long attack animations.
Example of Animation Cancelling.
Connects the attack trace locations together to avoid making gaps in the traces during fast attacks or at lower framerates.
Without Connected Trace.
With Connected Trace.
Each attack in the system has several variables whcih can be altered including range, damage, unblockable, can knock down, and which montages to play. To manage all of this data, the Combat Component gets the data from a Data Table, which can be different for each Combat Character. This makes creating movesets for different characters simple.
Example of Moveset Data Table.
Characters have many defensive actions which give players versatility in combat scenarios.
Example of Dodge.
Example of Blocking.
Example of Parry.
Enemy AI utilises AI State Trees, Environmental Query Checks, and an Enemy Manager Actor to control how they behave in combat situations. Enemy Behaviour is managed by AI State Trees, which provide a structured and readable decion making framework. The enemies transition from their states based on a number of variables including the Enemy Combat Manager and the players actions.
Example of enemy states and positioning in combat.
Example of AI State Tree.
The enemies desired movement locations are decided through the use of the Environmental Query System, where a series of filters are applied to check for optimal movement positions.
Example of Environmental Query System (EQS).