ドラッグ座標を取得する方法
IDragHandler を使ってドラッグしたときに座標を取得できるようになる
(Canvas以下のコンポーネントに追加されている時)
using UnityEngine.EventSystems;
public class MyUI : MonoBehaviour , IDragHandler {}
CanvasのRenderModeが 「ScreenSpace – Overlay」の時
以下のようにするだけでカーソル位置に追従してくれる
void IDragHandler.OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
}
CanvasのRenderModeが 「ScreenSpace – Camera」の時
以下のように変換しないとうまくカーソル位置に追従してくれない。
void IDragHandler.OnDrag(PointerEventData eventData)
{
// キャンパスのRectを取得しておく
// ここでこの処理を呼ぶと重いので、外出しはすること
var rect = GetComponentInParent<Canvas>().GetComponent<RectTransform>();
// 入力をワールド座標に変換
RectTransformUtility.ScreenPointToWorldPointInRectangle(
rect, eventData.position, eventData.pressEventCamera, out Vector3 pos
);
transform.position = pos;
}
レイを飛ばしてドラッグ下にある対象を調べる方法
EventSystem.current.RaycastAllを使うことでカーソル下の対象を取得できる。
private List<RaycastResult> m_raycastResultCache = new List<RaycastResult>();
private bool Check(PointerEventData eventData)
{
EventSystem.current.RaycastAll(eventData, m_raycastResultCache);
foreach (var hit in m_raycastResultCache)
{
if (/*チェック処理*/)
{
return true;
}
}
return false;
}