1.

UE5 SetInputMode_UIOnlyで有効なPlayerControllerが必要エラーの原因と解決

編集

SetInputMode_UIOnlyは、'PlayerController'ターゲットとして有効なプレイヤーコントローラーを想定しています」は、Set Input Mode (UI Only) ノード(または関数)の Target(Player Controller)ピンに、有効なPlayerControllerが渡らず None(無効)になっているときに出る警告です。最短の解決は、Get Player Controller (Player Index 0) で取得したPlayerControllerをTargetに必ず接続すること。多くは Target未接続・Get Player Controllerの戻りがNull・呼ぶタイミングが早すぎる、のいずれかが原因です。以下で原因の切り分けと確実な直し方を解説します。

この記事の要点
  • このメッセージは「Set Input Mode (UI Only)」のTarget(Player Controller)が None / 無効 なときに出る警告で、入力モードの切り替えがスキップされる。
  • 最短の解決は Get Player Controller(0) でPlayerControllerを取得し、その出力を Targetピンに必ず接続すること。
  • 原因の典型は「Targetピン未接続(Self扱い)」「Get Player Controllerの戻りがNull」「BeginPlay前など早すぎるタイミング」「WidgetやGameInstanceなどPlayerControllerでない場所で呼んでいる」。
  • 呼び出し前に Is Valid でPlayerControllerをチェックすると、原因の切り分けとクラッシュ回避ができる。
  • マルチプレイでは サーバー側で呼ばないPlayer Indexの取り違えに注意。入力モードはローカル(クライアント)の概念。

エラーの意味

UE5の入力モード切り替えノード Set Input Mode (UI Only) は、内部的に「どのプレイヤーの入力をUI専用に切り替えるか」を決めるため、Target(Player Controller)ピンに有効なPlayerControllerオブジェクトを必要とします。このTargetが None(空) だったり、すでに破棄されたオブジェクトだったりすると、エンジンは「有効なPlayerControllerを想定していたのに渡されなかった」と判断し、この警告を出して処理を中断(入力モードを切り替えない)します。

つまりエラー自体は「クラッシュ」ではなく、「Targetに正しいPlayerControllerを渡してください」という指摘です。結果として「マウスカーソルが出ない」「UIがクリックできない」「ゲーム入力が止まらない」といった症状につながります。同じ仕組みのため、Set Input Mode (Game And UI)Set Input Mode (Game Only) でも同種の警告(「expects a valid player controller」)が出ます。

主な原因

原因何が起きているか
Targetピンが未接続Targetを何も繋がずに実行している。Self(呼び出し元)がPlayerControllerでない場合(Actor・Widget・GameModeなど)はNone扱いになり警告が出る。
Get Player Controllerの戻りがNullBeginPlayより前など、まだPlayerControllerが生成されていないタイミングで取得しており、戻り値がNullになっている。
Player Indexの間違い該当するインデックスのプレイヤーが存在しない(例:シングルプレイなのにIndex 1を指定)ためNullが返る。
キャスト失敗の結果を渡しているカスタムPlayerControllerへの Cast が失敗(別クラス)し、その失敗側のNull出力をTargetに繋いでしまっている。
呼ぶ場所が不適切Widget・GameInstance・サーバー専用ロジックなど、有効なローカルPlayerControllerが手に入らない文脈で呼んでいる。

解決策

原因の多くは「Targetに有効なPlayerControllerを確実に渡す」ことで解決します。次の順で対応してください。

1. Get Player Controller(0) を取得してTargetに繋ぐ(最短)

Get Player Controller ノードを置き、Player Index を 0(シングルプレイ/ローカル先頭プレイヤー)にして、その Return Value をSet Input Mode (UI Only) のTargetピンに接続します。Targetを「未接続のまま」「Selfのまま」にしないことが最重要です。

// Blueprint(ノードの流れ)

Event BeginPlay

 → Get Player Controller (Player Index = 0)

 → Set Input Mode (UI Only) [ Target = 上のReturn Value ]

 → Set Show Mouse Cursor (Target = 同じPlayerController, Show = true)

2. Is Valid で事前チェックする

取得したPlayerControllerが本当に有効かを Is Valid ノード(または ?Is Valid マクロ)で確認し、Valid のときだけ Set Input Mode を実行します。これで「Nullを渡して警告」を確実に防げ、どのタイミングでNullになるかの切り分けにもなります。

Get Player Controller(0) → Is Valid?

 Valid  → Set Input Mode (UI Only) [ Target = PlayerController ]

 NotValid → 何もしない(または1フレーム遅らせて再取得)

3. 呼ぶ場所・タイミングを見直す

PlayerControllerが確実に存在する文脈で呼ぶのが基本です。おすすめは PlayerControllerブループリント自身、または BeginPlay以降 のタイミングです。

  • PlayerControllerのBP内で呼ぶなら、Targetに Self を繋ぐだけで有効なPlayerControllerになる(最もシンプル)。
  • Actorや他のBPで呼ぶ場合は、必ず Get Player Controller(0) 経由でTargetを渡す。
  • 取得が早すぎてNullになるなら、BeginPlay 以降に移す。それでも不安定な場合は Delay 0.0(1フレーム待ち)Set Timer で1フレーム後に実行して再取得する。

