TIL(Today I Learned)
언리얼 프로젝트에서 빈 새 레벨을 만들면 가장 먼저 무엇을 할까 생각해보니 캐릭터를 넣고 캐릭터의 이동과 카메라를 구현하는 것이 생각이 났다.
어떻게 만들까 고민이 들었는데, 물론 강의 내용을 따라서 만들어도 좋겠지만 직접 찾아가며 만들어 보는 것이 좋을 것 같았다.

위 이미지는 언리얼 프로젝트 생성시 3인칭으로 만들면 기본적으로 주어지는 템플릿이다. 이를 보고 활용해보겠다.
먼저 새 레벨을 빈 오픈월드로 만들어 주었다.

큐브로 같은 크기의 맵을 간단하게 구성해주었다.

처음에는 블루프린트 클래스로,

캐릭터를 만들어준다.

만들어진 블루프린트 클래스에서 메시를 선택하고 디테일 패널에서 SKM_Manny_Simple 남캐로 만들어주었으며 애니메이션도 추가해주었다.
캐릭터와, 애니메이션 등은 삼인칭 템플릿의 기본 에셋들이다.


스프링 암과 카메라도 추가해준다.

스프링 암은 장애물 충돌 처리를 자동으로 해주어 카메라를 부드럽게 해준다.

만들어진 블루프린트 클래스를 뷰포트에 배치하고 플레이를 해보면 내가 배치한 캐릭터가 아닌 조작가능한 새로운 여성 캐릭터가 나와서 움직인다.

이것은 게임모드의 설정 때문인 것으로 보이고 추후 공부해보기로 하고 넘어간다.
이제 새로 만든 캐릭터를 움직이기 위해서 간단하게 폰의 자동 빙의를 사용한다. 캐릭터 블루프린트의 디테일 패널에서 플레이어 자동 빙의를 Disabled에서 Player0으로 설정한다.

그러면 다음과 같은 화면이 나오게 된다. 이제부터 이 캐릭터를 움직이게 만드는 것이 목표이다.

템플릿에서 이미 만들어진 블루프린트를 보면 다음과 같다.


직접 만들어보기로 하고, 먼저 입력 액션으로 Movement, Jump, Camera 세 개의 control을 관리한다.


각 입력액션별로 값 타입을 변경해주어야 하는데 점프는 하는 것과 안하는 것의 Bool값이 필요하고, Camera와 Movement는 Axis2D(Vector2D)를 선택한다.
카메라는 로테이터로 회전을 주는 것인데 위 아래(Pitch) 와 좌우(Yaw) 회전을 위해 Axis2D를 설정하고, 움직임은 높이(Z축)으로는 움직이지 않고 상하좌우로만 움직이기에 마찬가지로 Axis2D로 설정한다.

다음으로 입력 매핑 컨텍스트를 만들어준다.

일단은 점프부터 만들어보도록 하고 매핑할 입력을 추가해준다.

이렇게 만든 입력 매핑 컨텍스트를 캐릭터 블루프린트 클래스에서 사용한다.

다 이해하지는 못하였지만 설명해보자면 먼저 컨트롤러의 변경을 이벤트로 받아 Cast to Player Controller로 기기를 컨트롤하는지를 확인하고, 나온 출력으로부터 Mapping Context를 추가하여 이전에 만든 입력 매핑 컨텍스트(IMC)를 적용하여 준다.
이 블루프린트가 입력을 입력매핑컨텍스트로 값을 넘겨주는 역할을 하는 것으로 보인다.
그리고 점프 키를 눌렀을 때 어떻게 변해야 할지를 설정한다.

Enhanced Input Action에서 아까 만든 인풋 액션을 선택하고 이것이 트리거되었을 때 간단하게 점프함수와 스탑 점프 함수를 불러주면 된다.
플레이 해보면 정상적으로 작동함을 확인할 수 있다.

다음으로 카메라를 움직여보자

위와같이 입력매핑 컨텍스트에 카메라 인풋액션을 넣고 입력은 마우스 XY 2D축으로 만들어준다. 이제 모디파이어를 사용해주어야 하는데 모디파이어는 입력값을 전처리하는 역할을 한다.
모디파이어에 배열 엘리먼트를 하나 추가하고 부정을 선택한 뒤 Y 값만 반전을 시켜준다.

이는 언리얼 좌표계가 z up left hand system을 따르며 z->x->y 순으로 회전축의 순서를 가지기 때문이다. Pitch 회전을 할 때 생각을 해보면(Y축 회전, ZX평면에 대해서) 마우스의 Y값은 위로 올릴 때 값이 증가하고, ZX 평면은 z->x 방향 즉, 아래로 내릴 때 증가한다. 따라서 반대로 움직이게 되므로 이를 위해 Y축만 반대로 적용해야 한다.

카메라도 점프와 비슷하게 해주면 되는데 Action Value를 구조체 핀 분할해준 후 각각 Yaw와 Pitch 함수에 넣어주면 된다.
하지만, 이렇게만 하면 좌우로만 회전이 되는데 이는 스프링암 컴포넌트에서 폰 제어 회전 사용을 켜주어야 한다.

마지막으로 움직임을 적용해보자.
입력 매핑 컨텍스트에서 움직임으로 WASD를 추가하고, 각 입력에 대해 모디파이어를 넣어준다.

W와 S에는 스위즐 입력 축값으로 YXZ 순으로 설정을 해주고,
S와 A에는 부정을 넣어 값을 반대로 해주어야 한다. 아직 정확한 이유를 설명하지 못하겠다.


블루프린트에서는 인풋액션으로부터 movement input함수를 호출하면 되는데 캐릭터가 보고 있는 방향을 넣어주어야 한다. 그래서 좌우 이동은 Right Vector 앞뒤 이동은 Forward Vector를 넣어준다. 각각 Right Vector는 Roll과 Yaw, Forward Vector는 Yaw를 사용해서 구한다.
이대로 구현하면 굉장히 어색한 부자연스러운 움직임이 나온다. 좌우로 움직이면 캐릭터도 방향을 틀어 움직이고 싶은데 캐릭터는 항상 정면을 보고 있다.

이를 해결하기 위해 두 가지 설정을 추가해주어야 한다. Character(셀프) 컴포넌트를 선택한 뒤에 무브먼트 방향으로 회전 조정을 켜주고, 컨트롤러 회전 요 사용을 꺼주어야 한다.


이렇게 하면 최종적으로 어느정도 자연스러운 움직임을 완성할 수 있다.

캐릭터 움직임을 구현하는 것에 대한 감이 잡히는 기분이 든다. 아직 기본 템플릿의 배경, 라이트, 오브젝트 등이 구현되지 않았고, 캐릭터의 애니메이션은 그대로 사용했기 때문에 부족함이 느껴지긴 한다. 게임 모드나 애니메이션 블렌더 등을 공부해보는 것도 좋을 것 같다.