かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

自分用Unityメモ:タップした場所がuGUI上か調べる

タップやスワイプ、ドラッグをした時に何か動作をさせたい、
でも押した場所にボタンとかがあったら反応して欲しくない、
そんな感じの時に使うメソッド。

 ※ちょっと修正。
そもそもEventSystemが置かれてないときの処理を追加しました。

using UnityEngine.EventSystems;
//↑この名前空間を使うよ、と言っておく。


    //タップした先にあるものを入れるリスト。
    // 今回はコストが気になるのでフィールドにするよ
    // あんまり頻繁に判定しないならメソッドの中に入れてもいいよ
    private List<RaycastResult> raycastResults = new List<RaycastResult>();

    public bool IsPointerOnUGUI(Vector2 screenPosition)
    {
        // EventSystemがない = uGUIがないときは遮るものがないので処理そのものをさせないよ
    if (EventSystem.current == null) { return false; }

        // EventSystemにタップした座標を設定するよ
        PointerEventData eventDataCurrent = new PointerEventData(EventSystem.current);
        eventDataCurrent.position = screenPosition;

        // タップ地点の先にあるものを調べるためにRayCastするよ
        EventSystem.current.RaycastAll(eventDataCurrent, raycastResults);
        bool result = raycastResults.Count > 0;

        raycastResults.Clear(); //リセットしておくよ
        return result;
    }

引数には タップの時はInput.GetTouch(0).position、
マウスの操作の時は Input.mousePosition を入れればOK...のハズ。

Textなど、タップを遮らなくていいUIは Raycast Targetのチェックを外しておけば大丈夫。


シングルトンやstaticなメソッドにしておいてどこからでも呼べると便利かもしれません。