언리얼 5.6버전이 나오면서 여러 기본 템플릿들이 추가 되었다.
1인칭:
- Arena Shooter
- Survival Horror
3인칭:
- Combat
- Platforming
- Side Scroller
튜토리얼처럼 생각하고, 하나씩 한들어보며 리뷰해보면 좋을 것 같다.
Side Scroller는 기본적으로 좌우로만 움직이는 플랫포머로 전에 만들었던 것과 비슷하다.
하지만 그보다 더 복잡하고, 다양한 기능들이 추가되어있다.
더블 점프, 벽 점프, 카메라매니저, AI, UI 등 게임적인 요소들이 많아 공부해보기 좋다.

먼저 이동을 구현해보면, 전에 만든것과 같이 입력 액션과 입력매핑컨텍스트를 만들어주어야 한다.
좌우로만 움직이기 때문에 새로운 입력 액션을 만들어주고, 좌우를 위해 값타입을 Axis2D로 한다.

입력 매핑 컨텍스트에서 매핑에 입력액션을 추가한다. IA_Mover에서 좌우 키인 A와 D를 추가하고, 입력 액션 Jump는 3인칭 템플릿의 것을 그대로 사용한다.

블루프린트에는 네 가지 클래스를 추가할 것이다.
각각 플레이어 카메라 매니저, 캐릭터, 게임모드 베이스, 플레이어 컨트롤러 클래스를 상속받아 생성한다.
Player Camera Manager:
플레이어의 시야(카메라)를 처리하는 클래스로 위치, 회전 흔들림 등을 처리
Character
플레이어나 NPC가 사용하는 기본적인 캐릭터 클래스
Game Mode Base
게임의 규칙과 초기화 전체를 관장하는 관리자 클래스
Player Controller
플레이어나 AI를 캐릭터에 연결해주는 브릿지

게임모드 베이스에서 새로운 캐릭터와 플레이어 컨트롤러 블루프린트를 설정해준다.
플레이어 컨트롤러에서 카매라 매니저를 설정해준뒤
이벤트 그래프에 입력 매핑 컨텍스트를 연결해준다.

캐릭터 클래스로 넘어가서, 입력액션을 Move 함수에 연결한다.

Move함수는 직접 만들어야 하는데, 입력 액션의 Y 값으로 부터 0보다 크면 X가 1인 방향으로, 0보다 작으면 반대로 월드의 방향 벡터를 설정해준다.

여기서 작은 Y값을 설정해주는 트릭으로 캐릭터가 회전시 무조건 카메라의 방향(정면)을 보도록 할 수 있게 한다.
하지만 이것만 설정하면 방향이 좌우에서 벗어나서 플랫폼에서 떨어지거나 할 수 있다.
그래서 다음과 같이 평면에 제한을 켜주어야 한다.

그냥 점프할 때는 입력 액션을 연결해주기만 하면 되지만

더블 점프를 위해 캐릭터 클래스의 디테일 패널에서 점프 최대 수를 2로 설정한다.

이렇게 해도 더블점프가 되지만 점프일 때와 더블 점프일 때를 구분해서 그래프를 만들기 위해 Is Falling이 false면 1단점프 true면 2단 점프로 branch를 만들어 준다. 그리고 Has Doubled Jumped 변수는 애니메이션 블루프린트에서 사용하기 위해 더블 점프에 대한 상태를 저장한다.
주의할점은 입력액션의 여러 실행핀 중 Trigger를 연결하면
더블 점프가 시행되지 않아 꼭 Started에 연결해야한다.

Has Dobuled Jumped 변수는 On Landed 이벤트로 초기화해준다.

움직임과 더블 점프까지 기본적인 동작은 완성했다.

추가로,
점프 키를 눌렀을 때 위로 붕 뜨는 효과를 주려면,
점프 최대 누르기 시간(Jump Max Hold Time)을 0보다 크게 설정해야 한다.

다음 벽 점프를 만들어보면,
시퀀스로 벽 점프와 더블 점프를 각각 0,1 에 연결하고, 벽 점프 조건을 확인한다.
벽 점프 변수가 false일 때, 그리고 Is Falling이 true일 때, 벽에 붙어 움직이지 않을 때도 밀어내면 안되기 떄문에 마지막으로 캐릭터가 이동중인지를 확인한다.

다음으로 Line Trace By Channel노드를 사용한다.
LineTraceByChannel은 두 지점 사이를 잇는 "보이지 않는 선"을 쏘아서, 그 선이 충돌한 액터나 컴포넌트를 검사하는 함수이다.
이때 어떤 종류의 물체와 충돌할지를 결정하는 기준이 채널이다.
start(액터의 위치)부터 end(액터의forwardvector+50)까지 레이를 쏘아서 로 벽과의 충돌을 판정한다.

