はじめに
今回はgree/unity-webviwe
のWebViewObject.SetMargins
の引数にあるrelative
について書きたいと思います。
public void SetMargins(int left, int top, int right, int bottom, bool relative = false)
// 使用例 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/"); }
概要
引数のrelative
をfalse
にすると端末のディスプレイ解像度に対するマージンとなり、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);
ちなみに内部実装的な話でいうと、relative
がtrue
なときはScreen.width
やDisplay.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); }
docs.unity3d.com
docs.unity3d.com
特にどういうときに挙動の違いが出てくるのかというと、Screen.SetResolution
を呼ぶと変わってきます。(Screen.width != Display.main.systemWidth
のとき)
docs.unity3d.com
自慢
地味にここら辺ちょっと関わってました。
github.com