Unity技術資料: UIボタンクリック時に Input.GetMouseButtonDown を無効化する方法

本資料では、UnityにおいてUIボタンがクリックされた際に、ゲーム内でのマウス入力 (Input.GetMouseButtonDown) を無効化する方法について解説します。これにより、UIとゲーム内の入力処理を適切に分離し、ユーザー体験を向上させることが可能になります。

前提条件

  • Unityエディタの基本的な操作方法を理解していること
  • C#スクリプトの基本的な知識があること

方法概要

UIボタンがクリックされた際に、Input.GetMouseButtonDown の処理を無効化するために、以下の手順を実施します。

  1. InputManagerスクリプトの作成
  2. InputManagerスクリプトの配置
  3. 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("ゲーム内のクリックが検出されました。");
    }
}

コード説明

  • 名前空間のインポート
    • UnityEngineUnityEngine.EventSystems をインポートし、イベントシステムへのアクセスを可能にします。
  • Updateメソッド
    • 毎フレーム実行される Update メソッド内で、左クリック (Input.GetMouseButtonDown(0)) を検出します。
    • EventSystem.current.IsPointerOverGameObject() を使用して、マウスがUI上にあるかどうかを判定します。
      • UI上でない場合 (!EventSystem.current.IsPointerOverGameObject())、HandleGameInput メソッドを呼び出し、ゲーム内の入力処理を実行します。
      • UI上でクリックされた場合は、ログメッセージを出力し、入力を無視します。
  • HandleGameInputメソッド
    • ゲーム内でのマウスクリック時の具体的な処理を記述するメソッドです。ここに必要な処理を追加します。

2. InputManagerスクリプトの配置

作成した InputManager.cs スクリプトをUnityプロジェクト内に配置し、適切に設定します。

スクリプトの配置手順

  • スクリプトの保存
    • 上記のコードをコピーし、Unityのプロジェクトビュー内の適切なフォルダ(例: Scripts フォルダ)に InputManager.cs として保存します。
  • 空のGameObjectの作成
    • Hierarchyビューで右クリックし、Create Empty を選択して新しい空のGameObjectを作成します。
    • 作成したGameObjectに適切な名前を付けます。例: InputManager
  • スクリプトのアタッチ
    • 作成した空のGameObjectに、InputManager.cs スクリプトをドラッグ&ドロップしてアタッチします。

3. EventSystemの確認

EventSystem はUIイベントの管理に必要なコンポーネントです。以下の手順でシーン内に EventSystem が存在することを確認します。

EventSystemの存在確認手順

  • Hierarchyビューの確認
    • Hierarchyビュー内に EventSystem という名前のGameObjectが存在するか確認します。
  • 存在しない場合の追加
    • 存在しない場合は、Hierarchyビューで右クリックし、UI > Event System を選択して追加します。
  • EventSystemの確認
    • EventSystem GameObjectに EventSystem コンポーネントと StandaloneInputModule コンポーネントがアタッチされていることを確認します。

補足事項

  • 他のマウスボタンの場合
    • 右クリック(ボタン1)を無効化したい場合は、Input.GetMouseButtonDown(1) を使用してください。
  • タッチ入力への対応
    • モバイルデバイス向けにタッチ入力を無効化したい場合は、Input.touchCountInput.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.currentnull の場合

  • 症状
    • スクリプト実行時に EventSystem.currentnull となり、エラーが発生する。
  • 対処法
    • シーン内に EventSystem が存在することを確認してください。存在しない場合は、UI > Event System を追加します。

UIボタンが反応しない場合

  • 症状
    • UIボタンがクリックされても、意図した動作が実行されない。
  • 対処法
    • UIボタンが Canvas 上に正しく配置されていることを確認します。
    • ボタンに Button コンポーネントがアタッチされていることを確認します。
    • EventSystem が正しく設定されていることを確認します。

マルチタッチ環境での動作不良

  • 症状
    • タッチ入力時に意図しない動作が発生する。
  • 対処法
    • タッチ入力用の処理を追加し、マルチタッチ環境でも適切に入力を制御できるようにスクリプトを拡張します。

まとめ

本資料では、UnityにおいてUIボタンがクリックされた際に Input.GetMouseButtonDown を無効化する方法を解説しました。EventSystem.current.IsPointerOverGameObject() を活用することで、UI上の入力とゲーム内の入力を効果的に分離することが可能です。プロジェクトの要件に応じて、さらなるカスタマイズを施すことで、より高度な入力制御が実現できます。

Unity

Posted by hidepon