[UE4] 입력
개요
언리얼의 입력 체계에 대해 알아보도록 하겠습니다.
맵핑과 바인딩의 차이에 대해 기록할 예정입니다.
PlayerInput / InputComponent
각 아래의 작업을 처리합니다.
PlayerInput
플레이어 컨트롤러(PlayerController)의 키 맵핑을 관리합니다.
아래의 특성을 가집니다.
- 클라이언트에서만 스폰됩니다.
- ActionMapping / AxisMapping 을 지원합니다.
InputComponent
액터의 키 바인딩을 관리합니다.
바인딩 로직은 델리게이트로 연결합니다.
직관적으로는 키와 로직을 직접 연결하면 될 것 같으나,(두 단계)
실질적으로는 세 가지 단계를 거치며 입력이 처리됩니다.
직관
키 - 로직
UE4
키 - 별명(매핑) - 로직(바인딩)
예를 들자면 스페이스 키로 점프를 시키는 경우,
직관으로는 아래와 같이 정리됩니다.
스페이스 키 - 점프
하지만 UE4에선 사이에 매핑이라는 과정이 추가로 존재합니다.
키 맵핑(Key Mapping)
매핑이란 그저 키에 이름(별명)을 붙이는 것에 불과합니다.
그럼 매핑은 왜 해야 하는 걸까요.
매핑의 장점은 아래와 같습니다.
- 같은 이름(한 가지 기능)에 여러 키를 할당할 수 있습니다.
- 이름(기능)에 할당된 키를 바꾸고자 하면 쉽게 바꿀 수 있습니다.
- 키로 축을 흉내내도록 매핑하여, 패드와 키보드를 쉽게 대응할 수 있습니다.
즉 PlayerInput 는 이름 - 키 의 연결들을 관리하는 주체입니다.
키 바인딩(Key Binding)
위의 매핑의 장점에서 볼 수 있듯,
이름(별명)과 기능는 1:1로 매칭합니다.
키 바인딩은 이름에 기능을 연결시키는 걸 의미합니다.
위의 예를 다시 차용하면,
스페이스 키 - 점프
'점프' 로직을 '스페이스 키'에 연결하고 있는데 키 바인딩은 이 연결을 말합니다.
물론 언리얼에서는 키에 직접 연결하는 것이 아니라 맵핑을 통한 이름(별명)에 연결하게 됩니다.
스페이스 키 -(키 맵핑)- "Jump" -(키 바인딩)- OnBeginJump
InputComponent 는 이 키 바인딩들을 관리합니다.
아래는 바인딩의 예시입니다.
InputComponent->BindAxis("MoveForward", this, &ASampleCharacter::MoveForward);
InputComponent->BindAction("Jump", IE_Pressed, this, &ASampleCharacter::OnBeginJump);
InputComponent 우선순위
PlayerInput은 플레이어 컨트롤러마다 있으므로, 한 클라이언트당 하나의 맵핑이 존재합니다.
그에 반해 InputComponent는 어디든 붙일 수 있습니다.
그러므로 각 InputComponent들은 우선순위를 따져서 입력을 처리해야 할 것입니다.
한 InputComponent 가 입력을 받으면, 그 아래로는 입력을 처리하지 않습니다.
우선순위는 아래와 같습니다.
- 인풋 기능이 활성화된 액터(최근 활성화된 순)
- 특정 액터에 입력 처리를 가장 먼저 하고 싶으면 "Accepts input" (입력 받음) 을 재활성화시키면 우선순위가 가장 높아집니다.
- 컨트롤러
- 레벨 스크립트
- 폰