【Unity】UIボタンがクリックされた時、マウスのクリック検出をしないようにしたい

マウスのクリック処理(Input.GetMouse関連など)を実装しているとき、UIのボタンイベントを登録しても両方の処理がなされるのを防ぎます
本来、ボタンを押下したときは、マウスの処理はしたくないケースが多いと思いますので、それについての対処を考えていきます

シーンの構成

空のゲームオブジェクトを1つ追加します
MouseClickScriptスクリプトをアタッチします

using UnityEngine;

public class MouseClickScript : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("マウスwoクリック");
        }
    }

    public void ButtonClick()
    {
        Debug.Log("ボタンをクリック");
    }
}

UIボタンを1つ追加します
ボタンのクリックイベントに、GameObjectのオブジェクトにアタッチされているMouseClickScriptスクリプトを登録します

実行結果(想定していない動作)

ボタンをクリックしたにも関わらず、予期しないマウスクリックが取得されているのがわかります

対処

コンポーネントを使う

次のスクリプトは、CanMouseClickプロパティを1つ追加したものです
falseの場合は、すぐにリターンして以降のコードを実行しないようにしています

このスクリプトの他から、このプロパティを操作することによってマウスの操作の有効無効が設定できそうです

using UnityEngine;

public class MouseClickScript : MonoBehaviour
{
    public bool CanMouseClick { get; set; } = true;

    void Update()
    {
        if (!CanMouseClick)
        {
            return;
        }

        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("マウスをクリック");
        }
    }

    // ボタンのクリックイベントハンドラ
    public void ButtonClick()
    {
        Debug.Log("ボタンをクリック");
    }
}

ボタンに対してポインターのイベントトリガーを追加する

実行結果

ボタンのクリック時は、マウスクリックが発生しないような動作になりますね

スクリプトで実装

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ButtonHoverEvent : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    [SerializeField]
    private Button button;

    [SerializeField]
    MouseClickScript MouseClickScript;

    public void OnPointerEnter(PointerEventData eventData)
    {
        // ボタンにマウスが入った時の処理
        MouseClickScript.CanMouseClick = false;
        Debug.Log("ボタンに触れている");
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        // ボタンからマウスが出た時の処理
        MouseClickScript.CanMouseClick = true;
        Debug.Log("ボタンに触れていない");
    }
}

ButtonHoverEventクラスはMonoBehaviourを継承し、IPointerEnterHandlerIPointerExitHandlerのインターフェースを実装しています。これにより、ボタンにマウスが入った時とボタンからマウスが出た時のイベントを処理できるようになります。

クラス内にはいくつかのフィールドがあります。private Button buttonは、このスクリプトがアタッチされたオブジェクトに関連付けられたボタンを参照します。また、MouseClickScript MouseClickScriptは、別のスクリプトへの参照です。

OnPointerEnterメソッドは、ボタンにマウスが入った時に呼び出されます。このメソッド内では、MouseClickScriptスクリプトのCanMouseClick変数をfalseに設定し、デバッグログを出力しています。

OnPointerExitメソッドは、ボタンからマウスが出た時に呼び出されます。このメソッド内では、MouseClickScriptスクリプトのCanMouseClick変数をtrueに設定し、デバッグログを出力しています。

このスクリプトの役割は、ボタンにマウスが入った時に別のスクリプトの変数を変更し、ボタンからマウスが出た時に元の状態に戻すことです。具体的な処理はMouseClickScriptスクリプトに依存しており、ボタンのホバーイベントに応じた動作を実装するために使用されることが想定されています。

実行結果

Unity

Posted by hidepon