【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を使い分けたい。
スポンサーリンク

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);
    }
}

思い通りのゲームが作れない

Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。

しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。

トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能

UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。

容量不足を解消

Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。

価格耐久性静音性読み書きサイズ
HDD
SSD

注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。

  • 据え置きHDD
  • 外付けSDD
  • 内蔵SSD

ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。

解説

名前空間

「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)」とする必要があります。

タイトルとURLをコピーしました