GameMode, Pawn, PlayerController
Enhanced Input System
코드
게임에서의 입력 처리 시퀀스
GameMode, Pawn, PlayerController)게임의 전반적인 규칙과 흐름을 총괄 관리하는, 일종의 컨트롤 타워 역할을 하는 클래스
게임이 시작했는지, 끝났는지, 점수 계산, 난이도 등을 규칙을 정의하고 관리
또한, 플레이어에게 어떤 Pawn(Character)을 스폰해줄지, 어떤 PlayerController를 사용할지에 대해서도 관리
게임 캐릭터, 플레이어 가능한 객체
Pawn은 플레이어 혹은 AI가 “소유( Possess )”하여 조종할 수 있는 가장 기본적인 형태
Character는 UCharacterMovementComponent를 가져, 사람 캐릭터에 적합한 Playable 객체
하지만 Pawn과 Character 혼자서는 어떠한 입력값에도 반응하지 못 함. 인형처럼
내부에 이동, 회전, 점프 등 다양한 로직들이 함수로 구현만 되어 있지 사용자의 Inupt(키보드, 마우스)에 반응하지 못 함
이를 PlayerController가 해줌
GameMode가 생성하여 Pawn 또는 Character에 빙의시켜 소유하도록 함
사용자마다 하나씩 존재하여 각 플레이어 캐릭터를 소유, 제어
게임 중에 받은 입력값을 먼저 인식하고, 플레이어 캐릭터가 동작할 수 있도록 해줌
- 따라서, 싱글게임의 경우
GameMode,PlayerController,Pawn(character)은 1개씩 존재- 멀티의 경우
GameMode는 서버에만 1개 존재,PlayerController,Pawn(character)은 플레이어의 수만큼 존재.

언리얼 엔진에서 기존에 사용하던 Input System은 정말 단순하게 특정키와 특정 함수를 바인딩하여 사용하였음
하지만 현재 게임은 같은 키를 입력하여도 게임 상황에 따라 동작 방식이 달라짐
위 상황처럼 이제는 Enhanced Input System을 사용하여 입력값을 더 유연하게 관리할 수 있음
Input Action과 Input Mapping Context를 이용
캐릭터의 이동, 점프, 발사, 줌 등과 같이 특정 동작을 추상화한 단위
이동을 담당하는 IA_Move, 점프를 담당하는 IA_Jump, 카메라 회전을 담당하는 IA_Look
입력 키와 상관 없이 그냥 "이동", "점프" 등 동작을 중심으로 어떤 형태의 입력을 받을지 정의 (bool, Axis1D, Axis2D, Axis3D)



DefaultPawnClass를 통해 어떤 객체를 플레이어 캐릭터로 사용할지 설정PlayerControllerClass를 통해 어떤 객체를 플레이어 컨트롤러로 사용할지 설정
IMC와 IA들을 리플렉션시스템에 등록하여, 에디터에서 생성한 IMC와 IA들을 컨트롤러에 연결할 수 있게 설정
LocalPlayer : 현재 PlayerController가 관리하는 Local Player를 반환
GetSubsystem<UEnhancedInputLocalPlayerSubsystem>() : 해당 Local Player에 부착된 Enhanced Input Subsystem을 반환
AddMappingContext()
0 : 우선순위. 낮을수록 높은 우선순위컨트롤러에서 IMC를 동적으로 장착했다가 제거했다가 하며, 유연한 Input 처리를 가능하게 해줌
키마로 게임하다가 패드로 게임한다든지, 게임하다가 UI로 들어가 설정을 조작한다든지 이런 상황을 GameMode가 인지하여 컨트롤러에게 알려주고 컨트롤러가 그에 맞게 IMC를 설정

FInputActionValue : Enhanced Input에서 입력값(축 이동값, 마우스 이동량 등)을 전달할 때 사용하는 구조체로, IA에서 설정한 Value Type으로 받아 사용
UFUNCTION() : 입력 바인딩 함수는 리플렉션 시스템과 연동되어야 함
bool형식의 IA는 키가 눌렸을 때와 키가 떼졌을 때의 동작을 따로 만들어줘야하므로 Start~, Stop~ 처럼 함수 2개 만들어줌
(shift누르고 있을 때는 속도 빠르게 설정, 때면은 속도 다시 정상으로 만들어주기)

SetupPlayerInputComponent : 캐릭터와 컨트롤러가 연동(빙의)되었을 때 호출되어, IA와 동작할 함수를 binding해줌
BindAction :
&객체::함수이름 형식의 문법 사용)
bool형의 "달리기"는 누르고 있는 상태는 Triggered, 키를 뗐을 때는 Completed를 이용

value : IA_MOVE에서 2D값으로 받는다고 설정했으므로, value값에서 FVector2D값을 추출하여 사용
이렇게 어떤 키가 눌렸는지 상관 없이, 입력값만을 이용해 동작할 함수를 구현하면 된다
사용자가 게임 도중 키를 입력
어떤 입력을 하였는지(w입력) 입력 자체를 언리얼 엔진에서 컨트롤러에게 전달
하지만 컨트롤러는 이 입력을 해석하지 못해, 무엇을 해야하는지 모름. 정말 어떤 입력이 들어왔는지만 앎
그래서 컨트롤러는 Enhanced Input System에게 이 입력이 무슨 뜻인지 물어봄
그럼 Enhanced Input System은 등록되어 있는 IMC를 기반으로 이 입력을 IA로 변환해서 발동을 시킴(Triggered)
이전에 컨트롤러와 캐릭터가 연동되었을 때, IA와 호출할 함수가 Bind되었으므로, IA가 발동되거나 종료된거에 따라 Bind된 함수가 호출되면서 입력이 처리가 된다