본문 바로가기

블루프린팅/6. 플레이어 어빌리티

CH06 향상된 입력

향상된 입력

향상된 입력 플러그인 개요

복잡한 입력 처리, 런타임 컨트롤 리매핑 등 더욱 향상된 입력 기능이 필요한 언리얼 엔진 5 (UE5) 프로젝트에서 개발자는 향상된 입력 플러그인 을 사용하여 언리얼 엔진 4 (UE4) 기본 입력 시스템과의 하위 호환성과 업그레이드 경로를 확보할 수 있습니다. 이 플러그인은 방사상 데드존(dead zone), 조합 액션(chorded action), 컨텍스트에 따른 입력, 우선순위 지정 등의 기능과 에셋 기반 환경에서 원시 입력 데이터의 필터링 및 처리를 확장할 수 있는 능력을 제공합니다.

시작하기

향상된 입력 을 사용하도록 프로젝트를 구성하려면 향상된 입력 플러그인을 활성화하세요. 에디터의 편집(Edit) 드롭다운 메뉴에서 플러그인(Plugins) 을 선택하면 됩니다. 플러그인 목록의 입력(Input) 섹션에서 향상된 입력 플러그인(Enhanced Input Plugin)을 찾아 활성화하고 에디터를 재시작합니다.

 `

에디터를 재시작하면 플러그인이 활성화됩니다.

에디터를 재시작하고 나면 프로젝트에서 디폴트 UE5 입력 핸들러 대신 향상된 입력 플러그인 클래스를 사용하도록 설정할 수 있습니다. 편집(Edit) 드롭다운 메뉴에서 프로젝트 세팅(Project Settings) 을 선택합니다. 엔진(Engine) 제목 아래에 있는 입력(Input) 섹션에서 기본 클래스(Default Classes) 세팅을 찾습니다. 처음에는 이 세팅에 표준  PlayerInput    InputComponent 클래스가 포함되어 있을 것입니다.

 `

