【Unity】UIと画面クリック判定を区別、UIの処理無効にする

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

UI上でクリックしても、同時に画面クリックを判定しない。

Input.GetMouseButton」は、マウスクリックを行うと処理が行われるメソッドです。
例えば、マウスを左クリックすると、変数iの値を増加させる(インクリメント)。
このような処理を行うには、次のようにプログラムします。

if (Input.GetMouseButtonDown(0))
{
    i++;
}

一方で、UIボタンを押すと、変数iの値を減少させる(デクリメント)には、メソッドを使用します。

public void downScore()
{
    i--;
}

UIボタンは左クリックするので、2つのプログラムは同時に処理されてしまい、
変数iの値を増加・減少が同時に起こってしまいます。

「Input.GetMouseButtonDown()」は画面押下で、会話文を進めるときに使用して、
UIボタンは、メニュー画面を選択で使用するように、2つとも使用されることはよくあります。

Input.GetMouseButtonを解説しています。

本記事では、画面とUIボタンのクリック判定を別々にするコードを紹介します。

本記事は次の人におすすめ
  • UIボタンをクリックしても画面クリックが反応しない方法を知りたい。
  • Input.GetMouseButtonとUIを使い分けたい。
Udemyで学習する
スポンサーリンク

EventSystem.current.IsPointerOverGameObject()

EventSystem.current.IsPointerOverGameObject()」は、ゲーム内のUI(ユーザーインターフェース)にポインタ(マウスやタッチ)が重なっているかどうかを確認します。

UIボタンと画面クリックの見極めは、UIとマウスポイントが重なっていると、処理を実行しないようにします。

要するに、UI上をクリックしていると、処理をキャンセルするコードです。
ポインタ・タッチはスマホやタブレットでタッチスクリーンを使う場合はコードが少し異なります。

本メソッドを使うには、名前空間に「using UnityEngine.EventSystems;」を追加しなければエラーが発生するので、注意してください。

「EventSystem.current.IsPointerOverGameObject()」は「EventSystem.current」と「IsPointerOverGameObject()」に分けることができます。

EventSystem.current

EventSystem.current は、Unityのイベントシステムの現在のインスタンスを表します。
UIや入力などのイベントを処理するための仕組みがあり、その中核となるのがイベントシステムです。

情報をキャプチャし、適切なオブジェクトにそれらの情報を伝達します。
これにより、ユーザーの操作に応じてゲーム内の動作を制御することができます。

IsPointerOverGameObject()

現在のポインタがUI要素上にあるかどうかを判定するメソッドです。
もしポインタがUI要素上にある場合、このメソッドはtrueを返します。
UI要素全般なので、ボタン、テキストフィールド、パネルなども対象です。

指定されたポインター(通常はマウスカーソルやタッチ)が現在のフレームでどのGameObjectの上にあるかを判定します。
主に、UI要素上にポインターがあるかどうかをチェックするために使用されます。

if (EventSystem.current.IsPointerOverGameObject())  return;    //マウス入力

スマホ向けのゲームの場合はマウス入力では正常に処理されません。
UI上の入力しても画面クリックが判定されてしまうので、コードの加筆修正が必要です。

if(EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))  //スマホ入力

処理の一例

ここで、「EventSystem.current.IsPointerOverGameObject()」を使った簡単な処理を紹介します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class NewBehaviourScript : MonoBehaviour
{
    void Update()
    {
        // マウスカーソルがUI上にあるか確認します。
        if (EventSystem.current.IsPointerOverGameObject())
        {
            Debug.Log("The mouse cursor is over a UI element.");
        }
    }
}

マウスカーソルがUI上にある場合はconsoleウィンドウで処理が実行されます。

画面上に、UIテキストとUIボタンを追加して、スクリプトをアタッチして、再生ボタンを押します。

UIボタンを押しても画面が反応せずに、処理を実行する

「EventSystem.current.IsPointerOverGameObject()」を使用して、
目標であるUIボタンをクリックしても画面クリックが反応しない処理をします。

ソースコード

using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;   //追加(UI上の動作稼働)

public class count : MonoBehaviour
{
    public TextMeshProUGUI countText; // UIテキストオブジェクト
    int i = 0; // カウンターの初期値

    void Start()
    {

        UpdateCountText();
    }

    void Update()
    {
        //ボタンを押したときは画面クリック無効
        if (EventSystem.current.IsPointerOverGameObject()) return;

        if (Input.GetMouseButtonDown(0)) // マウスの左ボタンが押された場合
        {
            i++; // iをインクリメント
            UpdateCountText();
        }
    }

    // UIボタンが押されたときに呼び出される関数
    public void DecrementCount()
    {
        i--; // iをデクリメント
        UpdateCountText();
    }


    // カウントを表示するテキストを更新する関数
    void UpdateCountText()
    {
        countText.text = i.ToString();
        Debug.Log("Count:" + i);
    }
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/



解説

名前空間

「using TMPro」は、TextMeshProUGUIクラスを使用するために必要な名前空間です。
TextMeshProUGUIは、UIテキストを操作する際に必要なクラスが含まれています。

TextMeshProUGUIの使い方を紹介しています。
  • フィールド(メンバ変数)

「countText」:UI上でカウントを表示するテキストオブジェクトを参照するための変数です。
この変数は、TextMeshProUGUI型であり、UI上のテキストを更新する際に使用されます。
「i」:カウンターの値を保持するための変数です。
ユーザーのアクションによりカウントの値が変化します。

  • Startメソッド

UpdateCountTextメソッドが呼び出され、初期状態でUI上にカウントが表示されます。

  • Updateメソッド

UI上のボタンがクリックされたかどうかを確認し、クリックされた場合はカウンターをインクリメントし、UpdateCountTextメソッドを呼び出してUI上の表示を更新します。
UI上のボタンがクリックされていない場合は、画面上でのクリックを無効にします。

  • DecrementCountメソッド

UI上のボタンが押されたときに呼び出される公開されたメソッドです。
カウンターの値をデクリメントし、UpdateCountTextメソッドを呼び出してUI上の表示を更新します。

  • UpdateCountTextメソッド

UI上のテキストを更新するためのメソッドです。
現在のカウンターの値を文字列に変換し、UIテキストオブジェクトのtextプロパティに代入します。
また、デバッグログも出力され、カウンターの値が更新されたことが確認できます。

変数を文字列に変える方法を紹介しています。

実演

Hierarchyウィンドウにスクリプトをアタッチして、数値を示すテキストを追加します。
また、UIボタンのOnClickにDecrementCount()メソッドを付加します。

再生ボタンを押すと、冒頭のように画面クリックができるようになります。

まとめ

今回は、ボタンクリックで画面クリック判定しない方法を紹介しました。

UI上の処理をTrueにするには「EventSystem.current.IsPointerOverGameObject()」を使います。ただし、名前空間に「using UnityEngine.EventSystems;」を入れないとエラーが発生するので、注意が必要です。

スマホやタブレットでのゲームを開発する場合は、「EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)」とする必要があります。

Udemyで学習する

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました