Character not finding moving floor after double jump

Engine Version: 4.27.2

TL;DR: Character needs to check the floor more often while falling/jumping.

The first jump on the platform works fine, but when the character double jumps and a moving platform (Actor w/ Static Mesh Comp using InterpToMovement) catches up underneath him during the jump, it takes a second or two to land. Land() is confirmed being called late during the mid-jump collision.

The character appears to be “gliding” stuck in falling state on the surface limited by Air Control and unable to jump again for this time. This is a precision platformer so its very important that the landing happens and the player is able to jump immediately.

Debugging has shown the distance from the player collision capsule to the floor is 0 when this happens.

Does the character not check for the ground while a jump is providing force? Is there anywhere to enable this?

Jump Velocity Z = 850
Platform Velocity Z = 2000

JumpMaxCount = 2
JumpMaxHoldTime = 0.25

I have spent a while playing with these values with no result:

  1. bEnableScopedMovementUpdates = false
  2. MaxSimulationTimeStep = 0.0166 (lowest it can go on the slider)
  3. MaxSimulationIterations = 25
  4. “Force Substepping” on the platform movement components

I wont lie I don’t fully understand the 2 simulation options, but they sound like the only ones that can really affect the frequency that the character checks for a floor. The CharacterMovementComponent class is a bit of a beast so I’m hoping theres some tech in there I’ve missed that would more elegantly solve this?

I’ve come up with a bit of a bootleg solution for now, but surely there is some way to make the character check for a floor more frequently while falling/jumping? Any tips would really be extremely appreciated!!

I’ll share my nasty little function called on Character Tick() for anyone in the future if there ends up being no solution posted.

/**
* Used as a fix to not landing fast enough on vertically-moving platforms. Called on Tick() at the cost of performance
* 	would otherwise be stuck falling or "hovering" on the surface of the platform for a moment after a double jump
*	this should only fire as a last resort and should not be the default method of landing
*
**/
void AProjectCharacter::CheckShouldLand()
{
	// ensure we are falling and not jumping
	if (GetCharacterMovement()->IsFalling() == true && IsJumpProvidingForce() == false)
	{
		// check for floor DIRECTLY under our feet
		FFindFloorResult NewFloor;
		GetCharacterMovement()->FindFloor(GetCapsuleComponent()->GetComponentLocation(), NewFloor, false);
		if (NewFloor.IsWalkableFloor() == true && NewFloor.FloorDist < 1.f)
		{
			// DEBUG DELETE ME
			UE_LOG(LogTemp, Warning, TEXT("BUG FIX TRIGGERED. Swapping to walking insta"));

			// update movement mode to walking
			GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_Walking);

			// Assuming landing as usual
			Landed(NewFloor.HitResult);
		}
	}
}

This bug fix fires 1% of the time for stationary platforms, but 99% of the time when landing on moving platforms with positive Z velocity.