Description

Context

When crouching and uncrouching with Mover’s DefaultMovementSet, the pawn capsule’s half height is changed. This behavior mimics the CharacterMovementComponent. To ensure the pawn’s feet stay at floor level, Mover queues an instant teleport effect in FStanceModifier::AdjustCapsule.

Problem

When the pawn class has multiple primitive components with collision queries enabled, any of the components intersecting with the world at the new desired location will prevent the teleport. For example, when turning on collision queries on GASP’s SandboxCharacter_Mover’s Skeletal Mesh, the mesh can cause teleports to fail. This causes uncrouch and crouch to behave incorrectly, since the height adjustment fails to apply.

Noteworthy: UWorld::EncroachingBlockingGeometry has a special code path for UMovementComponents to only consider the root primitive, but UMoverComponents take the fallback path where all primitive components are tested.

Workaround

Disable all collision queries for child components, if it’s not needed. Alternatively: introduce a new Object Channel, like “Pawn Visual”, in project settings that’s ignored by default and change all of your pawn’s primitives to use that. They won’t prevent teleportations. Update game logic to trace/overlap/block the new Object Channel.

Suggested Fix

To be decided.

  • Mover’s teleport adjustment on crouch/uncrouch could use a different implementation of teleporting.
  • UWorld::EncroachingBlockingGeometry could be updated to somehow treat MoverComponents as exception and also ignore primitive components, but this may be against Mover’s designs to allow arbitary collision shapes.
  • Need to discuss more ideas internally.
Steps to Reproduce
  • Use the GameAnimationSample project
  • Open SandboxCharacter_Mover
    • Set the SkeletalMesh’s Collision Preset to Pawn (instead of no collision)
    • Any preset with an object type that level geo overlaps, and with collision querying enabled, will work.
  • Start PIE
    • Make sure you’re playing with the SandboxCharacter_Mover. Open the Game Animation Widget by standing on the tile, and choose the correct Pawn Override if needed.
    • Note: You may need to move the PlayerStart upward and restart PIE, because the collision setting changes may also prevent spawning.
  • Repeatedly crouch and uncrouch.
  • In console, turn on show collision
  • Observe on uncrouch: The character’s capsule will temporarily penetrate the ground. This might not affect the skel mesh location which is placed via floor checks, but it does affect capsule collision.
  • Observe on crouch: The character’s capsule will retain it’s center, but float in the air because the size just decreased. The character will fall down briefly.
  • Expected: The character’s feet stay on the floor on crouch and uncrouch. The capsule stays on the floor without penetration or floating.
Callstack

Non-fatal callstack, this is just for reference of where the blocking hit occurs that prevents the capsule location adjustment:

>	[Inline Frame] UnrealEditor-Engine.dll!ComponentEncroachesBlockingGeometry_WithAdjustment::__l14::<lambda_3>::operator()() Line 1355	C++
 	UnrealEditor-Engine.dll!ComponentEncroachesBlockingGeometry_WithAdjustment(const UWorld * World, const AActor * TestActor, const UPrimitiveComponent * PrimComp, const UE::Math::TTransform<double> & TestWorldTransform, UE::Math::TVector<double> & OutProposedAdjustment, const TArray<AActor *,TSizedDefaultAllocator<32>> & IgnoreActors) Line 1355	C++
 	[Inline Frame] UnrealEditor-Engine.dll!ComponentEncroachesBlockingGeometry(const UWorld *) Line 1440	C++
 	UnrealEditor-Engine.dll!UWorld::EncroachingBlockingGeometry(const AActor * TestActor, UE::Math::TVector<double> TestLocation, UE::Math::TRotator<double> TestRotation, UE::Math::TVector<double> * ProposedAdjustment) Line 1546	C++
 	UnrealEditor-Engine.dll!UWorld::FindTeleportSpot(const AActor * TestActor, UE::Math::TVector<double> & TestLocation, UE::Math::TRotator<double> TestRotation) Line 1135	C++
 	UnrealEditor-Engine.dll!AActor::TeleportTo(const UE::Math::TVector<double> & DestLocation, const UE::Math::TRotator<double> & DestRotation, bool bIsATest, bool bNoCheck) Line 803	C++
 	UnrealEditor-Mover.dll!FTeleportEffect::ApplyMovementEffect(FApplyMovementEffectParams & ApplyEffectParams, FMoverSyncState & OutputState) Line 47	C++
 	UnrealEditor-Mover.dll!UMovementModeStateMachine::ApplyInstantEffects(FApplyMovementEffectParams & ApplyEffectParams, FMoverSyncState & OutputState) Line 936	C++
 	UnrealEditor-Mover.dll!UMovementModeStateMachine::OnSimulationTick(USceneComponent * UpdatedComponent, UPrimitiveComponent * UpdatedPrimitive, UMoverBlackboard * SimBlackboard, const FMoverTickStartData & StartState, const FMoverTimeStep & TimeStep, FMoverTickEndData & OutputState) Line 247	C++
 	UnrealEditor-Mover.dll!UMoverComponent::SimulationTick(const FMoverTimeStep & InTimeStep, const FMoverTickStartData & SimInput, FMoverTickEndData & SimOutput) Line 621	C++
 	UnrealEditor-Mover.dll!UMoverNetworkPredictionLiaisonComponent::SimulationTick(const FNetSimTimeStep & TimeStep, const TNetworkPredictionState<TNetworkPredictionStateTypes<FMoverInputCmdContext,FMoverSyncState,FMoverAuxStateContext>> & SimInput, const TNetSimOutput<TNetworkPredictionStateTypes<FMoverInputCmdContext,FMoverSyncState,FMoverAuxStateContext>> & SimOutput) Line 159	C++
 	UnrealEditor-Mover.dll!TTickUtil<FMoverActorModelDef>::DoTick<UMoverNetworkPredictionLiaisonComponent>(TInstanceData<FMoverActorModelDef> & Instance, TInstanceFrameState<FMoverActorModelDef>::FFrame & InputFrameData, TInstanceFrameState<FMoverActorModelDef>::FFrame & OutputFrameData, const FNetSimTimeStep & Step, const int CueTimeMS, ESimulationTickContext TickContext) Line 42	C++
 	UnrealEditor-Mover.dll!TLocalTickServiceBase<FMoverActorModelDef>::Tick_Internal<0>(const FNetSimTimeStep & Step, const FServiceTimeStep & ServiceStep) Line 123	C++
 	UnrealEditor-NetworkPrediction.dll!UNetworkPredictionWorldManager::BeginNewSimulationFrame_Internal(float DeltaTimeSeconds) Line 400	C++
 	UnrealEditor-NetworkPrediction.dll!UNetworkPredictionWorldManager::BeginNewSimulationFrame(UWorld * InWorld, ELevelTick InLevelTick, float DeltaTimeSeconds) Line 287	C++

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-363516 in the post.

0
Login to Vote

Unresolved
CreatedFeb 3, 2026
UpdatedFeb 3, 2026
View Jira Issue