自分用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なメソッドにしておいてどこからでも呼べると便利かもしれません。