UnityにおけるUIオブジェクト選択判定の実装ガイド

2025年4月10日

この資料では、UnityでUIオブジェクトのクリック操作とゲーム内オブジェクトの操作が干渉しないように制御する方法を詳しく解説します。特に、UIが操作中の場合に不要な入力イベントを抑制する実装例を紹介します。


1. 背景

Unityプロジェクトにおいて、マウスクリックなどの入力イベントを利用してゲーム内のオブジェクト操作(例:Rayによる対象物取得や攻撃処理など)を実行する場合、UIの操作と重なってしまうと予期しない挙動が発生することがあります。
例えば、ポーズ画面やメニュー画面上のUIボタンがクリックされた際に、裏側のゲームオブジェクトに対しても入力イベントが伝播してしまうと、意図しないオブジェクトの移動や攻撃が行われる恐れがあります。

これを防ぐために、ポインターがUI要素上にあるかどうかを判定し、UI操作中はゲーム内の入力処理を無効化する方法が有効です。


2. 必要なusingディレクティブ

UIの判定に必要なクラスを利用するため、以下の名前空間をインポートしてください。

using UnityEngine.EventSystems;

3. UI操作の判定方法

Unityでは、EventSystemクラスのメソッド IsPointerOverGameObject() を利用して、現在のポインターがUIオブジェクト上にあるかどうかを確認できます。

  • true を返す場合:ポインターはUIオブジェクト上に存在する
  • false を返す場合:ポインターはUIオブジェクト上に存在しない

この判定を利用して、UI上での操作が行われている場合にはゲーム内の入力処理を中断することができます。


4. 実装例

4.1 UI以外のクリック時にのみ処理を実行する例

下記のコードは、Updateメソッド内で「Fire1」(通常は左クリック)の入力を検出し、ポインターがUIオブジェクト上にない場合にのみ処理を実行する例です。

void Update()
{
    // マウスクリックがUI要素上でない場合にのみ反応する
    if (Input.GetButtonDown("Fire1") && !EventSystem.current.IsPointerOverGameObject())
    {
        // UI以外をクリックしたときに実行したい処理
        Debug.Log("ゲーム内の操作処理を実行");
    }
}

4.2 Rayを用いたオブジェクト取得との併用例

ワールド座標上のオブジェクトをRayキャストを利用して取得する場合も、最初にUI上のクリックであるかをチェックし、UI上なら処理を中断することで、不要な入力イベントを無視できます。

void Update()
{
    // UIが選択中の場合は処理を中断
    if (EventSystem.current.IsPointerOverGameObject())
    {
        return;
    }

    // UI上でない場合、左クリックが押されたときにRayを発射
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            // Rayがヒットしたオブジェクトに対する処理を記述
            Debug.Log("ヒットしたオブジェクト: " + hit.collider.name);
        }
    }
}

5. まとめ

  • UI操作の分離: UIオブジェクトのクリックとゲーム内操作が重ならないように、入力イベントの判定が必要です。
  • メソッドの活用: EventSystem.current.IsPointerOverGameObject() により、現在のポインターがUI上にあるかを判定して、不要な入力処理をスキップします。
  • 実装例: UI以外のクリック時のみ、指定の処理(例:Rayキャストによるオブジェクト検出)を実行することで、ポーズ画面等での誤操作を防止できます。

この実装ガイドを参考にして、UI操作とゲーム内の操作が競合しないよう、安全かつ効果的な入力制御を実現してください。

Unity

Posted by hidepon