SetAinming상태 전환중 불안정한 카메라 전환 해결
- 아래와 같이 단순 CameraBoom의 좌표변경으로는 전환이 매끄럽지않은 문제가 발생하여 구글링과 GPT를 비교해본 결과
void ACOECharacter::SetAiming(bool bNewAiming)
{
if (bIsAiming)
{
// 조준 카메라로 전환
// 속도 감소 등
UE_LOG(LogTemp, Log, TEXT("IsAiming"));
CameraBoom->SocketOffset = FVector(300.f, 80.f, 50.f);
}
else
{
// 기본 상태 복귀
UE_LOG(LogTemp, Log, TEXT("IsNotAiming"));
CameraBoom->SocketOffset = FVector(200.f, 80.f, 50.f);
}
}
- 아래와 같은 공통된 방법이 있어 코드를 수정하였으나 조준상태에서 벗어나지 못하는 문제가 발생
void ACOECharacter::SetAiming(bool bNewAiming)
{
bIsAiming = bNewAiming;
GetWorldTimerManager().ClearTimer(AimingInterpTimerHandle); // 이전 타이머 정리
StartSocketOffset = CameraBoom->SocketOffset;
TargetSocketOffset = bIsAiming
? FVector(300.f, 80.f, 50.f)
: FVector(200.f, 80.f, 50.f);
InterpAlpha = 0.f;
bInterpToAiming = bIsAiming;
GetWorldTimerManager().SetTimer
(
AimingInterpTimerHandle,
this,
&ACOECharacter::UpdateAimingInterp,
0.01f, // 10ms 간격
true // 반복 실행
);
}
void ACOECharacter::UpdateAimingInterp()
{
InterpAlpha += 0.05f; // 0~1로 점점 증가 (속도 조절 가능)
FVector NewOffset = FMath::Lerp(StartSocketOffset, TargetSocketOffset, InterpAlpha);
CameraBoom->SocketOffset = NewOffset;
if (InterpAlpha >= 1.0f)
{
CameraBoom->SocketOffset = TargetSocketOffset;
GetWorldTimerManager().ClearTimer(AimingInterpTimerHandle);
}
}
- 아래의 사진에 표시한 한계치들을 짧게 하여 우클릭을 누르자마자 길게누르기 판정을 줘 해결함