押せない範囲から、入力経路を絞る
画面全体のボタンが反応しない場合はEventSystemや入力モジュール、特定のボタンだけなら前面のUIや親のCanvasGroupを先に調べます。ホバーや押下表示は変わるのに処理だけ動かない場合は、On Clickの登録先を確認します。この記事はUnity 2022.3 LTSのuGUIを対象とし、Input Systemを使う説明は1.6系を基準にしています。
1. EventSystemと入力方式を確認する
- 通常の単一プレイヤーUIでは、有効なEventSystemと使用する入力モジュールを1組に整理します。シーン追加読み込みやDontDestroyOnLoadによって、意図しないEventSystemが増えていないか確認します。
- 旧Input Managerを使うStandaloneInputModuleと、新Input Systemを使うInputSystemUIInputModuleのどちらを利用しているか確認します。プロジェクトのActive Input Handlingと、実際に使う入力方式が合っているか調べます。
- InputSystemUIInputModuleでは、Actions AssetとPoint・Left Clickなどの割り当てを確認します。移動やゲーム操作のActionが動くことだけでは、UI用Actionの設定が正しいとは判断できません。
複数プレイヤーでEventSystemを分ける設計は別条件です。原因を調べず、すべてのシーンにEventSystemを追加する手順にはしないでください。
2. Canvasとボタンの入力対象を確認する
対象CanvasのGraphicRaycasterが有効か確認します。ButtonのImageなど、ポインターを受けるGraphicを少なくとも1つRaycast Targetにします。装飾の文字は対象から外せますが、ボタン内の全Graphicを一括で外すとポインターが届かなくなる場合があります。
Screen Space - CameraやWorld Spaceでは、Canvasのカメラ参照、表示先、GraphicRaycasterの遮蔽物設定と向きを確認します。UIへPhysicsRaycasterを追加するだけで解決すると考えず、Canvas内のGraphicを調べる経路を確認します。
3. 透明な前面パネルを調べる
通常のImageは、透明な色でもRaycast Targetが有効なら背後のUIを遮る候補になります。フェードアウト後の全画面パネルやローディング画面を一時的に無効にし、同じ位置のボタンを試します。消すと反応するなら、そのパネルの入力設定と表示・非表示時の切り替えを調べます。
CanvasGroupのAlpha、Interactable、Blocks Raycastsは別の役割です。Alphaを0にするだけでは入力透過の設定になりません。入力を通したい装飾パネルではRaycast Targetを外すか、適切な範囲のCanvasGroupでBlocks Raycastsを無効にします。ボタン自身や必要な親まで入力対象から外さないようにしてください。
4. 操作可否とOn Clickを分けて確認する
ButtonのInteractableと親CanvasGroupのInteractable、Blocks Raycasts、Ignore Parent Groupsを確認します。ボタンの押下表示が変わる場合は、On Clickに登録されたオブジェクト、関数、参照切れ、Consoleの例外を調べます。
Buttonのクリック処理は、押してからボタン内で離す操作で確認します。押下後に外へドラッグして離す操作と、単に押し始めた瞬間は区別してください。調査中は既存の処理の入口に一時ログを入れ、イベント未到達なのか、呼ばれた先の処理の問題なのかを分けます。
修正後の確認
- メニューを開く・閉じる・再表示するたびに操作できるか確認する。
- フェード中に意図した入力制限が働き、完了後に正しく解除されるか確認する。
- マウスと対象端末のタッチで、押して離す操作・スクロール・ドラッグを確認する。
- 一時的に無効にしたパネルやログを戻し、必要なモーダル画面が背後への入力を防げるか確認する。
全画面の入力透過を一律に有効にすると、確認ダイアログの背後まで押せることがあります。装飾、操作可能な領域、入力を止めるモーダルの役割に合わせて設定します。