Jasontreks Blog

DM 보내기

메세지는 텔레그램 챗봇에 의해 익명으로 전달됩니다. 답장을 받으려면 이메일을 입력하세요.
Send

대포 조준 인터페이스에 대한 고찰

공격 턴인 플레이어가 대포를 조준했을 때 화면을 어떻게 구성할지 구현해야 했다. 이전 포스트에서 조준경 UI에 조준 시야를 추가로 렌더링하는 방식으로 구현한 모습을 확인할 수 있지만, 그 방식으로 정하기 이전에는 조준 시야 없이 메인 카메라를 대폭 줌아웃하는 방식을 시도했었다.

줌아웃 방식의 한계

이 방식은 월드와 탄환의 운동, 상대 플레이어까지 별도의 UI 없이 한 화면에 담겨 보다 직관적인 유저 경험을 제공한다는 점에서 장점이 있다. 하지만 우리 게임의 특성을 고려했을 때 다음과 같은 불편함이 있었다.

  • 전략적 환경 요소를 필드 곳곳에 배치하려면 월드 자체를 넓게 써야 하는데, 그 넓은 월드에서 상대 플레이어가 보일 때까지 줌아웃을 하게 되면 캐릭터, 대포, 환경 요소 같은 중요한 오브젝트들이 너무 작아지게 된다.
  • 잦은 확대/축소에 의한 시각적 변화가 피로감을 줄 수 있다.

카메라 액션 구현의 복잡함

Godot은 자체적으로 카메라 액션과 관련된 기능이 없다. 있다면 기본 Camera 노드의 Position Smoothing 옵션이 있는데, 이 옵션은 켜면 카메라의 위치가 이동할 때 부드러운 지연이 발생하도록 하여 시각적 경험을 높여 준다. 좌표값이 한 번에 변해 카메라가 순간이동하더라도 시야는 부드럽게 이동 처리가 되도록 하기 때문에 카메라 위치만 신경 쓴다면 참 괜찮은 옵션일 것이다.

문제는 줌이다. 카메라의 이동과 줌이 같이 발생한다면, 카메라의 위치가 시작점에서 목표지점까지 도달한 정도(0 ~ 1)와 줌이 변하는 정도를 동기화시킴으로써, 이동과 줌이 따로 놀지 않도록 처리해야 한다. 그 두 액션을 동기화시키지 않으면 차라리 아무런 부드러움 효과 없이 순간이동이 낫다고 생각될 정도로 굉장히 이상하게 보여진다.

Godot은 Position Smoothing과 관련해 이동-줌 동기화 옵션을 제공하지 않는다. 그렇다면 Position Smoothing 옵션을 켰을 때 카메라의 위치 변화, 즉 부드러운 이동 처리가 이루어지는 도중의 카메라 위치를 알아낼 수 있다면 직접 보간 계수를 도출하면 된다.

근데 카메라의 위치 값을 가져와보니 부드러운 이동 처리가 되고 있는 카메라의 위치가 나오는 것이 아니라 이미 목적지에 도착했을 때의 카메라 위치가 나왔다. 즉 카메라가 이동했을 때 카메라 객체 자체는 이미 목적지로 설정한 곳에 가 있는 상태고, 부드러움 효과는 엔진 내부 로직에서 뷰포트를 따로 조작해 이루어지는 것이었다.

여러 방법을 시도해본 결과 사실상 부드러움 처리가 이루어지고 있는 실제 카메라 좌표를 알아낼 방법은 없었다. 그렇다면 남은 방법은 카메라의 부드러운 이동을 직접 구현하는 것이었다.

Curve 객체를 이용해 이동 시 가속/감속 곡선을 미리 정의하고 카메라 이동 시 샘플링하여 위치 값을 입력하는 방식으로도 해보고, 카메라 객체 자체에 등가속도 운동을 구현해 부드럽게 이동하도록 하는 방식으로도 해보았는데, 그 수고에 비해 딱히 만족할 만한 시각적 경험은 구현해 내지 못했다. 차라리 카메라 이동/줌이 없다면 더 깔끔할 것 같았다.

결국 카메라 이동 및 줌을 이용한 조준 인터페이스 구현 방안은 철회하였다. 대신 화면의 한쪽을 조준경 UI가 차지하도록 하고 조준 카메라의 시야를 추가 렌더링하는 방식으로 결정하였다.

다음 포스트

그래픽 디자인 - 플레이어 캐릭터