セーフエリアとは?

モバイル向けにアプリケーションを作成する場合、セーフエリアを意識する必要があります。

昨今のスマートフォン、タブレット端末の画面はテレビやPCモニターのように長方形では無く、

角が丸くなっていることが多いです。

また、ノッチやピンチホールが画面上にあったりします。

セーフエリアは、スマートフォンやタブレットなどのデバイス上で、

アプリケーションの主要な情報や操作が確実に表示・操作される領域を指し、

通知バーやホームボタン、カメラ等のデバイスによるUIの邪魔にならない場所を示します。

各種モバイル端末ごとのセーフエリアを簡単に確認するには、DeviceSimulatorが役に立ちます。

DeviceSimulatorでセーフエリアを確認する

Canvasの四隅に色違いのImageを配置してみました。

DeviceSimulator上部の「Safe Area」ボタンを押すと端末のセーフエリアが黄色い枠で表示されます。

このままだと4隅のImageがSafeArea外にあるためよろしくありません。

現在のSafeAreaを取得する

Screen.safeAreaで現在のセーフエリアの範囲を取得できます。

using UnityEngine;

public class SafeArea : MonoBehaviour
{
    private void Update()
    {
        var safeArea = Screen.safeArea;
    }
}

CanvasをSafeAreaに合うように調整する

ヒエラルキー上で、Canvas子にSafeAreaというオブジェクトを追加しました。

以下のスクリプトを用意して、SafeAreaオブジェクトに追加します。

今回はUnityEditor上で確認するため、Updateメソッドでセーフエリアの範囲を計算しています。

実機上では動的にセーフエリアが変化しないので、AwakeやStartのタイミングで1度計算すれば大丈夫だと思います。

using UnityEngine;

public class SafeArea : MonoBehaviour
{
    private Rect _safeArea;
    
    private void Update()
    {
        var safeArea = Screen.safeArea;
        if (_safeArea != safeArea)
        {
            _safeArea = safeArea;
            ApplySafeArea(_safeArea);
        }
    }
    
    private void ApplySafeArea(Rect safeArea)
    {
        var resolution = new Vector2(Screen.width, Screen.height);
        var normalizedMin = new Vector2(safeArea.xMin / resolution.x, safeArea.yMin / resolution.y);
        var normalizedMax = new Vector2(safeArea.xMax / resolution.x, safeArea.yMax / resolution.y);
        
        if (transform is RectTransform rectTransform)
        {
            rectTransform.anchoredPosition = Vector2.zero;
            rectTransform.sizeDelta = Vector2.zero;
            rectTransform.anchorMin = normalizedMin;
            rectTransform.anchorMax = normalizedMax;
        }
    }
}

この状態でプレイモードに入り、DeviceSimulator上でデバイスを変更してみます。

4隅のImageがセーフエリアの4隅に合っているのが確認できました。

デバイスを変更するとSafeAreaコンポーネント上でRectTransformのAnchorMin,AnchorMaxの値を変更し、

セーフエリア内に合わせるようになっています。

まとめ

Canvasをセーフエリアに合わせる方法について説明しました。

ボタンなどユーザーが操作出来るオブジェクトがセーフエリア外にあるとアプリの審査時にリジェクト(却下)される場合があります。

モバイル端末向けにアプリをリリースする場合、開発段階からセーフエリアを意識し、UIを配置することが重要です。