본문 바로가기
공부/언리얼 엔진

개발일지: 언리얼 블루프린트로 구현한 RTS 카메라 제어 시스템

by Excidus 2023. 3. 26.

이번 프로젝트에서 RTS 스타일의 카메라 제어 시스템을 언리얼 엔진의 블루프린트를 활용해 구현했다. 카메라의 움직임과 사용자 입력에 따른 동작을 자연스럽고 직관적으로 만드는 데 초점을 맞췄으며, 각 기능은 테스트와 피드백을 통해 최적화하려고 노력했다. 아래는 구현한 기능과 개발 과정에서의 주요 기록이다.


1. 기본 구조 설정

  • RtsCamera: 카메라를 SpringArm 컴포넌트에 연결해 부드러운 카메라 이동과 회전을 구현했다. SpringArm의 설정을 조정하며 카메라의 거리와 각도를 최적화했다.
  • RtsCameraController: Pawn 클래스로 구성해 플레이어의 입력을 처리하도록 설계했다. 초기에는 컨트롤러와 카메라 간의 연결에서 약간의 지연이 발생했으나, Tick 이벤트의 최적화로 문제를 해결했다.

2. 카메라 디버깅 기능

  • PrintCameraLocation: 디버깅을 위해 T 키를 눌렀을 때 카메라의 현재 위치를 출력하도록 했다. 초기에는 로그가 화면에 출력되지 않는 문제가 있었으나, Print String 노드의 설정을 수정해 정상 동작을 확인했다.

3. 카메라 줌 기능

  • CameraZoom: 마우스 휠 입력에 따라 SpringArm의 길이를 조정해 카메라를 줌인/줌아웃하도록 구현했다. 휠 감도의 밸런스를 맞추는 데 시간이 걸렸지만, 최종적으로 부드러운 줌 경험을 제공할 수 있었다.
  • AutoCameraZoomIn/Out: 특정 좌표로 카메라를 이동시킨 뒤 자동으로 줌인/줌아웃하는 기능이다. 좌표 이동과 줌 동작을 동시에 처리하기 위해 Timeline 노드를 활용했다. 초기에는 이동 중 카메라가 부자연스럽게 흔들리는 문제가 있었으나, Lerp를 적용해 부드럽게 전환되도록 수정했다.
  • GameOverZoomIn: 게임 오버 시 특정 위치(예: 적 유닛의 좌표)로 카메라를 이동시키고 줌인하는 기능이다. 이벤트 기반으로 작동하도록 설정했으며, 카메라 이동 속도를 조정해 드라마틱한 연출을 강조했다.

4. 카메라 이동 및 회전

  • CameraMoveWithKeyboard: WASD 키보드 입력으로 카메라를 이동하도록 했다. 맵 밖으로 벗어나지 않도록 Limitation 변수를 추가해 경계를 설정했다. 경계 체크 로직에서 카메라가 경계에 도달했을 때 부드럽게 멈추도록 Clamp 노드를 활용했다.
  • MoveCameraWithMouse: 마우스 커서를 화면 모서리에 위치시키면 해당 방향으로 카메라가 이동하도록 구현했다. 초기에는 마우스 감지 범위가 너무 좁아 불편했으나, 감지 영역을 확장하고 이동 속도를 조정해 자연스러운 조작감을 얻었다.
  • RotateCamera: 마우스 오른쪽 버튼을 누른 상태에서 드래그하면 카메라가 회전하고, 버튼을 놓으면 원래 각도로 복귀하도록 했다. 회전이 지나치게 빠르다는 피드백을 받아 감도를 낮추고, Slerp를 적용해 부드러운 회전을 구현했다.

5. 카메라 초기화

  • CameraReset: R 키 또는 마우스 가운데 버튼으로 카메라를 초기 위치와 각도로 복원하는 기능이다. 초기에는 리셋 시 카메라가 순간적으로 이동해 어지러움을 유발했으나, 이동 애니메이션을 추가해 부드럽게 전환되도록 했다.

6. 개발 중 주요 이슈와 해결

  • 카메라 이동의 부자연스러움: 여러 기능에서 카메라 이동이 부드럽지 않거나 끊기는 문제가 있었다. Timeline과 Lerp 노드를 적극 활용하고, Tick 이벤트의 프레임별 업데이트를 최적화해 대부분 해결했다.
  • 입력 충돌: 키보드와 마우스 입력이 동시에 처리될 때 간헐적으로 충돌이 발생했다. 입력 우선순위를 설정하고, 이벤트 기반 처리를 강화해 문제를 최소화했다.
  • 성능 최적화: 블루프린트 노드가 많아지면서 성능 저하가 우려되었다. 불필요한 노드를 정리하고, 자주 호출되는 로직은 함수로 모듈화해 가독성과 효율성을 높였다.