언리얼에서는 인풋모드를 클래스로 만들어 관리하고 있는데 자주 쓰이는 인풋모드는 크게 3가지가 있다.
1. UI에만 인풋 전달.
2. 게임에만 인풋 전달.
3. 둘다에 인풋 전달.
서론
인벤토리를 만드는 중에 괜히 욕심이 생겨 특정 키를 누르면 현재 화면에 떠있는 팝업 ui 가 하나씩 지워지는 기능을 만들었는데 1번 모드를 사용하니 키 인풋이 먹히지 않았다. 열심히 배열이랑 함수들 만들어가며 추가한 기능인지라 이대로 버리긴 아까워서 구글링을 통해 해결하고자 한다. 참고로 3번을 쓰면 되지 않냐 싶은데 그렇게 했다가 인벤토리 클릭하는데 플레이어가 같이 공격해버리는 버그가 발생했다. 플레이어가 UI 밖 게임과 상호 작용하게 하고 싶지 않다면, 또는 키보드를 사용하여 UI와 상호작용 하고 싶다면 주목하자.
해결법
해결법은 간단하다. PlayerController 대신 위젯 자체를 통해 키보드 입력을 직접 처리하게 하는 것이다.
1. 위젯에는 IsFocusable이라는 속성이 있다. 이것을 true로 설정하여 위젯의 포커싱 가능성을 열어준다.
2. 위젯의 Event Construct에서 SetKeyboardFocus()함수를 불러주면 위젯이 키보드 포커스를 가지게 된다. 이제 위젯이 키보드 입력을 받을 수 있게 된다.
3. 위젯의 default 키보드 입력 응답을 재정의해야 한다. OnKeyDown() 함수를 오버라이드 하고 필요한 로직을 추가한다.
'UE4' 카테고리의 다른 글
[UE4] 상태패턴으로 캐릭터 효율적 관리 구상해보기 (0) | 2023.04.05 |
---|---|
[UE4] 클래스 이름 변경하는 방법 (0) | 2023.04.05 |
[UE4] MSB 3073 오류 해결법 (0) | 2023.03.29 |
[UE4] 아키타입(Archetype) (0) | 2023.03.02 |
[UE4] 인터페이스 (Interface) (0) | 2023.02.25 |