UIのImage(Graphic)のスクリーン座標を取得する

タイトルの通りですが、以下の記事で紹介されいたコードを元に作成しています。

hacchi-man.hatenablog.com

確認環

  • Unity 2021.2.5f1
  • VisualStudoo 2019
  • Windows 10

実装コード

UI 要素の四隅を GetWorldCorners で取得するのは同じですが、基本的に RectTransform を含む必要なプロパティは Graphic から取得できるみたいなので、Graphic コンポーネントの拡張メソッドとして引数なしで呼び出します。また、一回 ScreenSpace - Camera で Camera を設定した状態で Overlay に変更すると Camera が設定されたままになっているようなので判定文を Render Mode を見て判断するようにしています。

public static class GraphicExtension
{
    public static Rect GetScreenRect(this Graphic self)
    {
        var _corners = new Vector3[4];
        self.rectTransform.GetWorldCorners(_corners);

        if (self.canvas.renderMode != RenderMode.ScreenSpaceOverlay)
        {
            var cam = self.canvas.worldCamera;
            _corners[0] = RectTransformUtility.WorldToScreenPoint(cam, _corners[0]);
            _corners[2] = RectTransformUtility.WorldToScreenPoint(cam, _corners[2]);
        }

        return new Rect(_corners[0].x, 
                        _corners[0].y, 
                        _corners[2].x - _corners[0].x,
                        _corners[2].y - _corners[0].y);
    }
}