충돌을 판정한 결과를 가져와 Launch Character로 캐릭터를 날려주면 된다.
충돌 방향의 Normal Vector로부터 캐릭터의 방향을 반대로 해준 후, 그 방향과 점프속도만큼 override해서 벽 점프 효과를 만들어준다.

마지막은 벽 점프에 대한 변수를 설정하고, Retriggable Delay를 준다.
Retriggable Delay란, Delay가 진행 중일 때 다시 호출되면 기존 딜레이를 취소하고 처음부터 다시 딜레이를 시작하는 블루프린트 노드이다.


다음 충돌 상태를 전환하는 물체를 추가해보자.
이 오브젝트는 아래에서 부딪히면 통과되고, 위로 올라가면 다시 충돌하게 되는 상태를 반복한다.
먼저 블루프린트 인터페이스를 추가한다.

블루프린트 인터페이스는 서로 다른 블루프린트 클래스끼리 함수 호출 약속만 정해 놓고,
실제 구현은 각각의 블루프린트에서 하도록 만든 "함수 명세서" 또는 "통신 규칙"이다.
Set Soft Collision이란 이름의 함수를 추가한 후 입력에 Enable 변수 bool값을 추가한다.
이제 새로운 블루프린트 클래스를 만들고 스태틱 메시와 박스 콜리전을 추가해준다.

이 액터에서 박스 콜리전에 오버랩 되었을 때 Set Soft Collision을 메시지로 호출한다.

이 이벤트는 박스 콜리전의 이벤트 카테고리에서 추가할 수 있다.

이렇게 호출한 인터페이스는 캐릭터 클래스의 이벤트에서 관리한다.
Set Collision Response to Channel은 특정 충돌 채널에 대해 액터나 컴포넌트가 어떻게 반응할지를 설정하는 기능이다.
오버랩 이벤트가 발생했을 시 enable에 따라 block과 ignore을 전환하는 구조를 가지게 된다.

그리고 overlap event가 끝나게 되었을 시 다시 enable을 꺼주어서 인터페이스 메시지를 호출하면 된다.

마지막으로 아이템을 먹고 UI에 표시해보자.

마찬가지로 블루프린트 인터페이스로 가서 UpdateUI라는 이름의 함수를 만들고 Amount라는 인티저 변수를 추가한다.
그리고 블루프린트 클래스를 사용자 위젯으로 생성한다.블루프린트 사용자 위젯을 생성한다.
블루프린트 사용자 위젯(Blueprint User Widget)은 UI(User Interface)를 만들기 위한 기본 단위 클래스이다. 게임 화면에 표시되는 체력바, 미니맵, 버튼, 대화창, 인벤토리 등의 모든 UI 요소는 사용자 위젯(User Widget)을 통해 제작된다.
언리얼 엔진에서 UI를 제작할 때 사용하는 Widget Blueprint(사용자 위젯)은 크게 두 개의 탭으로 구성되어 있습니다:
디자이너(Designer) 탭
그래프(Graph) 탭
이 두 탭은 각각 UI의 외형 구성과 동작 구현을 담당한다.

디자이너 탭에서는 액터의 컴포넌트와 같이 요소들을 추가해주면 된다.

Safe Zone : 화면 테두리 영역을 보호하여 UI가 잘리지 않도록 해주는 영역 위젯
Overlay : 여러 위젯을 같은 공간에 겹쳐서 배치할 수 있는 컨테이너
Border : 하나의 위젯을 감싸 테두리나 배경, 여백 등을 설정할 수 있는 위젯
Horizontal Box : 자식 위젯들을 가로 방향으로 나열할 수 있는 레이아웃 박스
Text (Text Block) : 화면에 텍스트를 출력하는 기본 UI 구성 요소
이제 이벤트 그래프로 가서 Update UI가 호출되면 메시지를 받아 이벤트를 수행한다. Score Text의 변수 여부를 켜준 뒤에 입력 받은 Amount 인티저 값을 연결한다.

이 이벤트는 BP_PickUp이라는 구 모양의 클래스에서 호출한다.
이를 위해 블루프린트 클래스를 만들고 스태틱 메시와 스피어 콜리전을 추가한다.
오버렙 이벤트가 시작되면 collision conponent를 제거하고, interaction 메시지를 호출한다.

그리고 구 메시의 collision도 없애준뒤 타임라인으로 먹었을 때 공이 커졌다가 작아지는 효과를 준다.
시간에 따라 그래프의 출력만큼 스태틱 메시의 scale을 변화시키고 타임라인이 끝나면 액터를 제거한다.

카메라 매니저나 AI와 같은 기능은 게임의 몰입감과 플레이 흐름을 크게 좌우하는 요소지만, 현재 이해가 부족해 본 글에서는 제외하였다.