본문 바로가기

TIL

2025 - 02 - 03 Unreal Input MappingContext 우선순위

목차 

1. 우선순위 알기전 IMC 설정

2. 오늘 알게된 내용

 

 

1. 우선순위 알기전 IMC 설정

 

 C++에서 IMC설정하기

 

.h

public:

	//사람 용
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
	UInputMappingContext* InputMappingContext;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
	UInputAction* MoveAction;
	
	//드론 용
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
	UInputMappingContext* InputDronMappingContext;

 

.cpp

void ControllerClass::SetupInputComponent()
{
    Super::SetupInputComponent(); 

    if (!InputComponent)
    {
        UE_LOG(LogTemp, Error, TEXT("InputComponent is NULL"));
        return;
    }

    //게임모드에서 로컬 플레이어 가져오기
    if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
    {
        if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
            LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
        {
            if (InputMappingContext)
            {
                //로컬 플레이어에 우선 순위설정
                Subsystem->AddMappingContext(InputMappingContext, 0);
            }
            if (InputChangeContext)
            {
                Subsystem->AddMappingContext(InputChangeContext, 2);
            }
        }
    }
   
}

 

저는 SetupInputComponent 에서 지정해줬습니다.

게임 시작할 때 IMC를 지정해주는 방식입니다.

 

.h파일에서 IMC와 IA를 지정해주고 cpp에서 지정해주는코드입니다.

 

2. 오늘 알게 된 내용 

캐릭터를 교체하는 과정에서 현재 사용하던 IMC가 아닌 다른 IMC에 적용시킨 키들을 사용하고 싶고,

IMC가 변경되어도 계속 적용하고 싶은 키가 있는데 추가해주는게 어렵진않아도 굳이 교체 해주고싶지않아서 

IMC에 대해 잠시 공부해 보았다.

 

 

 

 

c++ 클래스에서 IMC를 정할 때 우선순위를 정할 수 있습니다.

우선순위를 왜 사용하는지를 알아야 했습니다.

 

현재 IMC를 정하는 게 아닌 우선순위를 정하는 이유는

IMC는 여러개를 적용 시킬 수 있었습니다.

그렇다는 뜻은 여러 IMC에 들어있는 키들을 사용할 수 있다는 것이라고 생각 됩니다.

 

캐릭터 IMC

옵션 IMC 

크게 2개라고 생각합니다.

 

그런데 이제 여러개의 IMC중 키가 중첩 되는 일이 생길 수 있을 거라 생각합니다.

 

그럴때 무슨 IMC의 키를 사용할 지 정하면서 우선순위를 사용하는 것 같습니다.

 

 

 

현재 사용하고 있는 IMC_Human 에서 사용하는 WASD와

다른 폰에서 사용할 IMC_Drone에서 키가 곂쳐있습니다.

 

이 상황에서 
AddMappingContext(IMC_Human , 0)

AddMappingContext(IMC_Drone , 1)

으로 적용되면 Human에서 사용하는 wasd가 아닌 드론의 wasd가 사용됩니다.

 

qe는 1번을 사용합니다.

중첩되지않아서 그렇습니다.

 

 

 

여기서 봐야할건 중첩되지 않으면 다른 IMC를 사용한다는 점입니다.

 

 그냥 모든 IMC에서 사용하고 싶은 P키를 지정한 IMC가 있다고 할때

AddMappingContext(IMC_Other , 2)

로 지정해서 어디 에서도 사용가능한 키를 지정할 수 도 있었습니다.