うにてぃブログ

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

【Unity】PointerEventData を利用して RectTransform の Rect を取得する

RectTransform の Rect を取得するには、 Canvas が Overlay 以外の場合 Camera が必要になり、自前で取得処理をする必要がある

それが面倒だったので PointerEventDataenterEventCamera を利用して楽に Rect を取得する

public static class RectTransformUtil
{
    private static Vector3[] cache = new Vector3[4];

    public static Rect GetRect(RectTransform rect, PointerEventData data)
    {
        rect.GetWorldCorners(cache);
 
        // Canvas が overlay じゃない場合の対応
        if (data.enterEventCamera != null)
        {
            // Screen座標 に変換 (左下, 左上, 右下, 右上)
            for (var i = 0; i < cache.Length; i++)
                cache[i] = RectTransformUtility.WorldToScreenPoint(data.enterEventCamera, cache[i]);
        }
 
        return new Rect(cache[0].x, cache[0].y, cache[2].x - cache[0].x, cache[2].y - cache[0].y);
    }
}

使い方

UnityEngine.EventSystems の interface なら、引数に PointerEventData があるので
これを利用して以下のように呼び出すことで Rect が取得できる

   public void OnPointerDown(PointerEventData eventData)
    {
        var rect = RectTransformUtil.GetRect(transform as RectTransform, eventData);
    }