入力モードとTWeakObjectPtr
UI入力とUObjectの寿命を明確に表現する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
UIを開いたときにマウスは動作するが、キーボードショートカットが全部詰まる問題が生じることがある。 ProjectDTのホワイトボードはUIを操作しながらキーボード入力も受け続けなければならなかった。
入力モードを目的に合わせて選ぶ
FInputModeGameAndUI InputMode;
InputMode.SetHideCursorDuringCapture(false);
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;
FInputModeUIOnlyはUIに集中する時に当たるが、ゲーム側のキー入力も必要な画面には強すぎる。 FInputModeGameAndUIは、UIとゲームの入力を一緒に維持します。
フォーカスがどのウィジェットにあるのも重要です。 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で代入するほうが安全だ。
入力モードとポインタの種類はマイナーな文法選択ではありません。 誰が入力を受け取るのか、誰がオブジェクトの寿命を所有するのかをコードで表現する選択です。