{"id":4195,"date":"2021-09-16T23:48:01","date_gmt":"2021-09-16T15:48:01","guid":{"rendered":"http:\/\/blog.coolcoding.cn\/?p=4195"},"modified":"2021-09-17T17:56:21","modified_gmt":"2021-09-17T09:56:21","slug":"ugui%e5%88%98%e6%b5%b7%e5%b1%8f%e5%a4%84%e7%90%86%ef%bc%88%e4%b8%80%ef%bc%89","status":"publish","type":"post","link":"https:\/\/blog.coolcoding.cn\/?p=4195","title":{"rendered":"UGUI\u5218\u6d77\u5c4f\u5904\u7406\uff08\u4e00\uff09"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>using UnityEngine;\nusing UnityEngine.UI;\nusing System.Collections.Generic;\n\npublic class UguiAutoResolution : MonoBehaviour\n{\n    public RectTransform mTargetForm;\n    private DeviceDir mCurrDeviceDir = DeviceDir.None;\n    private RectInt mSafeArea = new RectInt(0, 0, 0, 0);\n    private Vector2Int mCurrentScreenSize = Vector2Int.zero;\n\n    private const int kChangeDirty = 10; \/\/ 10\u5e27\uff0c\u7528\u4e8e\u5ef6\u540e\u751f\u6548\n    private const int kReferenceResolutionHeight = 720; \/\/ \u56fa\u5b9a\u8bbe\u8ba1\u5206\u8fa8\u7387\n    private const int kReferenceResolutionWidth = 1280; \/\/ \u56fa\u5b9a\u8bbe\u8ba1\u5206\u8fa8\u7387\n    private readonly static Vector2Int kReferenceResolution_horz = new Vector2Int(kReferenceResolutionWidth, kReferenceResolutionHeight);\n    private readonly static Vector2Int kReferenceResolution_vert = new Vector2Int(kReferenceResolutionHeight, kReferenceResolutionWidth);\n    private int mChanged = 0;\n    private static RectInt _safeArea = new RectInt();\n    private static RectInt ScreenSafeArea\n    {\n        get\n        {\n            var s = Screen.safeArea;\n            _safeArea.x = (int)s.x;\n            _safeArea.y = (int)s.y;\n            _safeArea.width = (int)s.width;\n            _safeArea.height = (int)s.height;\n            return _safeArea;\n        }\n    }  \n\n    enum DeviceDir\n    {\n        None,\n        Horz,\n        Vert,\n    };\n\n    void Start()\n    {\n        UpdateResolution();\n    }\n\n    private float GetScreenMinRate()\n    {\n        return Mathf.Min( Screen.width, Screen.height ) \/ (float)kReferenceResolutionHeight;\n    }\n\n    private void OnResolutionChange()\n    {\n        var safeArea = ScreenSafeArea;\n        var rate = GetScreenMinRate();\n        var canvasScaler = this.GetComponent&lt;CanvasScaler>();\n        if (canvasScaler != null)\n        {\n            canvasScaler.referenceResolution = Screen.width > Screen.height?  kReferenceResolution_horz: kReferenceResolution_vert;\n        }\n\n        var xMin = safeArea.xMin \/ rate;\n        var yMin = safeArea.yMin \/ rate;\n        var xMax = (safeArea.xMax - Screen.width)  \/ rate;\n        var yMax = (safeArea.yMax - Screen.height) \/ rate;\n\n        if (mTargetForm != null)\n        {\n            mTargetForm.offsetMin = new Vector2(xMin, yMin);\n            mTargetForm.offsetMax = new Vector2(xMax, yMax);\n        }\n    }\n\n    private static DeviceDir GetDeviceDir(DeviceOrientation devOri)\n    {\n        switch(devOri)\n        {\n            case DeviceOrientation.Portrait: return DeviceDir.Vert;\n            case DeviceOrientation.PortraitUpsideDown: return DeviceDir.Vert;\n            case DeviceOrientation.LandscapeLeft: return DeviceDir.Horz;\n            case DeviceOrientation.LandscapeRight: return DeviceDir.Horz;            \n            default: return DeviceDir.None;\n        }\n    }\n\n    private void UpdateResolution()\n    {\n        if (mChanged > 1)\n        {\n            --mChanged;\n        }\n        else if (mChanged == 1)\n        {\n            OnResolutionChange();\n            mChanged = 0;\n        }\n\n        var currDir = GetDeviceDir(Input.deviceOrientation);\n        if (currDir != DeviceDir.None &amp;&amp; currDir != mCurrDeviceDir)\n        {\n            mCurrDeviceDir = currDir;\n            mChanged = kChangeDirty;\n        }\n\n        var safeArea = ScreenSafeArea;\n        if (!mSafeArea.Equals(safeArea))\n        {\n            mSafeArea = safeArea;\n            mChanged = kChangeDirty;\n        }\n\n        if (mCurrentScreenSize.x != Screen.width)\n        {\n            mCurrentScreenSize.x = Screen.width;\n            mChanged = kChangeDirty;\n        }\n\n        if (mCurrentScreenSize.y != Screen.height)\n        {\n            mCurrentScreenSize.y = Screen.height;\n            mChanged = kChangeDirty;\n        }\n    }\n\n    private void InitResolution()\n    {\n        mCurrDeviceDir = Screen.width > Screen.height ? DeviceDir.Horz : DeviceDir.Vert;\n        mChanged = 1;\n    }\n\n    void Update()\n    {\n        InitResolution();\n        UpdateResolution();\n    }\n}<\/code><\/pre>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!--nextpage-->\n\n\n\n<pre class=\"wp-block-code\"><code>using UnityEngine;\nusing UnityEngine.UI;\n\npublic class UguiAutoResolution : MonoBehaviour\n{\n    private DeviceDir mCurrDeviceDir = DeviceDir.None;\n    private RectInt mSafeArea = new RectInt(0, 0, 0, 0);\n    private Vector2Int mCurrentScreenSize = Vector2Int.zero;\n    private const int kChangeDirty = 10; \/\/ 10\u5e27\uff0c\u7528\u4e8e\u5ef6\u540e\u751f\u6548\n    private const int kReferenceResolutionHeight = 720; \/\/ \u56fa\u5b9a\u8bbe\u8ba1\u5206\u8fa8\u7387\n    private const int kReferenceResolutionWidth = 1280; \/\/ \u56fa\u5b9a\u8bbe\u8ba1\u5206\u8fa8\u7387\n    private readonly static Vector2Int kReferenceResolution_horz = new Vector2Int(kReferenceResolutionWidth, kReferenceResolutionHeight);\n    private readonly static Vector2Int kReferenceResolution_vert = new Vector2Int(kReferenceResolutionHeight, kReferenceResolutionWidth);\n    private int mChanged = 0;\n    private static RectInt _safeArea = new RectInt();\n    private static RectInt ScreenSafeArea\n    {\n        get\n        {\n            var s = Screen.safeArea;\n            _safeArea.x = (int)s.x;\n            _safeArea.y = (int)s.y;\n            _safeArea.width = (int)s.width;\n            _safeArea.height = (int)s.height;\n            return _safeArea;\n        }\n    }  \n\n    enum DeviceDir\n    {\n        None,\n        Horz,\n        Vert,\n    };\n\n    void Start()\n    {\n        UpdateResolution();\n    }\n\n    private float GetScreenMinRate()\n    {\n        return Mathf.Min( Screen.width, Screen.height ) \/ (float)kReferenceResolutionHeight;\n    }\n\n    private void OnResolutionChange()\n    {\n        var safeArea = ScreenSafeArea;\n        var rate = GetScreenMinRate();\n        var canvasScaler = this.GetComponent&lt;CanvasScaler>();\n        if (canvasScaler != null)\n        {\n            canvasScaler.referenceResolution = Screen.width > Screen.height?  kReferenceResolution_horz: kReferenceResolution_vert;\n        }\n\n        var xMin = safeArea.xMin \/ rate;\n        var yMin = safeArea.yMin \/ rate;\n        var xMax = (safeArea.xMax - Screen.width)  \/ rate;\n        var yMax = (safeArea.yMax - Screen.height) \/ rate;\n\n        var offsetMin = new Vector2(xMin, yMin);\n        var offsetMax = new Vector2(xMax, yMax);\n\n        var selfTrans = this.gameObject.transform;\n        var childCount = selfTrans.childCount;\n\n        for(int i=0; i&lt;childCount; ++i)\n        {\n            var childRectTrans = selfTrans.GetChild(i).GetComponent&lt;RectTransform>();\n            if (childRectTrans != null)\n            {\n                childRectTrans.offsetMin = offsetMin;\n                childRectTrans.offsetMax = offsetMax;\n            }\n        }\n    }\n\n    private static DeviceDir GetDeviceDir(DeviceOrientation devOri)\n    {\n        switch(devOri)\n        {\n            case DeviceOrientation.Portrait: return DeviceDir.Vert;\n            case DeviceOrientation.PortraitUpsideDown: return DeviceDir.Vert;\n            case DeviceOrientation.LandscapeLeft: return DeviceDir.Horz;\n            case DeviceOrientation.LandscapeRight: return DeviceDir.Horz;            \n            default: return DeviceDir.None;\n        }\n    }\n\n    private void UpdateResolution()\n    {\n        if (mChanged > 1)\n        {\n            --mChanged;\n        }\n        else if (mChanged == 1)\n        {\n            OnResolutionChange();\n            mChanged = 0;\n        }\n\n        var currDir = GetDeviceDir(Input.deviceOrientation);\n        if (currDir != DeviceDir.None &amp;&amp; currDir != mCurrDeviceDir)\n        {\n            mCurrDeviceDir = currDir;\n            mChanged = kChangeDirty;\n        }\n\n        var safeArea = ScreenSafeArea;\n        if (!mSafeArea.Equals(safeArea))\n        {\n            mSafeArea = safeArea;\n            mChanged = kChangeDirty;\n        }\n\n        if (mCurrentScreenSize.x != Screen.width)\n        {\n            mCurrentScreenSize.x = Screen.width;\n            mChanged = kChangeDirty;\n        }\n\n        if (mCurrentScreenSize.y != Screen.height)\n        {\n            mCurrentScreenSize.y = Screen.height;\n            mChanged = kChangeDirty;\n        }\n    }\n\n    private void InitResolution()\n    {\n        mCurrDeviceDir = Screen.width > Screen.height ? DeviceDir.Horz : DeviceDir.Vert;\n        mChanged = 1;\n    }\n\n    void Update()\n    {\n        InitResolution();\n        UpdateResolution();\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/4195"}],"collection":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4195"}],"version-history":[{"count":4,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/4195\/revisions"}],"predecessor-version":[{"id":4199,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/4195\/revisions\/4199"}],"wp:attachment":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}