헛둘이 2024. 10. 19. 03:34

Input에 대한 학습 및 구현을 이해하느라 포스팅이 조금 걸렸습니다.ㅠㅠ

 

Lyra에서는 EnhancedInput을 사용하는데, 기존 Input에 비해 조금 더 복잡한 입력 시스템을 처리하기 위한 방법입니다.

 

기존 Input은 보통의 엔진에서 구현하듯 매 프레임마다 각 키의 상태를 직접적으로 체크하는 방식이었습니다.

Enhanced Input은 입력의 단위를 InputActions으로 정의하고, 이를 InputMappingContext에 등록하여 처리합니다.

이는 다양한 입력 장치에 대해 대응할 수 있도록 하며, 게임 상황에 따라 동적으로 변경이 가능하다는 이점이 있습니다.

 

이 과정은 HeroComponent에서 이루어지며, InitState가 DataAvailable 상태에서 DataInitialized 상태로 변경될 때 Camera와 함께 부착됩니다.

 

Input이 등록되는 로직의 흐름은 다음과 같습니다.

 

1. PawnExtensionComponent를 가져온다 (PawnData를 가져오기 위해)

2. PawnData를 가져온다. (InputConfig를 가져오기 위해)

* InputConfig는 이후 Find***함수 시리즈를 통해 Input을 바인딩할 때 제대로 등록된 Input이 등록되는지 검사하는 역할을 한다 .

3. 그 후 이전에 Blueprint로 매핑해둔 PlayerMappingInputConfig를 Subsystem에 등록한다.

UEnhancedInputLocalPlayerSubsystem* Subsystem = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();

- 이것이 Input을 등록할 Subsystem

 

블루프린트로 먼저 HeroComponent의 멤버로 PlayerMappingInputConfig를 등록해준다.

 

Native에서 Input을 등록할 때 해당 Array를 순회하며 Subsystem에 등록한다.

UHmInputComponent* HmIC = CastChecked<UHmInputComponent>(PlayerInputComponent);
{
	HmIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Move, ETriggerEvent::Triggered, this, &ThisClass::Input_Move, false);
	HmIC->BindNativeAction(InputConfig, GameplayTags.InputTag_Look_Mouse, ETriggerEvent::Triggered, this, &ThisClass::Input_LookMouse, false);
}

- 그 후 InputComponent에서 Bind해준다.

 

구현하면서 한 가지 이슈가 있었는데, 다 작성한 후 실행해보니 키 입력도 안먹고, 마우스 입력도 안먹는 것이었습니다.

HeroComponent에서부터 BreakPoint를 걸고 하나씩 범위를 좁혀나가다보니, DefaultInputConfigs Array가 비어 있는 것을 확인했습니다.

그래서 역으로 이 Array가 비어있는지 거슬러 올라가다보니, Pawn Blueprint에서 PMI(Player Mapping Input Config)를 설정해주지 않아서 발생한 문제였던 것이 확인되어 정상 작동되는 것을 확인했습니다.