【Unity】UIなどでドラッグ中の位置をワールド座標に変換

Unity
スポンサーリンク

ドラッグ座標を取得する方法

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;
}
スポンサーリンク
Unity
スポンサーリンク
シェアボタン ('ω')ノ
ゲーム開発技術ブログ スメラテ すめらて
タイトルとURLをコピーしました