향상된 입력을 사용하려면 이 세팅을 각각 EnhancedPlayerInput  EnhancedInputComponent 로 변경합니다.

 `

핵심 콘셉트

향상된 입력 시스템에는 4개의 주요 콘셉트가 있습니다.

  • 입력 액션(Input Actions) 은 향상된 입력 시스템과 프로젝트 코드 사이의 통신 링크입니다. 점프하기, 문 열기 등 상호작용 캐릭터의 어떤 행동이든 입력 액션이 될 수 있습니다. 이 기능은 버튼을 길게 눌러 캐릭터 이동 방식을 걷기에서 달리기로 바꾸는 경우처럼 캐릭터의 입력 상태를 나타내는 데에도 사용할 수 있습니다. 입력 액션은 원시 입력과 다릅니다. 입력 액션은 액션을 트리거한 특정 입력과 관련이 없지만, 현재 상태를 알고 있으며 입력 값을 최대 3개의 독립된 부동 소수점 축으로 나타낼 수 있습니다.

예를 들어, ‘아이템 줍기' 액션은 on/off 상태만으로도 사용자가 캐릭터를 통해 아이템을 줍고 싶거나 줍고 싶지 않다는 것을 나타낼 수 있습니다. 반면 ‘걷기' 액션은 두 개의 축이 있어야 사용자가 캐릭터를 움직이고자 하는 방향과 속도를 나타낼 수 있습니다.

  • 입력 매핑 컨텍스트(Input Mapping Contexts) 는 사용자의 입력을 입력 액션으로 매핑합니다. 컨텍스트는 사용자별로 다이내믹하게 추가하거나 삭제할 수 있고 우선순위를 지정할 수 있습니다. 또한, 향상된 입력 로컬 플레이어 서브시스템(Enhanced Input Local Player Subsystem)을 통해 하나 이상의 컨텍스트를 로컬 플레이어에게 적용하고 우선 순위를 지정해 동일한 입력을 사용하고자 하는 여러 액션 사이의 충돌을 처리할 수 있습니다.

예를 들어, 캐릭터가 월드를 걸어다닐 때 눌러서 문을 열거나 캐릭터가 배낭을 들여다볼 때 눌러서 아이템을 선택할 수 있는 버튼이 있다고 가정해 봅시다.

캐릭터가 문 근처에 있으면 ‘문 열기' 컨텍스트를 추가합니다. 캐릭터가 배낭을 열면 ‘문 열기'보다 우선순위가 높은 ‘아이템 선택하기' 입력 매핑 컨텍스트를 추가합니다. 그러면 캐릭터가 문 근처에서 배낭을 들여다볼 때에도 배낭 속 아이템을 선택할 수 있습니다. 캐릭터가 배낭을 닫으면 ‘문 열기' 컨텍스트의 효과가 나타날 수 있도록 ‘아이템 선택하기' 컨텍스트를 삭제합니다.

이렇게 하면 캐릭터의 상황에 맞게 사용자의 입력을 해석할 수 있고, 문과 배낭 시스템을 인식하여 입력 처리 수준에서 코드를 프로그래밍하지 않아도 됩니다.

  • 모디파이어(Modifiers) 는 사용자의 디바이스에서 나오는 원시 입력의 값을 조절합니다. 입력 매핑 컨텍스트는 입력 액션에 대해 각 원시 입력과 관련된 모디파이어를 원하는 만큼 가질 수 있습니다. 대표적인 모디파이어로는 데드존, 여러 프레임에 걸친 입력 스무딩, 로컬에서 월드 스페이스로의 입력 벡터 변환, 기타 플러그인에 포함된 여러 모디파이어가 있습니다. 개발자가 자신만의 모디파이어를 만들 수도 있습니다.
  • 트리거(Triggers) 는 모디파이어 이후의 입력 값이나 다른 입력 액션의 출력 크기를 사용해 입력 액션의 활성화 여부를 결정합니다. 입력 매핑 컨텍스트에 포함된 모든 입력 액션은 입력마다 하나 이상의 트리거를 가질 수 있습니다. 예를 들어, 사진을 찍기 위해 카메라 위치 조절을 위한 별도의 입력 액션이 활성화된 상태에서 사용자가 왼쪽 마우스 버튼을 0.25초 동안 클릭해야 할 수도 있습니다.

개발자는 콘셉트를 조합해 단순한 것부터 복잡한 것까지 다양한 입력 시스템을 빠르게 구성할 수 있고, 프로젝트 코드를 변경하지 않고도 시스템을 조정할 수 있습니다.

입력 액션

입력 액션은 시스템과 프로젝트 코드 사이의 연결입니다. 입력 액션을 생성하려면 컨텍스트 브라우저(Context Browser) 를 우클릭한 다음 입력(Input) 옵션을 펼쳐서 입력 액션(Input Action) 을 선택합니다.

입력 액션을 트리거하려면 입력 매핑 컨텍스트에 입력 액션을 포함시킨 다음 이 입력 매핑 컨텍스트를 로컬 플레이어의 향상된 입력 로컬 플레이어 서브시스템 에 추가해야 합니다.

 `

 클래스가 트리거된 입력 액션에 반응하게 하려면 블루프린트 그래프 에 이벤트를 추가해야 합니다. 각 입력 액션은 해당하는 에셋 이름을 가진 이벤트를 생성합니다. 예를 들어, 입력 액션을 만들고 에셋 이름을 ‘MyAction' 으로 지정했다면 이벤트 이름도 ‘MyAction' 이 됩니다.

블루프린트 그래프 의 빈 공간에서 우클릭한 다음 컨텍스트 메뉴(context menu)  향상된 액션 이벤트(Enhanced Action Events) 카테고리에서 해당하는 이벤트를 선택합니다. 에셋 이름을 입력하면 컨텍스트 메뉴의 결과 범위를 좁힐 수 있습니다.

 `

블루프린트 그래프를 우클릭하면 나타나는 컨텍스트 메뉴에서 MyAction 이벤트를 찾습니다.

같은 이름을 가진 입력 액션 에셋들이 여러 폴더에 들어 있다면 해당하는 이름의 이벤트들이 이 목록에 나타납니다. 이벤트 위로 마우스를 가져가면 툴팁이 표시되어, 폴더 경로를 포함한 전체 에셋 이름을 확인하고 원하는 에셋을 선택할 수 있습니다.

블루프린트에 이벤트를 추가하면 접힌 상태로 표시됩니다. 노드를 펼치면 다른 실행 핀과 추가 데이터를 볼 수 있습니다.

 `

