Unity技術資料: UIボタンクリック時に Input.GetMouseButtonDown を無効化する方法
本資料では、UnityにおいてUIボタンがクリックされた際に、ゲーム内でのマウス入力 (Input.GetMouseButtonDown) を無効化する方法について解説します。これにより、UIとゲーム内の入力処理を適切に分離し、ユーザー体験を向上させることが可能になります。
前提条件
- Unityエディタの基本的な操作方法を理解していること
 - C#スクリプトの基本的な知識があること
 
方法概要
UIボタンがクリックされた際に、Input.GetMouseButtonDown の処理を無効化するために、以下の手順を実施します。
- InputManagerスクリプトの作成
 - InputManagerスクリプトの配置
 - EventSystemの確認
 
手順詳細
1. InputManagerスクリプトの作成
以下のコードを使用して、InputManager.cs という名前のC#スクリプトを作成します。このスクリプトは、マウスクリックがUI上で行われているかを判定し、UI上でのクリック時にはゲーム内のマウス入力処理を無効化します。
using UnityEngine;
using UnityEngine.EventSystems;
public class InputManager : MonoBehaviour
{
    void Update()
    {
        // 左クリックを検出
        if (Input.GetMouseButtonDown(0))
        {
            // マウスがUI上にあるかどうかをチェック
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                // UI上でない場合の処理
                HandleGameInput();
            }
            else
            {
                // UI上のクリックなので無視
                Debug.Log("UIがクリックされました。");
            }
        }
    }
    // ゲーム内での入力処理
    void HandleGameInput()
    {
        // ここにゲーム内でのマウスクリック時の処理を記述
        Debug.Log("ゲーム内のクリックが検出されました。");
    }
}
コード説明
- 名前空間のインポート
UnityEngineとUnityEngine.EventSystemsをインポートし、イベントシステムへのアクセスを可能にします。
 - Updateメソッド
- 毎フレーム実行される 
Updateメソッド内で、左クリック (Input.GetMouseButtonDown(0)) を検出します。 EventSystem.current.IsPointerOverGameObject()を使用して、マウスがUI上にあるかどうかを判定します。- UI上でない場合 (
!EventSystem.current.IsPointerOverGameObject())、HandleGameInputメソッドを呼び出し、ゲーム内の入力処理を実行します。 - UI上でクリックされた場合は、ログメッセージを出力し、入力を無視します。
 
- UI上でない場合 (
 
 - 毎フレーム実行される 
 - HandleGameInputメソッド
- ゲーム内でのマウスクリック時の具体的な処理を記述するメソッドです。ここに必要な処理を追加します。
 
 
2. InputManagerスクリプトの配置
作成した InputManager.cs スクリプトをUnityプロジェクト内に配置し、適切に設定します。
スクリプトの配置手順
- スクリプトの保存
- 上記のコードをコピーし、Unityのプロジェクトビュー内の適切なフォルダ(例: 
Scriptsフォルダ)にInputManager.csとして保存します。 
 - 上記のコードをコピーし、Unityのプロジェクトビュー内の適切なフォルダ(例: 
 
- 空のGameObjectの作成
- Hierarchyビューで右クリックし、
Create Emptyを選択して新しい空のGameObjectを作成します。 - 作成したGameObjectに適切な名前を付けます。例: 
InputManager 
 - Hierarchyビューで右クリックし、
 
- スクリプトのアタッチ
- 作成した空のGameObjectに、
InputManager.csスクリプトをドラッグ&ドロップしてアタッチします。 
 - 作成した空のGameObjectに、
 
3. EventSystemの確認
EventSystem はUIイベントの管理に必要なコンポーネントです。以下の手順でシーン内に EventSystem が存在することを確認します。
EventSystemの存在確認手順
- Hierarchyビューの確認
- Hierarchyビュー内に 
EventSystemという名前のGameObjectが存在するか確認します。 
 - Hierarchyビュー内に 
 
- 存在しない場合の追加
- 存在しない場合は、Hierarchyビューで右クリックし、
UI>Event Systemを選択して追加します。 
 - 存在しない場合は、Hierarchyビューで右クリックし、
 
- EventSystemの確認
EventSystemGameObjectにEventSystemコンポーネントとStandaloneInputModuleコンポーネントがアタッチされていることを確認します。
 
補足事項
- 他のマウスボタンの場合
- 右クリック(ボタン1)を無効化したい場合は、
Input.GetMouseButtonDown(1)を使用してください。 
 - 右クリック(ボタン1)を無効化したい場合は、
 - タッチ入力への対応
- モバイルデバイス向けにタッチ入力を無効化したい場合は、
Input.touchCountやInput.GetTouchを使用して同様のチェックを追加できます。 
 - モバイルデバイス向けにタッチ入力を無効化したい場合は、
 - パフォーマンス最適化
Updateメソッド内で毎フレームIsPointerOverGameObjectを呼び出すことは、パフォーマンスに影響を与える可能性があります。必要に応じて、入力処理の頻度を調整してください。
 
実装例
以下は、具体的な実装例です。ゲーム内でクリックされた際にオブジェクトを選択する処理を追加しています。
using UnityEngine;
using UnityEngine.EventSystems;
public class InputManager : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                HandleGameInput();
            }
            else
            {
                Debug.Log("UIがクリックされました。");
            }
        }
    }
    void HandleGameInput()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            // クリックされたオブジェクトに対する処理
            Debug.Log($"オブジェクト {hit.collider.name} がクリックされました。");
        }
        else
        {
            Debug.Log("何もクリックされていません。");
        }
    }
}
実装例の説明
- Raycastの使用
HandleGameInputメソッド内で、カメラからクリック位置に向けてRayを飛ばし、オブジェクトがクリックされたかどうかを判定しています。- クリックされたオブジェクトが存在する場合、その名前をログに出力します。
 
 
トラブルシューティング
EventSystem.current が null の場合
- 症状
- スクリプト実行時に 
EventSystem.currentがnullとなり、エラーが発生する。 
 - スクリプト実行時に 
 - 対処法
- シーン内に 
EventSystemが存在することを確認してください。存在しない場合は、UI>Event Systemを追加します。 
 - シーン内に 
 
UIボタンが反応しない場合
- 症状
- UIボタンがクリックされても、意図した動作が実行されない。
 
 - 対処法
- UIボタンが 
Canvas上に正しく配置されていることを確認します。 - ボタンに 
Buttonコンポーネントがアタッチされていることを確認します。 EventSystemが正しく設定されていることを確認します。
 - UIボタンが 
 
マルチタッチ環境での動作不良
- 症状
- タッチ入力時に意図しない動作が発生する。
 
 - 対処法
- タッチ入力用の処理を追加し、マルチタッチ環境でも適切に入力を制御できるようにスクリプトを拡張します。
 
 
まとめ
本資料では、UnityにおいてUIボタンがクリックされた際に Input.GetMouseButtonDown を無効化する方法を解説しました。EventSystem.current.IsPointerOverGameObject() を活用することで、UI上の入力とゲーム内の入力を効果的に分離することが可能です。プロジェクトの要件に応じて、さらなるカスタマイズを施すことで、より高度な入力制御が実現できます。





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