climbing mode polished
This commit is contained in:
Binary file not shown.
@@ -19,6 +19,20 @@ void UCustomCharacterMovementComponent::PhysCustom(float DeltaTime, int32 Iterat
|
|||||||
switch (CustomMovementMode)
|
switch (CustomMovementMode)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
{
|
||||||
|
PhysClimbing(DeltaTime, Iterations);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// For any other custom mode, fallback to base implementation
|
||||||
|
Super::PhysCustom(DeltaTime, Iterations);
|
||||||
|
GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("Movement mode not implemented!"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UCustomCharacterMovementComponent::PhysClimbing(float DeltaTime, int32 Iterations)
|
||||||
{
|
{
|
||||||
if (DeltaTime < MIN_TICK_TIME)
|
if (DeltaTime < MIN_TICK_TIME)
|
||||||
{
|
{
|
||||||
@@ -65,10 +79,20 @@ void UCustomCharacterMovementComponent::PhysCustom(float DeltaTime, int32 Iterat
|
|||||||
UpdatedComponent->SetWorldLocation(NewLocation);
|
UpdatedComponent->SetWorldLocation(NewLocation);
|
||||||
|
|
||||||
// Update Rotation
|
// Update Rotation
|
||||||
const FRotator TargetRotation = FRotationMatrix::MakeFromXZ(-SurfaceNormal, FVector::UpVector).Rotator();
|
FRotator TargetRotation = FRotationMatrix::MakeFromXZ(-SurfaceNormal, FVector::UpVector).Rotator();
|
||||||
|
if (TargetRotation.Pitch < -70.0f)
|
||||||
|
{
|
||||||
|
TargetRotation = FRotator(0.0f, UpdatedComponent->GetComponentRotation().Yaw, 0.0f);
|
||||||
|
UpdatedComponent->SetWorldRotation(TargetRotation);
|
||||||
|
SetMovementMode(MOVE_Falling);
|
||||||
|
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("Standing up"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
const FRotator NewRotation = FMath::RInterpTo(UpdatedComponent->GetComponentRotation(), TargetRotation, DeltaTime, 2.f);
|
const FRotator NewRotation = FMath::RInterpTo(UpdatedComponent->GetComponentRotation(), TargetRotation, DeltaTime, 2.f);
|
||||||
UpdatedComponent->SetWorldRotation(NewRotation);
|
UpdatedComponent->SetWorldRotation(NewRotation);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Reset Rotation and set MovementMode to Falling
|
// Reset Rotation and set MovementMode to Falling
|
||||||
@@ -81,16 +105,6 @@ void UCustomCharacterMovementComponent::PhysCustom(float DeltaTime, int32 Iterat
|
|||||||
{
|
{
|
||||||
Velocity = (UpdatedComponent->GetComponentLocation() - OldLocation) / DeltaTime;
|
Velocity = (UpdatedComponent->GetComponentLocation() - OldLocation) / DeltaTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For any other custom mode, fallback to base implementation
|
|
||||||
Super::PhysCustom(DeltaTime, Iterations);
|
|
||||||
GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("Movement mode not implemented!"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UCustomCharacterMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode)
|
void UCustomCharacterMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
// Override PhysCustom to handle custom movement mode behaviors
|
// Override PhysCustom to handle custom movement mode behaviors
|
||||||
virtual void PhysCustom(float DeltaTime, int32 Iterations) override;
|
virtual void PhysCustom(float DeltaTime, int32 Iterations) override;
|
||||||
|
void PhysClimbing(float DeltaTime, int32 Iterations);
|
||||||
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
|
virtual void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
|
||||||
static bool SweepForwardForWall(const ACharacter* Character, FHitResult& OutHit, float SweepDistance = 100.f);
|
static bool SweepForwardForWall(const ACharacter* Character, FHitResult& OutHit, float SweepDistance = 100.f);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user