Input Mode와 TWeakObjectPtr
UI 입력과 UObject 수명을 명확하게 표현하기
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
UI를 열었을 때 마우스는 작동하지만 키보드 단축키가 전부 막히는 문제가 생길 수 있다. ProjectDT의 화이트보드는 UI를 조작하면서 키보드 입력도 계속 받아야 했다.
Input Mode를 목적에 맞게 고른다
FInputModeGameAndUI InputMode;
InputMode.SetHideCursorDuringCapture(false);
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;
FInputModeUIOnly는 UI에 집중할 때 맞지만 게임 쪽 키 입력도 필요한 화면에는 너무 강할 수 있다. FInputModeGameAndUI는 UI와 게임 입력을 함께 유지한다.
포커스가 어느 Widget에 있는지도 중요하다. EditableTextBox가 키 입력을 소비하면 PlayerController까지 단축키가 전달되지 않을 수 있다.
오래 잡아둘 필요가 없는 객체는 Weak Pointer
UI Subsystem이 현재 MainWidget과 WhiteBoard를 기억하더라도 그 객체의 수명을 소유할 필요는 없다.
TWeakObjectPtr<UMainWidget> MainUI;
TWeakObjectPtr<UInvestigateWhiteBoard> ActiveWhiteBoard;
TObjectPtr는 UObject 참조를 추적하며 강한 참조로 객체의 생존에 영향을 줄 수 있다. TWeakObjectPtr는 객체가 파괴되면 유효하지 않게 되므로 사용 전에 확인한다.
if (UMainWidget* Widget = MainUI.Get())
{
Widget->ShowOverlay();
}
Forward Declaration된 타입을 가리키는 Weak Pointer의 Inline Setter는 컴파일 오류를 만들 수 있다. 헤더에는 선언만 두고, 타입의 전체 정의를 Include한 CPP에서 대입하는 편이 안전하다.
입력 모드와 포인터 종류는 사소한 문법 선택이 아니다. 누가 입력을 받을지와 누가 객체 수명을 소유할지를 코드로 표현하는 선택이다.