RectTransformの矩形からスクリーン矩形を得る

この記事は2017年09月05日にqiitaに投稿した内容です。

環境

Unity2017.1.0f3

概要

RectTransformの矩形からスクリーン矩形に変換します 主にWebViewの表示領域に使用します

コガネブログさんが作成したのを使用すると良いと思います。 http://baba-s.hatenablog.com/entry/2019/06/21/090000

GreeのWebView

GreeのWebViewをWindowsのUnityEditorである程度動作させるとっかかり

プログラム

using UnityEngine;

public class TestRectTransformToScreenSpaceRect : MonoBehaviour
{
    [SerializeField] RectTransform _rectTrans = null;

    private Rect _screenRect;

    private void Update ()
    {
        _screenRect = CalcurateScreenSpaceRect( _rectTrans );
    }

    private static Rect CalcurateScreenSpaceRect( RectTransform rectTrans )
    {
        var canvas = rectTrans.GetComponentInParent<Canvas>();
        var camera = canvas.worldCamera;
        var corners = new Vector3[ 4 ];
        //左下、左上、右上、右下
        rectTrans.GetWorldCorners( corners );
        var screenCorner1 = RectTransformUtility.WorldToScreenPoint( camera, corners[ 1 ] );
        var screenCorner3 = RectTransformUtility.WorldToScreenPoint( camera, corners[ 3 ] );

        //左下基準
        var screenRect = new Rect();
        screenRect.x = screenCorner1.x;
        screenRect.width = screenCorner3.x - screenRect.x;
        screenRect.y = screenCorner3.y;
        screenRect.height = screenCorner1.y - screenRect.y;
#if false
        //左、上、右、下
        var margin = new Vector4( screenCorner1.x, Screen.height - screenCorner1.y, Screen.width - screenCorner3.x, screenCorner3.y );
        Debug.Log("margin x:" + margin.x + "y:" + margin.y + "z:" + margin.z + "w:" + margin.w );
        _WebView.SetMargins( (int)margin.x, (int)margin.y, (int)margin.z, (int)margin.w ); 
#endif
        return screenRect;
    }

    private static Texture2D _debugTexture = null;
    private void OnGUI()
    {
        if( _debugTexture == null )
        {
            _debugTexture = new Texture2D( 4, 4, TextureFormat.ARGB32, false );
            for (int y = 0; y < _debugTexture.height; y++) {
                for (int x = 0; x < _debugTexture.width; x++) {
                    Color color = new Color( 1.0f, 0.0f, 0.0f, 0.5f );
                    _debugTexture.SetPixel(x, y, color);
                }
            }
            _debugTexture.Apply();
        }
        //こっちは左上基準
        var rect = _screenRect;
        rect.yMax = Screen.height - _screenRect.yMin;
        rect.yMin = rect.yMax - _screenRect.height;
        GUI.DrawTexture( rect, _debugTexture );
    }
}