【Unity】SafeArea対応

DEVELOP, Unity

セーフエリアは、最近ではiPhoneX対応とか言われているアレです。コンシューマゲームで例えると、重要な情報は画面の内側80%以内におさまる様に描画しなさいっていうアレ。プレイヤーの体力バーとか画面から見切れると大惨事ですし。

セーフエリア対応コード

書こうとしたら見つけてしまった。先人から頂きましょう。GitHubで検索するとたいていのものは見つかりますね。便利なコミュニティが出来たものです。

Unity-SafeAreaCanvas/SetCanvasBounds.cs at master · nkjzm/Unity-SafeAreaCanvas

using UnityEngine;
namespace nkjzm.SafeAreaCanvas
{
    [ExecuteInEditMode()]
    public class SetCanvasBounds : MonoBehaviour
    {
        public RectTransform panel;
        Rect lastSafeArea = new Rect(0, 0, 0, 0);
        void ApplySafeArea(Rect area)
        {
            panel.anchoredPosition = Vector2.zero;
            panel.sizeDelta = Vector2.zero;
            var anchorMin = area.position;
            var anchorMax = area.position + area.size;
            anchorMin.x /= Screen.width;
            anchorMin.y /= Screen.height;
            anchorMax.x /= Screen.width;
            anchorMax.y /= Screen.height;
            panel.anchorMin = anchorMin;
            panel.anchorMax = anchorMax;
            lastSafeArea = area;
        }
        void Update()
        {
            if (panel == null) { return; }
            Rect safeArea = Screen.safeArea;
#if UNITY_EDITOR
            if (Screen.width == 1125 && Screen.height == 2436)
            {
                safeArea.y = 102;
                safeArea.height = 2202;
            }
            if (Screen.width == 2436 && Screen.height == 1125)
            {
                safeArea.x = 132;
                safeArea.y = 63;
                safeArea.height = 1062;
                safeArea.width = 2172;
            }
#endif
            if (safeArea != lastSafeArea)
            {
                ApplySafeArea(safeArea);
            }
        }
    }
}

対応するCanvasに上記コンポーネントを追加するだけで良い。 Awesome!

Posted by kazupon