【Unity 6】UI Toolkit のボタンを触るとプレイヤーが動かなくなる問題
― Input System と UI を同一シーンで共存させる際の根本原因と、正しい解決方法 ―
Unity 6 の UI Toolkit と Input System を同じシーンで使用すると、UI ボタンをクリックした直後、プレイヤーが突然動かなくなるという現象が発生することがあります。
この問題は、一見すると「シーン切り替え」や「UI 操作のタイミング」に関連しているように見えますが、本質はまったく別のところにあります。
この記事では、単一シーン内に “プレイヤー(Input System)” と “UI Toolkit” を同居させた場合でも起こる入力停止問題の原因と、Unity 6 で最も安全で確実な解決方法を解説します。
1. 最小構成で起こる現象
同じシーンに以下を配置します。
- Player
- PlayerInput(Move / Jump を使用)
- CharacterController(または Rigidbody)
- 移動スクリプト
- UI(UI Toolkit)
- UIDocument
- ボタン(例:RetryButton)
このシンプルな構成でも、UI Toolkit のボタンをクリックした瞬間、プレイヤーの Move / Jump が無効になり移動できなくなるという症状が発生します。
2. 原因:UI と Player が同じ InputActionAsset を共有している
Unity 6 の UI Toolkit は、UI イベント処理のために UI ActionMap(Navigate / Submit / Cancel 等) を内部で使用します。
このとき、UI は必要に応じて UI ActionMap を
- Enable
- Disable
- デバイス優先度の変更
などを自動的に行います。
もし PlayerInput が UI と 同じ InputActionAsset を参照している場合:
- Move や Jump を含む PlayerActionMap も同じアセット内にある
- UI がアクションを触ると Player 側にも影響する
- 結果としてプレイヤーの入力アクションが Disable のままになる
→ これが「UI を触ったあとはプレイヤーが動かない」現象の正体です。
ポイントは、
- シーン切り替えは関係ない
- UI Toolkit の内部処理のために起こる
- 同じアセットを共有していることが問題の本質
ということです。
3. 正しい解決方法(Unity 6 で最も安全で確実)
Player 用と UI 用の InputActionAsset を 完全に分離する
これが Unity 6 で確実に動作させる唯一の正攻法です。
4. 実際の作業手順(最短・3分でできる)
Step 1:Player 専用アセットを作る
- Project ウィンドウで InputSystem_Actions(新規プロジェクトで生成されるもの)を右クリック
- Duplicate(複製)
- GamePlayerActions などにリネーム
Step 2:Player 用に必要ないものを削除
複製した GamePlayerActions を開き、Player の動きに必要な ActionMap だけ残す。
例:
GamePlayerActions
└ Player
├ Move
├ Jump
└ 必要な操作のみ
UI / Navigate / Submit / Cancel など UI 用の ActionMap が入っていれば削除。
Step 3:PlayerInput に Player 専用アセットを割り当てる
- Player を選択
- PlayerInput コンポーネントの Actions にGamePlayerActions をセット
- Default Map を Player にする
これで PlayerInput は UI が触るアセットと完全に分離されます。
Step 4:UI はデフォルトの UI アクションをそのまま使わせる
Unity 6 では PanelSettings に InputAction を指定する欄は存在しません。
UI Toolkit は内部処理として UI ActionMap を自動的に使用します。
つまり:
- PlayerInput → GamePlayerActions(プレイヤー専用)
- UI Toolkit → Unity の UI ActionMap(内部で処理)
この状態が理想的な独立構成です。
5. プレイヤー側スクリプト(例)
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
CharacterController cc;
InputAction move;
InputAction jump;
void Start()
{
cc = GetComponent<CharacterController>();
var input = GetComponent<PlayerInput>();
move = input.actions.FindAction("Move");
jump = input.actions.FindAction("Jump");
}
void Update()
{
var v = move.ReadValue<Vector2>();
var dir = new Vector3(v.x, 0, v.y) * 5f;
if (jump.WasPressedThisFrame())
dir.y = 5f;
cc.Move(dir * Time.deltaTime);
}
}
6. まとめ
- UI Toolkit は UI ActionMap を内部で利用する
- そのアクションを PlayerInput と 共有すると UI 操作が Player の Move / Jump まで無効にする
- シーン切り替えは関係なく、同一シーンでも発生
- 解決策は Player 用アクションアセットの完全分離
この構成にしておけば、UI Toolkit とプレイヤーの入力は完全に独立し、どんな UI 操作をしても Player の入力が壊れなくなります。


ディスカッション
コメント一覧
まだ、コメントがありません