UI上でクリックしても、同時に画面クリックを判定しない。
「Input.GetMouseButton」は、マウスクリックを行うと処理が行われるメソッドです。
例えば、マウスを左クリックすると、変数iの値を増加させる(インクリメント)。
このような処理を行うには、次のようにプログラムします。
if (Input.GetMouseButtonDown(0))
{
i++;
}
一方で、UIボタンを押すと、変数iの値を減少させる(デクリメント)には、メソッドを使用します。
public void downScore()
{
i--;
}
UIボタンは左クリックするので、2つのプログラムは同時に処理されてしまい、
変数iの値を増加・減少が同時に起こってしまいます。
「Input.GetMouseButtonDown()」は画面押下で、会話文を進めるときに使用して、
UIボタンは、メニュー画面を選択で使用するように、2つとも使用されることはよくあります。
本記事では、画面と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 は、Unityのイベントシステムの現在のインスタンスを表します。
UIや入力などのイベントを処理するための仕組みがあり、その中核となるのがイベントシステムです。
情報をキャプチャし、適切なオブジェクトにそれらの情報を伝達します。
これにより、ユーザーの操作に応じてゲーム内の動作を制御することができます。
現在のポインタが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 C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
・名前空間
「using TMPro」は、TextMeshProUGUIクラスを使用するために必要な名前空間です。
TextMeshProUGUIは、UIテキストを操作する際に必要なクラスが含まれています。
- フィールド(メンバ変数)
「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)」とする必要があります。