はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】gree/unity-webviewのSetMarginのrelativeは何を意味するのか(Screen.SetResolutionをしたときに挙動が変わる)

はじめに

今回はgree/unity-webviweWebViewObject.SetMarginsの引数にあるrelativeについて書きたいと思います。

public void SetMargins(int left, int top, int right, int bottom, bool relative = false)

github.com

// 使用例
private void Start()
{
    var webViewObject = new GameObject("WebViewObject").AddComponent<WebViewObject>();

    // 初期化
    webViewObject.Init(
        // NOTE: iOSでUIWebViewではなくWKWebViewを利用する(現在はほぼ必須な設定項目だと思ってもらえれば)
        enableWKWebView: true
    );
            
    // マージンの設定(relativeはデフォルトでfalse)
    webViewObject.SetMargins(left: 100, top: 100, right: 100, bottom: 100, relative: false);

    // URLを読み込みWebViewを表示する
    webViewObject.SetVisibility(true);
    webViewObject.LoadURL("https://www.google.co.jp/");
}

概要

引数のrelativefalseにすると端末のディスプレイ解像度に対するマージンとなり、trueにするとレンダリング解像度に対するマージンになります。

// 物理解像度に対するマージン
webViewObject.SetMargins(left: 100, top: 100, right: 100, bottom: 100, relative: false);

// 描画解像度に対するマージン
webViewObject.SetMargins(left: 100, top: 100, right: 100, bottom: 100, relative: true);


ちなみに内部実装的な話でいうと、relativetrueなときはScreen.widthDisplay.main.systemWidthを使ってマージンの調整をしてます。

if (relative)
{
    float w = (float)Screen.width;
    float h = (float)Screen.height;
    int iw = Display.main.systemWidth;
    int ih = Display.main.systemHeight;
    if (!Screen.fullScreen)
    {
        using (var unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        using (var activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity"))
        using (var player = activity.Get<AndroidJavaObject>("mUnityPlayer"))
        using (var view = player.Call<AndroidJavaObject>("getView"))
        using (var rect = new AndroidJavaObject("android.graphics.Rect"))
        {
            view.Call("getDrawingRect", rect);
            iw = rect.Call<int>("width");
            ih = rect.Call<int>("height");
        }
    }
    ml = left / w * iw;
    mt = top / h * ih;
    mr = right / w * iw;
    mb = AdjustBottomMargin((int)(bottom / h * ih));
}
else
{
    ml = left;
    mt = top;
    mr = right;
    mb = AdjustBottomMargin(bottom);
}

github.com

docs.unity3d.com
docs.unity3d.com

特にどういうときに挙動の違いが出てくるのかというと、Screen.SetResolutionを呼ぶと変わってきます。(Screen.width != Display.main.systemWidthのとき)
docs.unity3d.com

自慢

地味にここら辺ちょっと関わってました。
github.com