LeeTaes 공부노트

[UE Team Project/T.A.] 3. 플레이어 입력 및 기본 이동 (EnhancedInput) 본문

프로젝트/TimelessAdventure

[UE Team Project/T.A.] 3. 플레이어 입력 및 기본 이동 (EnhancedInput)

리태s 2024. 9. 20. 20:39
728x90
반응형

개요

이번 포스팅에서는 이동기능을 추가한 플레이어를 제작한 방법에 대해 정리해 보겠습니다.

 

시작하기 앞서, 서바이벌 개념의 프로젝트이기에 모든 기능들을 전부 컴포넌트 형식으로 제작해보자는 의견이 나왔고, 입력과 기본 이동 등을 컴포넌트로 빼서 구현해본 경험이 없기에 구조가 약간 난잡할 수도 있습니다.


플레이어 - 향상된 입력 (EnhancedInput) 기본 설정

플레이어 입력 방식은 기존의 입력 방식이 아닌 향상된 입력을 사용하기로 했습니다.

 

우선 향상된 입력을 사용하기 위해서는 bulid.cs 파일에 "EnhancedInput" 모듈을 추가해줘야 합니다.

build.cs

에디터에서 사용할 InputMappingContext와 InputAction을 제작해주도록 합니다.

 

IA_Move는 기본적으로 WS(전/후), AD(좌/우) 방향을 입력받을 것이므로 Axis2D 설정을 해주고 마찮가지로 IA_LooK도 마우스 X축, 마우스 Y축 방향을 입력받을 것이므로 Axis2D 설정을 해주도록 합니다.

 

다음으로는 InputMappingContext에서 두 입력에 대해 매핑해주면 됩니다.

 

IA_Move의 설정은 다음과 같습니다.

기본적으로 2가지 축(X, Y)의 입력을 받기로 설정했으므로, WS(전/후) 방향에 대해서는 모디파이어에 "스위즐 입력 축 값"을 추가해 YXZ로 변환해줘야 합니다.

 

간단히 생각해서 입력은 언제나 X, Y, Z 중 가장 먼저 위치한 X에 들어오게 되는데 이 순서를 Y, X, Z로 변경하여 Y에 입력이 들어오게 설정해주는 것입니다.

 

또한, W는 전방 S는 후방이므로 후방 방향(S)에 "부정"을 추가하여 값을 역(-1) 으로 받게 만들어줘야 합니다.

 

이렇게 설정하면 A와 D는 X에 입력을 받으면 되기에 "스위즐 입력 축 값"을 추가해줄 필요가 없으며, A의 경우 S와 마찮가지로 "부정"을 추가해 오른쪽 값을 역(-1) 으로 받게 만들어주면 됩니다. 

 

IA_Look의 설정은 다음과 같습니다.

 

Move와 다르게 마우스 XY 2D 축으로 입력을 받게 되기에 따로 수정해줄 필요는 없습니다.

플레이어 - InputComponent 제작

사실 입력에 관한 컴포넌트를 따로 빼야할지 말아야할지 고민을 많이 했으나, 추후 플레이어가 아닌 물체에 빙의해서 푸는 퍼즐을 시간이 남으면 구현해보기로 했으며, 이 경우 InputComponent가 따로 존재하는게 편할 것 같다는 생각에 입력에 대한 컴포넌트를 제작하기로 했습니다.

 

앞으로 제작할 모든 컴포넌트는 Transform 정보가 필요 없기에 ActorComponent를 상속받아 구현할 예정이며 현재까지 생각해둔 구조는 다음과 같습니다.

컴포넌트 구조(초안)

 

즉, ComponentBase에서 컴포넌트 초기화와 동시에 Player에 대한 정보를 저장하여 이를 상속받은 모든 클래스에서 플레이어에 자유롭게 접근할 수 있도록 구현하게 되었습니다.

ComponentBase.h
ComponentBase.cpp

 

참고로 ActorComponent에서 InitializeComponent() 함수를 사용하려면 생성자에 bWantsInitializeComponent = true; 코드를 추가해줘야 합니다.

 

이어서 PlayerComponentBase를 상속받은 InputComponent를 생성하고 플레이어로부터 입력을 전달받을 함수를 선언해주도록 합니다.

 

플레이어 캐릭터에 해당 컴포넌트를 추가하고, 입력을 전달받는 SetupPlayerInputComponent() 함수를 수정해줍니다.

 

위와 같이 전달을 하게 되면 입력이 InputComponent로 들어오게 되며, 본격적으로 InputComponent에서 InputMappingContext를 설정해주도록 하겠습니다.

 

에디터에서 만든 IMC_Player와 IA_Move, IA_Look을 저장해줄 변수를 선언하고, 해당 입력에 바인딩될 함수들도 선언해주도록 합니다.

 

다음으로 게임이 시작됨과 동시에 입력을 매핑하기 위해 BeginPlay()에서  InputMappingContext를 설정해주도록 합니다.

 

이전에 제작했던 AddInput에 IA_Move와 IA_Look을 바인딩해주고, 바인딩된 함수에 기본적인 이동과 카메라 회전 로직을 구현해주도록 합니다.

 

이동과 관련된 로직(BasicMove)은 전투 시스템에서 처리하는 것이 좋을 것 같다고 판단하여 CombatComponent로 값을 전달 해주었습니다.

 

참고로 플레이어가 이동하는 방향에 맞춰 회전하도록 설정하려면 다음과 같은 코드를 플레이어 캐릭터의 생성자에 추가해줘야 합니다.

// Controller의 Yaw 회전값을 사용하지 않도록 설정
bUseControllerRotationYaw = false;
// 플레이어의 이동 방향에 맞춰 플레이어가 회전하도록 설정
GetCharacterMovement()->bOrientRotationToMovement = true;
// Controller의 회전 값을 사용하겠다고 설정 (SpringArm 회전)
SpringArmComp->bUsePawnControlRotation = true;

플레이어 - 기본 애니메이션 제작

플레이어의 이동에 사용될 Idle, Walk, Run 애니메이션을 자연스럽게 블랜딩 하기 위해 BlendSpace1D를 생성하고 다음과 같이 설정해주도록 합니다.

 

이후 애님 그래프에서 연결해주고, 플레이어 블루프린트에서 InputCompont의 InputAction들을 추가해주면 됩니다.


플레이어 - 결과

기본이동 구현

728x90
반응형