구현목표
언리얼엔진이 고버전화 되면서 플레이어 캐릭터의 편한 조작을위해 EnhancedInput 시스템을 제공한다. 기본적으로 구버전에서 사용하던것과는 달리, 플레이어의 액션 플레이어의 엑션제어 로 나누어 모듈화가 되었어서 유지보수에 탁월한 구조를 가지고 있다.
지난번 프로젝트에서는 CharacterClass 를 이용하여 EnhancedInput 을 구현했었는데 CharacterClass 의 경우 기본적으로 이족보행을 위한 초기구성이 되어있어서 간단한 편이었다. 이번에는 PawnClass를 이용하여 처음부터 이족보행이아닌 특수성을 지닌 움직임을 구현해보려한다.
구현과정
새로운 C++ Pawn 클래스를 생성한다음 필요한 변수들을 선언해준다.

UBoxComponent : 충돌처리를 할 컴포넌트로 루트컴포넌트 담당
SkeletalMeshComponent : Pawn 객체의 모델을 나타낼 메쉬 컴포넌트
SpringArmComponent : 내가 조종할 객체의 카메라 위치 조정을 위해 필요한 컴포넌트
CameraComponent : SpringArmComponent 끝부분에 장착되어 캐릭터를 따라다니며 보여줄 컴포넌트
선언한 변수들을 생성자 내부에서 생성해서 컴포넌트로 부착해준다

SetSimulatePhysics : 충돌처리를 하지 않기 위해 false
SpringArmComp->bUsePawnControlRotation : SpringArm은 Pawn의 회전을 따라감으로 true
CameraComp->bUsePawnControlRotation : Camera는 SpringArm의 회전을 따라감으로 false
이후 EnhancedInputSystem을 이용하기위해 Control을 담당할 PlayerController생성
PlayerController C++ 에서 EnhancedInputMapping 들을 등록해야하기 때문에 필요한 변수 생성 후 생성자에서 안전성을위해 초기값 nullptr 대입


엑션을 제어할 IMC할당하기

ULocalPlayer* : 현재 로컬상으로 등록된 캐릭터를 가져오고 유효성검사
UEnhancedInputLocalPlayerSystem* : 등록된 LocalPlayer의 Subsystem 을 이용하기위해 가져온 후 유효성 검사
AddMappingContext : 현재 등록된 IMC의 유효성을 검사하고 가장 높은 우선순위에 등록
위 로직을 통해 게임시작시 구현한 PlayerController의 IMC가 Pawn에 할당
PawnClass에서 PlayerController을 이용하기위해 BindAction 하기
BindAction 을 할경우 등록해놓은 IA_Action 들의 입력 값을 받아온후 해당 동작이 실행되면 동작에 맞는 함수를 실행하기 위해 실제 동작을 실행할 함수 선언

const FInputActionValue& : 언리얼에서 제공하는 구조체 데이터로 InputAction 의 값을 받아올 수 있음 받아온 값은 변하지않아야하기때문에 const 선언 및 구조체는 데이터가 커서 &연산자 사용

Move 함수구현 : Controller 유효성 검사, InputAction 을통해 받아온 값을 FVector 변수에 저장 이후 값이 제대로 불러져오고 있는지 확인을 위해 0에가깝지않을경우 실제 이동실행 (0에 가까워질수록 이동을 멈춤FMath::IsNearlyZero)
Look 함수구현 : 받아온 FVector 값 변수에 저장 AddControllerYaw, Pitch 컨트롤러에서 제공하는 함수를 통해 회전을 구현
SetupPlayerInputComponent함수에서 BindAction 구현하기

Cast<UEnhancedInputComponent>, <ASpartaPlayerController> : 함수의 인자 타입이 UInputComponent 우리가 사용하려는 기능 EnhancedInputComponent 컴파일러에게 사용하려는 클래스를 정확하게 명시해주기 위해서 Cast 사용 마찬가지로 Controller 같은경우 AI 인지 Player인지 구분하기위해 Cast 사용하여 타입 검사
BindAction: 만들어놓은 Controllerd에서 등록해놓은 Action을 가져온후 해당 Action에서 동작이 확인될경우 동작을 실행할 객체의 함수 콜백, 마우스나 키보드의 입력같은경우 상황에 따라 다르기때문에 시스템이 알아서 함수를 호출하는 콜백 사용
트러블 슈팅 문제해결 과정
문제발생 :해당 로직들을 구현하고 나서 실제로 언리얼로 돌아가 동작이 제대로 되는지 확인했으나, 블루프린트로 IA IMC 입력검사를 했을때는 무사히 되었었는데 키바인딩을한 후 동작하지 않는것을 확인했다.

원인분석 : Move함수내부에서 Pawn의 이동을 처리할때 사용하고있는 함수가 AddMovementInput 함수를 사용하고 있다 해당 함수는 MovementComponent에서 지원해주는 함수이기때문에 움직임에 관련된 컴포넌트가 존재하지 않는 내 PawnClass 객체는 움직일 수 없었던 것이다.
해결과정 : 해당 문제를 해결하기위해 Pawn의 움직임을 도와주는 Component 인 FloatingPawnMovement 컴포넌트를 선언하고 부착해주었다.


이후 움직임 속도도 설정해주기위해 float 속도변수를 추가했다.


생성자에서 초기화 한 후 MovementComponent 에 이동속도를 담당하는곳에 값을 전달했다.
이후 프로젝트를 실행시켜보니 이족보행 인간형 캐릭터가아닌 특수성을 지닌 비행체의 움직임을 구현할 수 있었다.
해결완료

자기평가 : 구현하면서 배웠던 내용을 크게 벗어나지 못하고 복습의 느낌이 강하게 든것이 아쉬웠다. 아직 스스로 향상된입력시스템 에 대하여 크게 이해하지 못하고있다는 생각이 들었다. 추가적인 구현을 할때 해당단점을 보완할 수 있도록 입력시스템에 관하여 더욱 공부할 생각이다.