보키_기록용

Enhanced Input Priority 및 Consume Input에 대해 본문

언리얼/Enhanced Input System

Enhanced Input Priority 및 Consume Input에 대해

bokki0117 2023. 3. 23. 15:46

입력 우선순위에 대해 리서치 하다가 정리하는게 좋을 거 같아서 만드는 페이지입니다.

기본적인 Enhanced Input System에 대해서는

https://bokki0117.tistory.com/33

 

C++에서 Enhanced Input System 사용하기

Lyra 게임을 살펴보다가 테스트용으로 Enhanced Input System이라는 것을 적용해보기로 했다. Enhanced Input 핵심 요소 입력 액션(Input Actions) : Enhanced Input System과 프로젝트 코드 사이의 통신 링크. 점프하

bokki0117.tistory.com

에 있습니다.


Enhanced Input을 쓸려면 Input Mapping Context(IMC)가 필수 요소입니다. IMC를 추가하려면 AddMappingContext()를 사용합니다.

 

Priority 로 우선 순위를 지정할 수 있습니다.


검증 전에

IMC_A, IMC_B 모두 IA_MouseClick이라는 InputAction을 가지고 있습니다.

IMC_A는 왼쪽 마우스 버튼이 눌렸을때(Pressed) 발동됩니다.

IMC_B는 왼쪽 마우스 버튼이 해제되었을때(Released) 발동됩니다.


IMC_A의 우선 순위가 더 높을 때

IMC_A의 IA_MouseClick이 우선되어 왼쪽 마우스 클릭을 누른 순간 트리거 됩니다.

IMC_B의 Released는 트리거되지 않습니다.


IMC_B의 우선 순위가 더 높을 때

IMC_A의 Pressed는 트리거되지 않습니다.

IMC_B의 IA_MouseClick이 우선되어 왼쪽 마우스 클릭을 놓은 순간 트리거 됩니다.


Priority가 동일할 때

나중에 추가된 IMC_B의 Released가 우선되어 왼쪽 마우스 클릭을 놓은 순간 트리거 됩니다.

IMC_A의 Pressed는 트리거되지 않습니다.

같은 Priority일 경우 나중에 추가된 것이 우선됩니다.


할당 된 키가 다른 경우

Priority에 상관없이 양쪽 모두 트리거됩니다.


InputAction이 다르지만 동일한 키를 할당했을 때

Priority가 높은 것이 우선됩니다.


Consume Input(입력 소모)

지금까지의 Consume Input(입력 소모)은 모두 True 상태였습니다.

Consume Input(입력 소모)가 False일 경우 Priority에 상관없이 양쪽 모두 트리거됩니다.

 

Consume Input(입력 소모)가 True일 시 : Priority의 영향을 받아 우선 순위에 상정해 트리거된다.

Consume Input(입력 소모)가 False일 시 : Priority에 상관없이 양쪽 모두 트리거된다.


+ ) Ignore All Pressed Keys Untill Release

AddMappingContext()의 Options을 분할 시키면

이런 식으로 값 2개가 나오는데 Lyra에서도 Ignore All Pressed Keys Untill Release는 코드에서 명시적으로 적어놔서 찾아봤습니다.

Ignore All Pressed Keys Untill Release가 Ture일 시 : 해당 입력이 트리거되면 다른 입력을 무시합니다.

Ignore All Pressed Keys Untill Release가 False일 시 : 입력이 트리거되어도 다른 입력을 받을 수 있습니다.

 

디폴트는 True상태입니다만, Lyra에서나 우리 코드에서나 False상태로 사용하고 있습니다.

다음은 Lyra에서 Ignore All Pressed Keys Untill Release에 대한 주석 내용을 번역한 것입니다.

우리는 매핑 컨텍스트를 추가할 때 "Down" 상태였던 키를 무시하고 싶지 않습니다.
이렇게 하면 이동 키를 누른 상태에서 죽을 수 있고, 
부활을 기다리는 동안 계속 누르고 있으면, 바로 부활한 직후에도 적용됩니다.
bIgnoreAllPressedKeysUntilRelease를 기본 값인 "true" 상태로 두면, 
플레이어는 이동 키를 놓아야 하며, 부활 후 다시 눌러야 합니다.

GamePause같이 모든 입력을 무시해야 할 때는 Ture로 놓는 것이 좋을 것 같습니다.


PMI(PlayerMappableInputconfig)

우리는 IMC를 바로 AddMappingContext()를 써서 바인딩하지 않고 PMI로 IMC들을 모아서 등록합니다.

PMI를 등록하는 AddPlayerMappableConfig() 를 보면 내부에서 AddMappingContext()를 쓰는 것을 알 수 있습니다.

void IEnhancedInputSubsystemInterface::AddPlayerMappableConfig(const UPlayerMappableInputConfig* Config, const FModifyContextOptions& Options)
{
	if(Config)
	{
		for(TPair<TObjectPtr<UInputMappingContext>, int32> Pair : Config->GetMappingContexts())
		{
			AddMappingContext(Pair.Key, Pair.Value, Options);
		}	
	}
}

TPair<TObjectPtr<UInputMappingContext>, int32> Pair에서 Pair.Value에 해당하는 부분이 Priority입니다.

BP에서는 빨간 네모 박스 부분을 수정하면 우선 순위를 지정할 수 있습니다.


참고

https://ci-en.net/creator/15980/article/771199

 

【UE5】Enhanced Input:Priority や Consume Input の検証 - わんころのUE5勉強会 - Ci-en(シエン)

皆様、あけましておめでとうございます!! 今年も一年宜しくお願い致します! 2022年で一番触ったはずの Enhanced Input が未だによく分かっていません。 すべての始まりである「Add Mapping Conte

ci-en.net:443

 

Comments