【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 専用アセットを作る

  1. Project ウィンドウで InputSystem_Actions(新規プロジェクトで生成されるもの)を右クリック
  2. Duplicate(複製)
  3. GamePlayerActions などにリネーム

Step 2:Player 用に必要ないものを削除

複製した GamePlayerActions を開き、Player の動きに必要な ActionMap だけ残す

例:

GamePlayerActions
 └ Player
     ├ Move
     ├ Jump
     └ 必要な操作のみ

UI / Navigate / Submit / Cancel など UI 用の ActionMap が入っていれば削除。


Step 3:PlayerInput に Player 専用アセットを割り当てる

  1. Player を選択
  2. PlayerInput コンポーネントの Actions にGamePlayerActions をセット
  3. 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 の入力が壊れなくなります。

訪問数 4 回, 今日の訪問数 4回