おもちゃラボ

Unityで遊びを作っていきます

【Unity】ボタンを押したときに画面クリックは無視する

GetMouseButtonDownメソッドを使ってマウスの入力を取得していると、uGUIのボタンを押したときにも画面クリックを検出してしまいます。

f:id:nn_hokuson:20170712215201g:plain:w450

ボタンがタッチされたときは、画面のタッチは無視する

これでも良い場合もありますが、普通は画面のクリックとボタンのクリックは分離したいですよね〜。
そんなときはEventSystemのIsPointerOverGameObjectメソッドを使います。このメソッドは、ボタンがクリックされたときにだけ反応するので、簡単に画面クリックを無視することが出来ます。

スクリプトは次のようになります。

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

public class TouchController : MonoBehaviour 
{
    void Update () {
        if(EventSystem.current.IsPointerOverGameObject()){
            return;
        }

        if (Input.GetMouseButtonDown (0)){
            
        }
    }
}

GetMouseButtonDownで画面タッチされたことを検知する前に、ボタンのクリックをチェックして、ボタンがクリックされているときにはreturnしています。

Unityエディタで実行すると、ちゃんと動作していることが確認できます。

f:id:nn_hokuson:20170712215427g:plain:w450

この方法はテラシュールブログさんでも紹介されていたのですが、スマートフォンで実行するとなぜか画面のクリックまで検出・・・

tsubakit1.hateblo.jp

スマートフォン対応する

そこで、EventSystemを使ってボタンクリックを検出する部分を次のように修正しました。

#if UNITY_EDITOR
    if(EventSystem.current.IsPointerOverGameObject()){
        return;
    }
#else 
    if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
        return;
    }
#endif

エディタで実行しているか、スマートフォンで実行しているかはマクロで分けています。スマートフォンの場合はIsPointerOverGameObjectメソッドの引数にフィンガーIDを渡している部分だけが異なります。

これを実行してみるとうまくいきましたー!