← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-14

入力モードとTWeakObjectPtr

UI入力とUObjectの寿命を明確に表現する

INTERACTIVE READING MODE →

本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。

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で代入するほうが安全だ。

入力モードとポインタの種類はマイナーな文法選択ではありません。 誰が入力を受け取るのか、誰がオブジェクトの寿命を所有するのかをコードで表現する選択です。