내일배움캠프 46일차 - 언리얼 C++: Pawn을 이용해 비행체를 만들어보자

Pawn클래스를 이용한 비행체 만들기

Pawn클래스에 EnhancedInput을 사용해 입력에 따라 정해진 행동을 취할 수 있는 비행체를 만들어보도록 하자.

향상된 입력(Enhanced Input)

과거 UE4시절에는 프로젝트세팅에 들어가 필요한 입력키를 일일이 할당했으나 UE5에서는 향상된 입력(EnhancedInput)이란 기능이 도입되면서 파일 단위로 입력을 관리할 수 있게 되었다.

해당 기능을 사용하기 위해서는 아래에 두 데이터 에셋을 추가하도록 한다.

입력 매핑 컨텍스트(IMC, InputMappingContext)
 : 컨트롤러가 사용할 입력들을 한데 모아 놓은 에셋
 : 가져온 IA에 키를 할당하고 작동 방식을 정의할 수 있다.

입력 액션(IA, InputAction)
 : 특정 행동을 나타내는 액션, 주로 입력받을 값의 타입을 정의한다. (bool, float, Vector2D 등...)

캐릭터에는 일반적으로 이동(WASD키), 카메라회전(마우스 XY이동)을 사용하므로 두 기능을 넣은 IMC를 만들어보자.

IA(카메라회전, 캐릭터이동), IMC(비행체의 조작그룹)

부정: 입력값을 반전시킨다. ex) +입력을 -입력으로 바꿈.
스위즐 입력 축 값: 입력받는 값의 순서를 바꾼다. ex) X→Y→Z 대신 Y→X→Z로 순서를 바꿈


이렇게 생성한 입력에셋들은 컨트롤러에서 먼저 매핑을 받고, Pawn클래스에서 제공하는 SetupPlayerInputComponent()로 매핑된 입력의 기능을 추가시킨다.

이후 비행기 Pawn에서 입력에 대응되는 함수를 만들어 입력값에 대응되는 행동을 작성하면 된다. 이때, 함수의 매개변수로 FInputActionValue가 사용된다.

#include "InputActionValue.h"를 불러와야한다.

움직임을 구현했다면 다음은 착륙했을 때의 효과를 만들 차례다. 이 비행기 클래스의 경우 Character가 아닌 Pawn으로 구현된 클래스이므로 CharacterMovementComponent가 없어 중력을 자체적으로 구현해주지 않는다. 따라서 Tick함수에서 중력가속도를 구현하고 착지 시의 가속도를 0이 되도록 직접 구현해줘야 한다.

지면에 착지를 했다는 것은 지면과 충돌했다는 것을 의미하므로 비행기를 이루는 콜리전에 이벤트를 삽입해주어야 한다. 이를 위해 BeginPlay에서 해당 컴포넌트에서 구비된 DelegateAddDynamic을 사용하여 함수를 바인딩 해준다.

AddDynamic은 매크로의 일종이므로 InteliSence에 노출되지 않아 직접 입력해야한다.

업로드 중: 총 6462바이트 중 6462바이트가 업로드되었습니다.

바인딩 함수에 필요한 매개변수는 해당 Delegate를 F12로
PrimitiveComponent.h까지 거슬러 올라가서 확인할 수 있다.

이렇게 하면 지면에 충돌할 때 바인딩 된 함수가 실행된다. 다만 단순히 물체와 비행기가 충돌한 것 만으로는 지면에 착지 했다고 단정할 수는 없다. 벽면에 부딪혔을 수도 있기 때문이다.

따라서 비행기에서 수직으로 내려가는 LineTrace를 작성하여 충돌을 한번 더 검사해야 할 것이다.

LineTraceSingleByChannel의 사용법

바인딩 함수에서 LineTraceSingleByChannel과 함께 필요한 변수들을 정의하여 수직으로 LineTrace하여 받은 결과물로 Hit했음을 확인하면 착지 판정을 출력하고 Z축 속도를 0으로 만들면 된다.

위의 기능을 토대로 응용해나가면 다음과 같은 결과물을 만들어낼 수 있다.



댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