Ground movement now works properly for all gravity directions

This commit is contained in:
Kevin Poretti 2023-01-07 18:09:12 -05:00
parent cf85b7f916
commit 8d8b7fa88c
3 changed files with 45 additions and 5 deletions

Binary file not shown.

View File

@ -45,7 +45,7 @@ void UGSCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iteration
}
FVector FallAcceleration = GetFallingLateralAcceleration(deltaTime);
FallAcceleration.Z = 0.f;
IsCharacterUpAlignedToWorldUp() ? FallAcceleration.Z = 0.f : FallAcceleration.Y = 0.f;
const bool bHasLimitedAirControl = ShouldLimitAirControl(deltaTime, FallAcceleration);
float remainingTime = deltaTime;
@ -359,6 +359,21 @@ void UGSCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iteration
}
}
FVector UGSCharacterMovementComponent::GetFallingLateralAcceleration(float DeltaTime)
{
// No acceleration in Z or Y depending on character up direction
FVector FallAcceleration = IsCharacterUpAlignedToWorldUp() ? FVector(Acceleration.X, Acceleration.Y, 0.f) : FVector(Acceleration.X, 0.0f, Acceleration.Z);
// bound acceleration, falling object has minimal ability to impact acceleration
if (!HasAnimRootMotion() && FallAcceleration.SizeSquared() > 0.f)
{
FallAcceleration = GetAirControl(DeltaTime, AirControl, FallAcceleration);
FallAcceleration = FallAcceleration.GetClampedToMaxSize(GetMaxAcceleration());
}
return FallAcceleration;
}
void UGSCharacterMovementComponent::ComputeFloorDist(const FVector& CapsuleLocation, float LineDistance,
float SweepDistance, FFindFloorResult& OutFloorResult, float SweepRadius,
@ -650,6 +665,27 @@ void UGSCharacterMovementComponent::SetCharacterUpDirection(FVector NewUpDirecti
CharacterUpDirection = NewUpDirection;
}
FVector UGSCharacterMovementComponent::ConstrainInputAcceleration(const FVector& InputAcceleration) const
{
// walking or falling pawns ignore up/down sliding
if(IsCharacterUpAlignedToWorldUp())
{
if (InputAcceleration.Z != 0.f && (IsMovingOnGround() || IsFalling()))
{
return FVector(InputAcceleration.X, InputAcceleration.Y, 0.f);
}
}
else
{
if (InputAcceleration.Y != 0.f && (IsMovingOnGround() || IsFalling()))
{
return FVector(0.0f, InputAcceleration.Y, InputAcceleration.Z);
}
}
return InputAcceleration;
}
void UGSCharacterMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode)
{
if (!HasValidData())

View File

@ -24,6 +24,8 @@ public:
// UCharacterMovementComponent interface
virtual FVector ConstrainInputAcceleration(const FVector& InputAcceleration) const override;
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
// walking
@ -42,6 +44,8 @@ public:
// falling
virtual void PhysFalling(float deltaTime, int32 Iterations) override;
virtual FVector GetFallingLateralAcceleration(float DeltaTime) override;
virtual void ComputeFloorDist(const FVector& CapsuleLocation, float LineDistance, float SweepDistance, FFindFloorResult& OutFloorResult, float SweepRadius, const FHitResult* DownwardSweepResult) const override;
virtual bool IsValidLandingSpot(const FVector& CapsuleLocation, const FHitResult& Hit) const override;