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.
|
// Acceleration = FallAcceleration for CalcVelocity(), but we restore it after using it.
|
||||||
TGuardValue<FVector> RestoreAcceleration(Acceleration, FallAcceleration);
|
TGuardValue<FVector> RestoreAcceleration(Acceleration, FallAcceleration);
|
||||||
Velocity.Z = 0.f;
|
IsCharacterUpAlignedToWorldUp() ? Velocity.Z = 0.f : Velocity.Y = 0.f;
|
||||||
CalcVelocity(timeTick, FallingLateralFriction, false, MaxDecel);
|
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)
|
void UGSCharacterMovementComponent::SetCharacterUpDirection(FVector NewUpDirection)
|
||||||
{
|
{
|
||||||
NewUpDirection.Normalize();
|
NewUpDirection.Normalize();
|
||||||
CharacterUpDirection = NewUpDirection;
|
if(!(CharacterUpDirection.Dot(NewUpDirection) > UE_KINDA_SMALL_NUMBER))
|
||||||
|
{
|
||||||
|
CharacterUpDirection = NewUpDirection;
|
||||||
|
SetMovementMode(MOVE_Falling);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FVector UGSCharacterMovementComponent::ConstrainInputAcceleration(const FVector& InputAcceleration) const
|
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);
|
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)
|
void UGSCharacterMovementComponent::PhysWalking(float deltaTime, int32 Iterations)
|
||||||
{
|
{
|
||||||
if (deltaTime < MIN_TICK_TIME)
|
if (deltaTime < MIN_TICK_TIME)
|
||||||
|
@ -28,6 +28,8 @@ public:
|
|||||||
|
|
||||||
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
|
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
|
||||||
|
|
||||||
|
virtual void PhysicsRotation(float DeltaTime) override;
|
||||||
|
|
||||||
// walking
|
// walking
|
||||||
virtual void PhysWalking(float deltaTime, int32 Iterations) override;
|
virtual void PhysWalking(float deltaTime, int32 Iterations) override;
|
||||||
|
|
||||||
@ -58,5 +60,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
FVector CharacterUpDirection = FVector::UpVector;
|
FVector CharacterUpDirection = FVector::UpVector;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure)
|
||||||
FORCEINLINE bool IsCharacterUpAlignedToWorldUp() const;
|
FORCEINLINE bool IsCharacterUpAlignedToWorldUp() const;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user