완전히 펼친 이벤트 노드입니다. ‘MyAction' 의 상태에 따라 틱마다 적절한 핀을 실행합니다.

입력 매핑 컨텍스트

입력 매핑 컨텍스트는 하나 이상의 입력 액션을 트리거하는 규칙을 설명합니다. 입력 매핑 컨텍스트의 기본 구조는 최상위 레벨에 입력 액션 목록이 있는 계층구조입니다. 입력 액션 수준 아래에는 키, 버튼, 이동 축과 같이 각 입력 액션을 트리거할 수 있는 사용자 입력 목록이 있습니다.

최하위 레벨에는 각 사용자 입력에 대한 입력 트리거와 입력 모디파이어의 목록이 있습니다. 트리거와 모디파이어를 사용하면 입력의 원시 값을 필터링하고 처리하는 방식과 계층구조 최상위에 있는 입력 액션을 유도하려면 충족시켜야 할 조건을 결정할 수 있습니다.

모든 입력은 여러 개의 입력 모디파이어와 입력 트리거를 가질 수 있습니다. 모디파이어와 트리거는 사용자가 생성한 목록의 표시 순서대로 평가됩니다. 이 점은 각 단계의 출력을 다음 단계의 입력으로 사용하는 입력 모디파이어에서 특히 중요합니다.

입력 매핑 컨텍스트를 생성하려면 컨텍스트 브라우저(Context Browser) 를 우클릭한 다음 입력(Input) 옵션을 펼쳐서 입력 매핑 컨텍스트(Input Mapping Context) 를 선택합니다.

 `

입력 매핑 컨텍스트를 해당하는 입력 액션으로 채웁니다. 단순한 프로젝트의 경우 하나의 입력 매핑 컨텍스트에 모든 입력 액션을 넣을 수도 있습니다. 복잡한 프로젝트의 경우 여러 개의 입력 매핑 컨텍스트를 사용하는 것이 좋습니다. 로컬 플레이어가 동시에 여러 개의 활성 입력 매핑 컨텍스트를 가질 수 있기 때문입니다.

예를 들어, 수영하기, 걷기, 비히클 운전하기가 가능한 캐릭터에게는 항상 동일한 사용자 입력에 매핑되며 언제든 사용할 수 있는 일반적인 액션용 컨텍스트, 이동 수단용 컨텍스트 등 여러 개의 입력 매핑 컨텍스트를 줄 수 있습니다.

개발 단계에서 비히클과 관련된 입력 액션을 별도의 입력 매핑 컨텍스트에 배치할 수 있습니다. 이 액션은 로컬 플레이어가 비히클에 올라타면 추가되고, 비히클에서 내리면 삭제됩니다.

이 방법을 사용하면 부적절한 입력 액션이 실행될 수 없기 때문에 최적화와 버그 예방에 도움이 됩니다. 또한, 상호배타적인 입력 매핑 컨텍스트를 사용하면 입력 충돌을 피할 수 있기 때문에 사용자 입력이 여러 입력 액션에 사용되는 경우에도 잘못된 액션이 실수로 트리거되는 일이 없습니다.

자세한 사항은 모디파이어  트리거 섹션을 참조하세요.

 `

이 입력 매핑 컨텍스트는 달리기에 필요한 입력 액션을 보여줍니다. 이 액션은 두 축을 하나의 입력으로 결합하는 게임패드의 왼쪽 썸스틱 편향 등 여러 입력으로 활성화할 수 있습니다. 해당 입력의 원시 값은 ‘dead zone' 입력 모디파이어를 거치게 되고, 결과 값은 ‘hold' 입력 트리거로 전송되어 ‘RunAction' 입력 액션을 유도합니다.

드롭다운 메뉴에는 다양한 입력 바인딩이 있습니다. 입력 바인딩을 빠르게 선택하려면 드롭다운 왼쪽에 있는 작은 버튼을 클릭한 다음, 바인딩하고 싶은 키나 버튼을 누르면 됩니다.

