Advanced Movement System (AMS) Plugin Demo on Lyra UE5
Discover how to integrate and use the Advanced Movement System (AMS) plugin within the Lyra project on Unreal Engine 5. This demonstration highlights compatibility with the Gameplay Ability System (GAS) and integration within a complex architecture.
Demo Overview
A downloadable demo is available on the Discord server in the public channels, while the full project and source code are accessible only in the private channels reserved for verified members.
In this tutorial, I’ll walk you through the key parts of the integration to help you navigate the project more easily, without having to dig through all the source code yourself.

Architecture Overview
The goal here is simple: the CharacterMovementComponent
is solely responsible for the physical execution of movement (e.g., speed changes, sliding mechanics), while the Gameplay Ability System (GAS) manages all gameplay-related logic such as activation, deactivation, cancellation, blocking, and conditional checks.
This separation brings several advantages:
🔄 Centralized sprint logic inside Abilities: easier to manage, test, and extend.
🔒 Ability to block or force sprinting using gameplay tags (e.g., fatigue, buffs, control effects).
🎮 Natural integration with Lyra’s input system and gameplay events.
How is project Setup
Lyra is a complex project whose entire foundation is written in C++. To integrate our plugin seamlessly with Lyra, we won’t have much choice: we’ll need to get our hands into the code.
If you take a look at the LyraCharacter.h
file, you'll notice that the ALyraCharacter
class inherits from another class that will be of interest for our setup: the AModularCharacter
class.
This class allows other components to be dynamically injected into the actor at runtime, which is very useful for creating different gameplay experiences in a clean and modular way.
/** * ALyraCharacter * * The base character pawn class used by this project. * Responsible for sending events to pawn components. * New behavior should be added via pawn components when possible. */ UCLASS(MinimalAPI, Config = Game, Meta = (ShortTooltip = "The base character pawn class used by this project.")) class ALyraCharacter : public AModularCharacter, public IAbilitySystemInterface, public IGameplayCueInterface, public IGameplayTagAssetInterface, public ILyraTeamAgentInterface
To have Lyra use our classes, you simply need to modify the declarations of the AModularCharacter
and ULyraCharacterMovementComponent
classes so that they inherit from our custom classes. It’s as simple as that!
/** Minimal class that supports extension by game feature plugins */ UCLASS(MinimalAPI, Blueprintable) class AModularCharacter : public AAMS_Character
/** * ULyraCharacterMovementComponent * * The base character movement component class used by this project. */ UCLASS(MinimalAPI, Config = Game) class ULyraCharacterMovementComponent : public UAMS_CharacterMovementComponent