In this video, I showcase an ability that branches from the Dash mechanic when triggered under the correct conditions. Similar to many action-focused games, dodge and dash mechanics play a major role in combat feel, and I wanted to enhance that responsiveness with additional visual polish through an afterimage effect.
Challenges
One challenge was getting the afterimage effect to trigger reliably from its assigned Gameplay Tag and only during the player's invincibility frames (I-Frames). The Gameplay Tag initially failed to register correctly, which was resolved by rebuilding the project after deleting the Intermediate folder. To ensure the effect triggered at the correct moment, I moved the logic from Post Attribute Change to Post Gameplay Effect Applied, allowing the afterimage to activate only when the player was hit during the I-Frame window.
This clip showcases a unique ability inspired by the anime JoJo's Bizarre Adventure, where the player is able to stop time for the entire world except themselves. The mechanic opened up a variety of gameplay possibilities, allowing players to reposition strategically, control encounters, experiment during combat, or create cinematic moments during high-pressure situations.
Challenges
The biggest challenge was ensuring the post-process effects returned smoothly to their original state after the Time Stop ability ended. This was resolved by caching the default post-process settings at Begin Play and using a Timeline in reverse to blend seamlessly back to those values once the ability concluded.
Status effects are not always essential in action games, but I believe they can add meaningful depth to combat and player decision-making. In this video, I showcase several status effects, including freeze and burn, implemented using Unreal Engine’s Gameplay Ability System (GAS) and works in Multiplayer as well.
Challenges
Status Effects proved to be difficult to set up as there are so many variables and tags that can be made. The challenge that I came across was that the UI side of things was not triggering correctly. The logic was all there but the UI was not representing correctly. I fixed the UI issue by using Gameplay Events from the Widget Blueprint to the owning actor.