うにてぃブログ

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

【Unity】RectTransform の スクリーン座標の Rect を取得する

hacchi-man.hatenablog.com

の記事に内容を追加して拡張メソッドとして利用できるようにしたものです

GetWorldCorners を利用すると RectTransform の4角の座標を取得することができる
この際に Canvas の RenderMode が Overlay じゃない場合は、座標変換が必要になるので RectTransformUtility.WorldToScreenPoint を利用してスクリーン座標に変換する

public static class RectTransformExtension
{
    private static readonly Vector3[] _corners = new Vector3[4];
 
    public static Rect GetScreenRect(this RectTransform self, PointerEventData data)
    {
        return self.GetScreenRect(data.pressEventCamera);
    }
 
    public static Rect GetScreenRect(this RectTransform self)
    {
        var canvas = self.GetComponentInParent<Canvas>();
        return self.GetScreenRect(canvas.worldCamera);
    }
 
    public static Rect GetScreenRect(this RectTransform self, Camera camera)
    {
        self.GetWorldCorners(_corners);
        if (camera != null)
        {
            _corners[0] = RectTransformUtility.WorldToScreenPoint(camera, _corners[0]);
            _corners[2] = RectTransformUtility.WorldToScreenPoint(camera, _corners[2]);
        }
 
        var rect = new Rect
        {
            x = _corners[0].x,
            y = _corners[0].y
        };
        rect.width = _corners[2].x - rect.x;
        rect.height = _corners[2].y - rect.y;
        return rect;
    }
}