画面をタップした位置にある3Dオブジェクトを取得したい場合
画面のタップを検知して、タップしたスクリーン座標を取得する必要がある
Input
と PointerEventData
を利用した方法があり、両方の処理を乗せる
Input
を利用した処理
public class TapHandler : MonoBehaviour { private void Update() { if (Input.touchCount <= 0) return; // タップしたスクリーン座標 var screenPos = Input.GetTouch(0).position; } }
PointerEventData
を使った処理
public class TapHandler : Graphic, IPointerClickHandler { [SerializeField] private Camera _3dCamera; public void OnPointerClick(PointerEventData eventData) { // タップしたスクリーン座標 eventData.position; } }
Rayを飛ばして対象オブジェクトを取得する
Camera
には スクリーン座標を指定して Ray を取得する処理があるのでそれを利用すると
下記の処理になる
[SerializeField] private Camera _3dCamera; private RaycastHit _cacheRaycastHit; /// <summary> /// Rayを飛ばしてチェック /// </summary> private T[] RayCastHits<T>(Vector2 position) where T : Component { // スクリーン座標を元にRayを取得 var ray = _3dCamera.ScreenPointToRay(position); #if UNITY_EDITOR Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red, 5, false); #endif if (!Physics.Raycast(ray, out _cacheRaycastHit)) return null; return _cacheRaycastHit.collider.GetComponents<T>(); }
これを利用して、実際にタップしてみると
ちゃんとタップした座標に赤い線が表示された
今回カメラが Perspective
なのでタップ座標も視野角に応じて座標が変わっている
また、検知したいオブジェクトには Collider
をセットする必要がある