Air control now works with all gravity directions and fix rotations when changing grav
This commit is contained in:
parent
8d8b7fa88c
commit
bd20b78a3b
BIN
GravityStomp/Content/Characters/BP_GSCharacter.uasset
(Stored with Git LFS)
BIN
GravityStomp/Content/Characters/BP_GSCharacter.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
GravityStomp/Content/Characters/Mannequins/Animations/ABP_Manny.uasset
(Stored with Git LFS)
BIN
GravityStomp/Content/Characters/Mannequins/Animations/ABP_Manny.uasset
(Stored with Git LFS)
Binary file not shown.
@ -73,9 +73,9 @@ void UGSCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iteration
|
||||
{
|
||||
// Acceleration = FallAcceleration for CalcVelocity(), but we restore it after using it.
|
||||
TGuardValue<FVector> RestoreAcceleration(Acceleration, FallAcceleration);
|
||||
Velocity.Z = 0.f;
|
||||
IsCharacterUpAlignedToWorldUp() ? Velocity.Z = 0.f : Velocity.Y = 0.f;
|
||||
CalcVelocity(timeTick, FallingLateralFriction, false, MaxDecel);
|
||||
Velocity.Z = OldVelocity.Z;
|
||||
IsCharacterUpAlignedToWorldUp() ? Velocity.Z = OldVelocity.Z : Velocity.Y = OldVelocity.Y;
|
||||
}
|
||||
}
|
||||
|
||||
@ -662,7 +662,11 @@ bool UGSCharacterMovementComponent::IsCharacterUpAlignedToWorldUp() const
|
||||
void UGSCharacterMovementComponent::SetCharacterUpDirection(FVector NewUpDirection)
|
||||
{
|
||||
NewUpDirection.Normalize();
|
||||
if(!(CharacterUpDirection.Dot(NewUpDirection) > UE_KINDA_SMALL_NUMBER))
|
||||
{
|
||||
CharacterUpDirection = NewUpDirection;
|
||||
SetMovementMode(MOVE_Falling);
|
||||
}
|
||||
}
|
||||
|
||||
FVector UGSCharacterMovementComponent::ConstrainInputAcceleration(const FVector& InputAcceleration) const
|
||||
@ -792,6 +796,99 @@ void UGSCharacterMovementComponent::OnMovementModeChanged(EMovementMode Previous
|
||||
ensureMsgf(GetGroundMovementMode() == MOVE_Walking || GetGroundMovementMode() == MOVE_NavWalking, TEXT("Invalid GroundMovementMode %d. MovementMode: %d, PreviousMovementMode: %d"), GetGroundMovementMode(), MovementMode.GetValue(), PreviousMovementMode);
|
||||
}
|
||||
|
||||
void UGSCharacterMovementComponent::PhysicsRotation(float DeltaTime)
|
||||
{
|
||||
if (!(bOrientRotationToMovement || bUseControllerDesiredRotation))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!HasValidData() || (!CharacterOwner->Controller && !bRunPhysicsWithNoController))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FRotator CurrentRotation = UpdatedComponent->GetComponentRotation(); // Normalized
|
||||
CurrentRotation.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): CurrentRotation"));
|
||||
|
||||
FRotator DeltaRot = GetDeltaRotation(DeltaTime);
|
||||
DeltaRot.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): GetDeltaRotation"));
|
||||
|
||||
FRotator DesiredRotation = CurrentRotation;
|
||||
if (bOrientRotationToMovement)
|
||||
{
|
||||
DesiredRotation = ComputeOrientToMovementRotation(CurrentRotation, DeltaTime, DeltaRot);
|
||||
}
|
||||
else if (CharacterOwner->Controller && bUseControllerDesiredRotation)
|
||||
{
|
||||
DesiredRotation = CharacterOwner->Controller->GetDesiredRotation();
|
||||
}
|
||||
else if (!CharacterOwner->Controller && bRunPhysicsWithNoController && bUseControllerDesiredRotation)
|
||||
{
|
||||
if (AController* ControllerOwner = Cast<AController>(CharacterOwner->GetOwner()))
|
||||
{
|
||||
DesiredRotation = ControllerOwner->GetDesiredRotation();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldRemainVertical())
|
||||
{
|
||||
FString DebugDesiredRotation = FString::Printf(TEXT("Desired Rotation: %s"), *DesiredRotation.ToString());
|
||||
GEngine->AddOnScreenDebugMessage(-1, 0.0f, FColor::Cyan, DebugDesiredRotation);
|
||||
|
||||
DesiredRotation.Pitch = IsCharacterUpAlignedToWorldUp() ? 0.f : FRotator::NormalizeAxis(DesiredRotation.Pitch);
|
||||
DesiredRotation.Yaw = IsCharacterUpAlignedToWorldUp() ? FRotator::NormalizeAxis(DesiredRotation.Yaw) : 0.f;
|
||||
|
||||
float Rot = 0.0f;
|
||||
if(CharacterUpDirection.Dot(FVector::DownVector) > UE_KINDA_SMALL_NUMBER)
|
||||
{
|
||||
Rot = 180.0f;
|
||||
}
|
||||
else if (CharacterUpDirection.Dot(FVector::RightVector) > UE_KINDA_SMALL_NUMBER)
|
||||
{
|
||||
Rot = 90.0f;
|
||||
}
|
||||
else if (CharacterUpDirection.Dot(FVector::LeftVector) > UE_KINDA_SMALL_NUMBER)
|
||||
{
|
||||
Rot = 270.0f;
|
||||
}
|
||||
DesiredRotation.Roll = Rot;
|
||||
|
||||
DebugDesiredRotation = FString::Printf(TEXT("Desired Rotation after keeping it vertical: %s"), *DesiredRotation.ToString());
|
||||
GEngine->AddOnScreenDebugMessage(-1, 0.0f, FColor::Cyan, DebugDesiredRotation);
|
||||
}
|
||||
else
|
||||
{
|
||||
DesiredRotation.Normalize();
|
||||
}
|
||||
|
||||
// Accumulate a desired new rotation.
|
||||
const float AngleTolerance = 1e-3f;
|
||||
|
||||
if (!CurrentRotation.Equals(DesiredRotation, AngleTolerance))
|
||||
{
|
||||
// PITCH
|
||||
if (!FMath::IsNearlyEqual(CurrentRotation.Pitch, DesiredRotation.Pitch, AngleTolerance))
|
||||
{
|
||||
DesiredRotation.Pitch = FMath::FixedTurn(CurrentRotation.Pitch, DesiredRotation.Pitch, DeltaRot.Pitch);
|
||||
}
|
||||
|
||||
// YAW
|
||||
if (!FMath::IsNearlyEqual(CurrentRotation.Yaw, DesiredRotation.Yaw, AngleTolerance))
|
||||
{
|
||||
DesiredRotation.Yaw = FMath::FixedTurn(CurrentRotation.Yaw, DesiredRotation.Yaw, DeltaRot.Yaw);
|
||||
}
|
||||
|
||||
// Set the new rotation.
|
||||
DesiredRotation.DiagnosticCheckNaN(TEXT("CharacterMovementComponent::PhysicsRotation(): DesiredRotation"));
|
||||
MoveUpdatedComponent( FVector::ZeroVector, DesiredRotation, /*bSweep*/ false );
|
||||
}
|
||||
}
|
||||
|
||||
void UGSCharacterMovementComponent::PhysWalking(float deltaTime, int32 Iterations)
|
||||
{
|
||||
if (deltaTime < MIN_TICK_TIME)
|
||||
|
@ -28,6 +28,8 @@ public:
|
||||
|
||||
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
|
||||
|
||||
virtual void PhysicsRotation(float DeltaTime) override;
|
||||
|
||||
// walking
|
||||
virtual void PhysWalking(float deltaTime, int32 Iterations) override;
|
||||
|
||||
@ -58,5 +60,6 @@ public:
|
||||
private:
|
||||
FVector CharacterUpDirection = FVector::UpVector;
|
||||
|
||||
UFUNCTION(BlueprintPure)
|
||||
FORCEINLINE bool IsCharacterUpAlignedToWorldUp() const;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user