void ASPlayerCameraManager::UpdateCamera(float DeltaTime) { ASCharacter* MyPawn = PCOwner ? Cast<ASCharacter>(PCOwner->GetPawn()) : nullptr; if (MyPawn) { const float TargetFOV = MyPawn->IsTargeting() ? TargetingFOV : NormalFOV; DefaultFOV = FMath::FInterpTo(DefaultFOV, TargetFOV, DeltaTime, 20.0f); SetFOV(DefaultFOV); } /* Apply smooth camera lerp between crouch toggling */ if (MyPawn) { if (MyPawn->bIsCrouched && !bWasCrouched) { CurrentCrouchOffset = MaxCrouchOffsetZ; } else if (!MyPawn->bIsCrouched && bWasCrouched) { CurrentCrouchOffset = -MaxCrouchOffsetZ; } bWasCrouched = MyPawn->bIsCrouched; CurrentCrouchOffset = FMath::Lerp(CurrentCrouchOffset, 0.0f, CrouchLerpVelocity * DeltaTime); FVector CurrentCameraOffset = MyPawn->GetCameraComponent()->GetRelativeTransform().GetLocation(); FVector NewCameraOffset = FVector(CurrentCameraOffset.X, CurrentCameraOffset.Y, DefaultCameraOffsetZ + CurrentCrouchOffset); MyPawn->GetCameraComponent()->SetRelativeLocation(NewCameraOffset); } Super::UpdateCamera(DeltaTime); }