うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】uGUI を利用してタップした位置のオブジェクトを取得する

画面をタップした位置にある3Dオブジェクトを取得したい場合
画面のタップを検知して、タップしたスクリーン座標を取得する必要がある

InputPointerEventData を利用した方法があり、両方の処理を乗せる

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 をセットする必要がある

f:id:hacchi_man:20200324000725g:plain