이 간단한 입력 매핑 컨텍스트는 달리기와 점프하기 입력 액션을 지원합니다.

입력 매핑 컨텍스트를 채웠다면 이제 폰의 플레이어 컨트롤러(Player Controller)와 관련된 로컬 플레이어(Local Player) 에 컨텍스트를 추가할 수 있습니다. 추가하려면 폰의 컨트롤러를 플레이어 컨트롤러로 형변환하고, 향상된 입력 로컬 플레이어 서브시스템을 가져와, 인티저 우선순위 값을 사용해 이 서브시스템에 입력 매핑 컨텍스트를 추가하면 됩니다. 향상된 입력 로컬 플레이어 서브시스템은 특정 입력 매핑 컨텍스트의 쿼리나 제거, 또는 모든 입력 매핑 컨텍스트 지우기도 지원합니다.

추가한 각 입력 매핑 컨텍스트는 포함된 입력 액션을 트리거해 폰의 블루프린트 그래프에서 적절한 이벤트를 실행할 수 있도록 해줍니다. 입력 매핑 컨텍스트의 설정은 게임플레이 도중에 언제든지 바꿀 수 있습니다.

입력 모디파이어

입력 모디파이어는 UE5가 수신하는 원시 입력 값을 입력 트리거로 보내기 전에 변경하는 프리 프로세서입니다. 향상된 입력 플러그인에는 축 순서를 변경하고, ‘데드존'을 구현하고, 축 입력을 월드 스페이스로 변환하는 등 여러 작업을 수행할 수 있는 다양한 입력 모디파이어가 포함되어 있습니다.

입력 매핑 컨텍스트의 각 입력 액션과 관련된 입력은 입력 모디파이어의 사용자 정의 시리즈를 거친 뒤 해당 입력에 대한 입력 트리거로 이동합니다. 입력 모디파이어는 나열된 순서에 따라 적용되며, 각 입력 모디파이어에서 나온 출력 값은 다음 입력 값이 됩니다.

  1. 입력 모디파이어를 생성하려면, 입력 모디파이어 를 부모로 사용해 새 블루프린트 자손 클래스 를 생성하면 됩니다.

 `

입력 모디파이어 자손 클래스 생성

  1. 그 다음, 내 블루프린트(My Blueprint) > 함수(Functions) > 오버라이드(Override) 로 이동해 드롭다운 메뉴 에서 Modify Raw 함수를 선택합니다.

 `

출력 파라미터인 입력 액션 값(Input Action Value)  벡터(Vector) 처럼 3개의 float 값을 포함합니다. 함수의 입력 파라미터는 플레이어 입력(Player Input) 오브젝트, 입력 하드웨어나 이전 입력 모디파이어에서 가져온 현재 값(Current Value) , 델타 시간(Delta Time) 값을 포함합니다.

 `

Modify Raw 에서 반환되는 입력 액션 값은 입력 모디파이어(존재하는 경우)로 이동하거나 첫 번째 입력 트리거로 이동합니다.

 `

방향 입력

입력 모디파이어의 적절하게 사용한 사례로는 하나의 입력 액션을 이용한 2차원 방향 입력이 있습니다. 마우스나 게임패드의 아날로그 스틱을 사용하는 경우, 최소 2개의 축을 지원하는 입력 액션을 생성하고 적절한 입력 매핑 컨텍스트를 추가하여 간단히 2차원 이동을 읽을 수 있습니다.

향상된 입력은 키보드의 방향키 화살표나 흔한 WASD 키 구성 등 1차원 소스의 입력을 지원합니다. 이 컨트롤 방식은 올바른 입력 모디파이어를 적용해 구현할 수 있습니다. 특히 반전(Negate) 을 사용하면 일부 키를 음수로 등록할 수 있고, 입력 축 값 스위즐(Swizzle Input Axis Values) 을 사용하면 일부 키를 디폴트인 X축 대신 Y축으로 등록할 수 있습니다.

문자 키방향키원하는 입력 해석필요한 입력 모디파이어

