April 18, 2014

UE4 의 입력 동작 및 축 매핑

저자: * Marc Audy

언리얼 엔진 4 에서는 입력 이벤트 바인딩을 가급적 쉽게 만들고자 했습니다. 그를 위해 Input Action and Axis Mappings (입력 동작 및 축 매핑) 섹션을 만들었습니다. 물론 이벤트에 직접 키 바인딩을 시킬 수도 있지만, 매핑을 사용하는 편이 입력 구성을 위해 가장 유연하고 편리한 방식임을 확신시켜 드릴 수 있습니다.

동작 및 축 매핑이 뭔가요?

동작 및 축 매핑은 입력 행위와 그것을 실행하는 키 사이에 간접 레이어를 삽입함으로써 키와 축을 입력 행위에 편리하게 매핑시키는 메커니즘을 제공합니다. 동작 매핑은 키 누르고 뗴는 데 대한 것이고, 축 매핑은 연속적인 범위가 있는 입력에 대한 것입니다.

키에 직접 바인딩하는 대신 매핑을 사용해야 하는 이유는 뭔가요?

입력 매핑을 사용하면 한 번의 바인딩으로 같은 행위에 대해 다수의 키를 매핑하는 것이 가능합니다. 프로젝트 레벨에서 기본 설정 관련 변심이 있었든, 사용자가 키 바인딩 UI 를 통해서든, 행위에 매핑된 키를 리매핑하는 작업도 쉬워집니다. 마지막으로 입력 매핑을 사용하면 축 입력이 아닌 입력 키(, 예로 [-1,1] 범위의 게임패드 엄지스틱 축)를 한 축의 컴포넌트(, 예로 전형적인 FPS 콘트롤에서의 앞뒤인 WS)로 해석하는 것이 가능합니다.

멋진데요. 셋업 방법은 어떻게 되죠?
Engine Input

엔진 프로젝트 세팅의 입력 섹션에서는 기존 매핑 목록을 확인하고 새로운 매핑을 만들 수 있습니다.

동작은 꽤나 단순합니다: 동작에 이름을 짓고, 그 동작에 매핑시키고자 하는 키를 추가한 다음, 그 키와 동시에 누르고자 하는 키를 지정합니다. 축 매핑 역시도 상당히 단순합니다. 동시 입력 키를 지정하는 대신, 스케일을 지정합니다. 스케일은 축의 값을 합할 때 키의 값에 적용되는 배수입니다. 이 기능은 키보드 키에서 축을 만들고자 할 때 특히나 유용합니다 (예를 들어 W 는 게임패드 스틱의 위, S 는 아래를 누르는 것을 나타냅니다).

매핑을 조금 정의했는데, 어떻게 사용하나요?

매핑은 블루프린트와 C++ 에서 행위에 바인딩 가능합니다.

C++ 에서는 거의 보통 Pawn/Character::SetupPlayerInputComponent 또는 PlayerCharacter::SetupInputComponent 함수 안에서 바인딩 셋업을 하지만, InputComponent 가 있는 곳이면 어디든 가능합니다. 바인딩은 InputComponent 에서 BindAction/Axis 를 호출하는 것으로 이루어집니다.

InputComponent->BindAxis("MoveForward", this, &ASampleCharacter::MoveForward);

InputComponent->BindAction("Fire", IE_Pressed, this, &ASampleCharacter::OnBeginFire);

InputComponent->BindAction("Fire", IE_Released, this, &ASampleCharacter::OnEndFire);

블루프린트에서는 Actor 블루프린트의 팔레트나 맥락 메뉴의 Input 섹션에서 Axis 또는 Action Event 노드를 놓는 것으로 가능합니다.

Blueprint AxisBlueprint Screen 2

C++ 와 블루프린트 양쪽에서, Axis 이벤트는 매 프레임 발동되어 Axis 의 현재 값을 전달하는 반면 Action 이벤트는 키 입력에 따라 Pressed 또는 Released 출력이 발동됩니다.

Axis 의 값은 해당 프레임 내 각 키 상태의 값의 합입니다. 즉 위의 MoveForward 의 경우, W 키만 누르고 있었다면 Axis 값은 1 이 되지만, W 와 S 를 동시에 눌렀다면 Axis 값은 0 이 될 것입니다. 참고로 W 와 Up 를 동시에 눌렀다면 값은 2 가 될 것이므로, 바인딩된 함수에서 값을 제한시켜 주는 것이 좋습니다.

Pressed 나 Released 이벤트에만 바인딩된 Action 은, 거기에 매핑된 키를 누르고/뗄 때마다 발동됩니다. 하지만 Paired Actions (즉 Pressed 와 Released 두 함수 모두 바인딩된 동작)의 경우, 처음 눌리는 키가 동작을 캡처한 것으로 간주합니다. 한 키가 동작을 캡처하면, 해제될 때까지 다른 바인딩된 키의 Press / Release 이벤트는 무시될 것입니다.

그게 다에요?

다른 중요한 입력 개념 (중 일부는 입력 문서 참고)에는 입력 스택, 어느 액터의 입력을 기본적으로 켤 것인지와 다른 액터에 대한 입력을 켜는 법, 입력 소모 작동방식 등이 있으나, 나중에 자세히 알아보는 것으로 하겠습니다.

프로젝트의 입력 셋업시 '동작 및 축 매핑'을 사용하는 것이 최선의 방법이라는 확신을 드렸기 바랍니다. 아니어도 괜찮습니다! Key 에 직접 바인딩하는 것이 더 편리하다면 언제든 가능하며, 값이 필요할 때 Actions 와 Axes 를 사용하여 변환하면 됩니다.

문제가 있으신가요? 저희 포럼(영문) 에 글을 남겨 주세요. 기꺼이 돕겠습니다!