4. カスタムPlayerControllerを使う場合

独自のPlayerControllerクラスを使っていても、Set Input ModeのTargetは 基底のPlayer Controller型でそのまま受け取れるため、入力モード切り替えだけが目的ならキャストは不要です。キャストが必要なのは「カスタムクラス独自の関数・変数にアクセスしたいとき」だけです。キャストする場合は、Cast成功側の出力をTargetに繋ぎ、失敗側(Null)を繋がないよう注意してください。

Set Input Mode 系(UIOnly / GameAndUI / GameOnly)の前提

3種類いずれも「Target = 有効なPlayerController」が前提です。用途と注意点を整理します。

ノード用途と前提
Set Input Mode (UI Only)入力をUIだけに渡す(メニュー・ダイアログ等)。Widget to Focus を指定でき、In Widget to Focus が無効だと操作対象が曖昧になることがある。
Set Input Mode (Game And UI)ゲームとUIの両方に入力を渡す(HUD上のUI操作など)。マウス挙動(ロック/表示)の設定も持つ。
Set Input Mode (Game Only)入力をゲーム側に戻す。UIを閉じた後に必ず呼んで入力を元に戻すのが定石。

いずれも マウスカーソルの表示は別ノード(Set Show Mouse Cursor)で制御します。「UIは出るがカーソルが見えない」場合は、入力モードとカーソル表示の両方を同じPlayerControllerに対して設定してください。なお細かな引数名・既定挙動はバージョンで変わることがあるため、公式ドキュメントの確認を推奨します。

落とし穴

つまずきやすいポイント
  • サーバー側で呼んでいる:入力モードはローカル(クライアント)の概念。マルチプレイでDedicated Serverやサーバー権限の処理で呼ぶと有効なローカルPlayerControllerが無くNullになりやすい。Is Local Controller を確認し、クライアント側で実行する。
  • Player Indexの取り違え:ローカルマルチ(スプリットスクリーン)以外で Index 1 以降を指定すると該当プレイヤーが無くNullになる。基本は 0
  • Widget内で適当なPlayerControllerを使う:Widget Blueprintでは Get Owning Player を使うと、そのWidgetを所有する正しいPlayerControllerが得られる。Get Player Controllerと混在させない。
  • キャスト失敗側を繋いでいる:Cast to カスタムPC が失敗するとNullが出る。その出力をTargetに繋ぐと必ずこの警告になる。
  • カーソルが出ない=別問題:入力モードが切り替わってもカーソル表示は Set Show Mouse Cursor が必要。症状を入力モードだけのせいにしない。

よくある質問

Q. Targetに何も繋がなくても動く場合があるのはなぜ?
そのノードを PlayerControllerブループリント自身の中で呼んでいる場合、Self が有効なPlayerControllerなので動きます。ActorやGameMode、Widgetなど別の場所で呼ぶとSelfがPlayerControllerでないため警告が出ます。確実を期すなら常に Get Player Controller(0)(Widgetなら Get Owning Player)をTargetに明示してください。

Q. BeginPlayに置いてもNullになります。
初期化順序やレベル遷移直後で、まだ完全にPlayerControllerが用意されていないケースがあります。Delay 0.0(1フレーム待機)Set Timer by Event で1フレーム後に再取得し、Is Valid を通してから実行すると安定します。

Q. UIを閉じてもゲーム操作が効きません。
UI表示時に Set Input Mode (UI Only) に切り替えたままになっている可能性があります。UIを閉じる処理で Set Input Mode (Game Only) を同じPlayerControllerに対して呼び、必要に応じて Set Show Mouse Cursor を false に戻してください。

Q. カスタムPlayerControllerだとこの警告が出やすい?
クラスがカスタムかどうかは原因ではありません。入力モード切り替えだけならキャスト不要で、基底のPlayer Controller型のままTargetに渡せます。キャストして失敗側(Null)を繋いでいないか、Targetに有効な参照が来ているかを確認してください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SetInputMode_UIOnlyは、'PlayerController'ターゲットとして有効なプレイヤーコントローラーを想定しています
  2. 無限ループが検出されました
  3. ~は表示されるブループリント(BlueprintReadOnlyまたはBlueprintReadWrite)ではありません。これは将来のリリースでエラーとなるため、マークアップを修正するかアクセスを停止してください。
  4. 古いHLODアクタを検出、HLODをリビルドする必要があります
  5. ブループリントランタイム エラー: "プロパティ ~ の読み取りを試行するためのアクセスはありません"
  6. 「AI Move To」が「Aborted」で失敗
  7. 「AI Move To」が「Blocked」で失敗

最近更新/作成されたページ