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 연출 추가.

'언리얼엔진5 공부' 카테고리의 다른 글
| [TIL] UE5 콜리젼 & 오버랩 초기화 순서에 따른 이슈 (0) | 2026.02.09 |
|---|---|
| [TIL] UE5 컴포넌트 기반 스킬/아이템 슬롯 시스템 설계 및 구현 (1) | 2026.02.05 |
| [TIL] UE5 C++: 캐릭터 강제 이동 및 회전 시스템 구현 (애니메이션 동기화 및 물리적 궤도 이탈 해결) (1) | 2026.02.04 |
| [TIL] Unreal Engine 5: FDamageEvent 상속을 통한 커스텀 데미지 시스템 구현 (0) | 2026.01.28 |
| TIL: 언리얼 엔진 5 C++ 기반 막기 & 패링 시스템 구현 (0) | 2026.01.21 |