UE5 GAS Mover Pawn — How to fully stop movement (including inertia) during a montage?

Hello,

I am currently using the GAS Sandbox Mover pawn (MoverComponent / UMoverComponent) instead of CharacterMovementComponent.

I am trying to play a specific animation montage (for example: knockdown → lying → get-up).

During this montage, the character must be completely immobilized.

What I have already done:

  1. I block player input in InputProducerㅅ → ProduceInput() by zeroing the movement input values.

  2. This successfully stops keyboard movement input.

  3. However, the character still continues to slide due to existing velocity/inertia from previous movement or knockback.

ㆍI then tried:

  • ApplyVelocityEffect (VelocityToApply = 0, AdditiveVelocity = false)

  • K2_ScheduleInstantMovementEffect

This only stops the character for a single frame, and on the next tick the pawn begins moving again.

It looks like something inside the Mover simulation (movement mode / layered move / external forces) is continuously re-applying velocity.

What I want:

While a montage is playing, I need behavior similar to CharacterMovementComponent → StopMovementImmediately() + DisableMovement, meaning:

• No input movement

• No residual velocity

• No sliding

• Character remains fixed in place until the montage ends

So my questions:

  • What is the correct way to completely freeze a Mover pawn during a montage?

  • Do I need to cancel layered moves/modifiers?

  • Is a custom movement mode required?

  • How should velocity be cleared in a persistent way (not just one tick)?

Any guidance or recommended pattern for GAS + Mover would be greatly appreciated.

Hi, one way to do it is using root motion in your animation montage. but I use a different method where I take the player velocity and apply a force in the opposite direction. but mover is still new so you should also experiment with it

From the Mover examples I got this:

I still don’t know how to call this in c++ so for now i’m using a BlueprintNativeEvent to call it

This is in c++ :

#include "Mover/Public/DefaultMovementSet/LayeredMoves/BasicLayeredMoves.h"
#include "Mover/Public/DefaultMovementSet/InstantMovementEffects/BasicInstantMovementEffects.h"

void AMyActor::AddImpulse(FVector Impulse, bool OverrideVelocity)
{
	FApplyVelocityEffect Movement;
	Movement.VelocityToApply = Impulse;
	Movement.bAdditiveVelocity = !OverrideVelocity;
	Movement.ForceMovementMode=TEXT("Falling");
	GetMoverComponent()->QueueInstantMovementEffect(MakeShared<FApplyVelocityEffect>(Movement));
}
void AMyActor::StopMovement()
{
	FLayeredMove_LinearVelocity Movement;
	Movement.Velocity = FVector(0);
	Movement.MixMode=EMoveMixMode::OverrideVelocity;
	Movement.DurationMs=0;
	Movement.FinishVelocitySettings.SetVelocity=FVector(0);
	Movement.FinishVelocitySettings.FinishVelocityMode=ELayeredMoveFinishVelocityMode::SetVelocity;
	GetMoverComponent()->QueueLayeredMove(MakeShared<FLayeredMove_LinearVelocity>(Movement));
}