언리얼엔진5 공부

[TIL] Unreal Engine 5: 동적 록온 시스템 및 적응형 카메라 연출

Client Side 2026. 2. 4. 18:58

1. 개요 (Overview)

  • 목표: 록온 시 대상이 공중에 뜨거나 거리가 변함에 따라 플레이어와 대상이 모두 한 화면에 담기도록 카메라를 동적으로 조절하는 시스템 구축.
  • 핵심 문제: 단순 고정 록온 시 타겟이 화면 밖으로 이탈하거나, 캐릭터가 화면 하단에 잘리는 시각적 답답함 발생.

2. 기술적 해결 과정 (Step-by-Step)

2.1 타겟 조준점(Lock-On Point)의 정교화

  • 문제점: GetActorLocation()(Pivot)에 단순히 값을 더해버리면, 보스의 머리 위 허공을 보게 되어 시점이 위로 쏠림.
  • 해결책: 대상의 발바닥(Foot) 위치를 계산한 뒤, CapsuleHalfHeight를 기준으로 정교한 비율 보정 적용.
  •  
    // 발바닥을 기준으로 타겟의 30% 높이 지점을 조준
    float FootZ = TargetLoc.Z - HalfHeight;
    TargetLoc.Z = FootZ + (HalfHeight * 2.0f * TargetHeightPercent);
    
  • C++
     

2.2 비선형적(Exponential) 카메라 거리 확장

  • 문제점: 선형 보간(Lerp)만 사용하면 보스가 올라가는 속도를 카메라가 시각적으로 따라가지 못해 답답함 유발.
  • 해결책: HeightDifference에 따른 Alpha 값을 제곱(Alpha * Alpha) 처리하여, 보스가 특정 높이를 넘어서는 순간 카메라가 기하급수적으로 멀어지게 설계.
  • 사용 함수: FMath::GetMappedRangeValueClamped를 통해 안전한 값의 범위를 보장.

2.3 하이앵글(High-Angle) 및 FOV 연출

  • SocketOffset 조절: 거리만 멀어지면 캐릭터가 작아지기만 함. SocketOffset.Z를 높여 카메라를 위로 들어 올림으로써 내려다보는 시점(High-Angle)을 확보, 전장의 가독성 증대.
  • 광각(Wide FOV) 전환: FOV를 90도에서 115도 이상으로 확장하여 왜곡을 이용한 웅장함과 시야 확보 동시 달성.

3. 코드 설계 가이드라인 (Best Practices)

3.1 효율적인 틱(Tick) 관리

  • 매 프레임 무거운 연산을 피하기 위해 TargetArmLength, FOV, SocketOffset 모두 FMath::FInterpTo를 사용하여 프레임 독립적인 부드러운 이동 구현.
  • bIsLockOn이 false일 때 컴포넌트 틱을 중지(SetComponentTickEnabled(false))하여 자원 절약.

3.2 방어적 프로그래밍 (Safety Logic)

  • IsValid(CurrentTarget) 및 SpringArm 포인터 유효성을 매 틱마다 검사하여 크래시 방지.
  • LookAtRot.Pitch 값을 Clamp하여 카메라가 지면을 뚫거나 비정상적으로 꺾이는 현상 방지.

4. 핵심 데이터 테이블 (Parameters)

항목 평상시 값 보스 공중 부양 시 (Max) 비고
TargetArmLength 400.f 2500.f 거리 후퇴를 통한 시야 확보
FOV 90.f 115.f ~ 120.f 광각 렌즈 효과로 정보량 증대
SocketOffset.Z 50.f 400.f 내려다보는 각도 형성
Pitch Clamp -40° ~ 20° -80° ~ 15° 수직 시야 제한 완화

5. 회고 및 개선 방향 (Retrospective)

  • 배운 점: 벡터 연산 시 대입(=)과 누적(+=)의 차이가 결과값에 미치는 영향, 그리고 Pivot 위치에 대한 정확한 이해의 중요성을 깨달음.
  • 향후 과제: 보스와 캐릭터 사이에 장애물이 있을 경우 카메라가 줌인되는 Camera Collision 처리 및 Camera Shake 연출 추가.