W 위쪽 양의 Y축 Swizzle Input Axis Values(YXZ 또는 ZXY)
A 왼쪽 음의 X축 Negate
S 아래쪽 음의 Y축 Negate Swizzle Input Axis Values(YXZ 또는 ZXY)
D 오른쪽 양의 X축 (없음)

방향키 화살표나 WASD 키의 해석을 통해 1차원 입력을 2차원 입력 액션으로 매핑할 수 있습니다.

각 키는 양의 1차원 값을 보고하므로, 이 값은 항상 X축을 차지하고 어떤 틱에서든 0.0이나 1.0 중 하나의 값을 갖게 됩니다.

왼쪽과 아래쪽 입력 값을 무효화하고 위쪽과 아래쪽 입력에 대해 X축 값이 Y축으로 이동하도록 축 순서를 반전시키면, 입력 모디파이어를 사용하여 1차원 입력 세트를 하나의 2차원 입력 값으로 해석할 수 있습니다.

입력 트리거

입력 트리거는 선택적인 입력 모디파이어 목록을 패스스루(pass-through)한 뒤 사용자 입력이 입력 매핑 컨텍스트 내에서 해당 입력 액션을 활성화해야 하는지의 여부를 결정합니다. 대부분의 입력 트리거는 입력 자체를 분석하여 최소 발동 값을 확인하고, 짧은 탭 동작이나 길게 누르기 또는 일반적인 '누르기'나 '놓기' 이벤트와 같은 패턴을 검증합니다. 이 규칙의 유일한 예외는 다른 입력 액션을 통해서만 트리거되는 '조합 액션' 입력 트리거입니다. 기본적으로 입력에 대한 모든 사용자 활동은 틱마다 트리거됩니다.

입력 트리거에는 다음과 같은 세 가지 유형이 있습니다.

  • 명시(Explicit) 유형은 입력 트리거 성공 시, 입력에 성공합니다.
  • 암시(Implicit) 유형은 입력 트리거와 모든 암시 유형 입력 트리거 성공 시에만 입력에 성공합니다.
  • 블로커(Blocker) 유형은 입력 트리거 성공 시, 입력에 실패합니다.

다음은 각 트리거 유형이 다른 트리거 유형과 상호작용하는 방식을 논리적으로 나타낸 예시입니다.

암시 == 0, 명시 == 0 - 값이 0이 아닐 때 항상 발동됩니다.

암시 == 0, 명시 > 0 - 하나 이상의 명시가 발동되었습니다.

암시 > 0, 명시 == 0 - 모든 암시가 발동되었습니다.

암시 > 0, 명시 > 0 - 모든 암시와 하나 이상의 명시가 발동되었습니다.

블로커 - 다른 트리거를 모두 오버라이드하여 트리거 실패를 강제합니다.

사용자 입력을 처리하고 나면, 입력 트리거는 다음의 세 가지 상태 중 하나를 반환할 수 있습니다.

  • 없음(None) 은 입력 트리거의 조건이 충족되지 않아 입력 트리거가 실패했음을 나타냅니다.
  • 진행 중(Ongoing) 은 입력 트리거의 조건이 부분적으로 충족되었으며 입력 트리거가 처리 중이지만, 아직 성공하지 않았음을 나타냅니다.
  • 트리거됨(Triggered) 은 모든 입력 트리거 조건이 충족되었으며 입력 트리거가 성공했음을 나타냅니다.

베이스 입력 트리거 클래스를 확장하거나 입력 트리거 시간 베이스(Input Trigger Timed Base) 로 나만의 입력 트리거를 생성할 수 있습니다. 입력 트리거 시간 베이스 는 입력을 받아들이고 진행 중 상태를 반환하기 전에 특정 시간 동안 입력이 유지되었는지 확인합니다.

제공되는 입력 트리거 시간 베이스 클래스는 트리거됨 상태를 반환하지 않습니다. 새로운 입력 트리거 자손 클래스 내의 함수를 오버라이드하여 사용자 입력에 반응하는 방식을 결정합니다. Get Trigger Type 함수는 입력 트리거 유형을 결정합니다. 상태 업데이트(Update State) 는 플레이어의 입력 오브젝트와 현재 입력 액션 값, 델타 시간을 받아 없음, 진행 중 또는 트리거됨 상태를 반환합니다.

 `