UIの見えないパネルでクリックやタップを検出する #Unity

こんにちは。ヤマヤタケシです。

とべ!東北きりたん」を作っています。
入力をちょっと工夫したので公開します。
UnityのUIで見えないパネルをおいて、そいつでマウスのDown, Up を検出しました。
Input.GetMouseButton(0); で検出してきりたんを操作させていたのですが、UIを操作したときにも反応しちゃうのを防ぐために作りました。
結構、戸惑ったのでまとめます。
他のやり方もあるかもしれません。

— 作業メモ —-

ステージが増えても良いようにスクロールビューを導入した。
スクロールバーをうごかすと、きりたんも反応してイラッとした。
期待と違う反応ってイヤだね。
ということで、判定を Input から取るのではなく、操作用の見えないパネルに当たったかどうかでやることにした。
まあ、これによってあちこちで面倒になる気もするが・・・。
前後関係をちゃんとしないとなぁ。。。
RaycastTargetから色々外すとか。
どのタイミングで判定してんだろ。。。
Update前かな・・・。
透明度0にしてみたが、処理的に無駄がある気がする。まあ、それは良いか。

・やりたいこと
見えないパネルでマウスのOn,Offを検出したい。
見えないパネルの上に他のUIがあったらもちろん反応させない。

・実装
IPointerDownHandler と IPointerUpHandler を使う。
上のものにヒットしたときも呼ばれるので自分かどうかのチェックをする。

・Bの部分だけがOn, Offするか?テスト
Aはなにもないので反応しない。 -> OK
BはDown, Up をとれる。 -> OK
Cもメソッドが呼ばれるが自分じゃないときは無視する。 -> OK

・コード

// 入力判定用の見えないパネル
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class PanelInput
    : MonoBehaviour
    , IPointerDownHandler
    , IPointerUpHandler
{
    void Update()
    {
        Position = Input.mousePosition;
    }

    public bool On { get; private set; }
    public Vector3 Position { get; private set; }

    [SerializeField]
    Image panel;

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Down");
        var isMine = eventData.pointerCurrentRaycast.gameObject == gameObject;
        if (isMine)
        {
            On = true;
        }

    }
    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("Up");
        var isMine = eventData.pointerCurrentRaycast.gameObject == gameObject;
        if (isMine)
        {
            On = false;
        }
    }

    void OnGUI()
    {
        GUILayout.Label(string.Format("On {0}", On));
    }
}

そんじゃまた。

コメントを残す