Unity×iOS

【Unity×iOS】ダークモード・ライトモードの判定方法|プラグインでUIテーマに対応しよう!

使用環境

・Unity Editor:2021.3.18f1

この記事で分かること

  • Unity標準APIではダークモード判定できない理由
  • iOSネイティブから現在の外観モードを取得する方法
  • 【コピペOK】Objective-C++プラグイン+C#コード連携
  • モードごとにUIを切り替えるサンプル実装

iOSのダークモード・ライトモード判定とは?

ピッグダディ

今日は「iOSのダークモード/ライトモード」をUnityから判定する方法を紹介するよ。
見た目を自動で切り替えられると、アプリの雰囲気もグッとよくなるからね。

ピッグボーイ

えっ、Unityって勝手にダークモード対応してくれてるんじゃないんですか?

ピッグガール

じゃあ、自分でモードを調べてUIを変える必要があるんですか?

ピッグダディ

そうなんだ、でも大丈夫!
iOSのネイティブ機能を少し使えば、今がダークかライトか簡単に調べられるよ。
この記事ではコピペで使えるコードも紹介しているから、安心してね。

なぜUnityではダークモード判定できないのか?

Unityはクロスプラットフォームエンジンであり、OSごとのUIテーマ(ダーク/ライト)には非対応です。
iOSではtraitCollection.userInterfaceStyleを使えば取得可能ですが、
Unity単体ではアクセスできないため、ネイティブコードで判定しUnityに渡す必要があります。

【コピペOK】iOSのUIモード判定プラグインの作り方

.mmファイルを作成する

Assets/Plugins/iOS/AppearanceChecker.mm に以下を記述:

#import <UIKit/UIKit.h>

extern "C" int GetUserInterfaceStyle()
{
    UIUserInterfaceStyle style = UIScreen.mainScreen.traitCollection.userInterfaceStyle;
    return (int)style;
}
  • 返り値は整数(0 = 未設定、1 = ライト、2 = ダーク)
  • UIScreen.mainScreen.traitCollectionを使用することで、現在の画面のテーマ状態を取得できます

Unity側のC#スクリプトを書く

これで、AppearanceChecker.CurrentStyle から
iOS側のUIテーマ状態(ダーク or ライト)が取得できるようになります!

using System.Runtime.InteropServices;
using UnityEngine;

public static class AppearanceChecker
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern int GetUserInterfaceStyle();
#else
    private static int GetUserInterfaceStyle() => 1; // ライトモード仮定
#endif

    public enum UIStyle
    {
        Unspecified = 0,
        Light = 1,
        Dark = 2
    }

    public static UIStyle CurrentStyle => (UIStyle)GetUserInterfaceStyle();
}

使用例(テーマに応じてUI色を切り替える)

ダーク/ライトの状態を読み取り、UIの背景色を自動変更!

using UnityEngine;
using UnityEngine.UI;

public class ThemeChanger : MonoBehaviour
{
    public Image background;

    void Start()
    {
        switch (AppearanceChecker.CurrentStyle)
        {
            case AppearanceChecker.UIStyle.Dark:
                background.color = Color.black;
                break;
            case AppearanceChecker.UIStyle.Light:
                background.color = Color.white;
                break;
        }
    }
}

注意点・補足

  • UnityはiOSの通知(モード切り替え)を受け取らないため、起動時に1回チェックする運用が基本
  • 必要に応じて UIApplicationDidBecomeActiveNotificationを使って再チェック可能
  • Androidではまた別の判定手順が必要(本記事ではiOS限定)

まとめ

ポイント内容
Unity標準ではiOSのUIテーマ取得は不可
ネイティブプラグインでuserInterfaceStyle を取得可能
コピペOKコードで簡単に判定できる
起動時や画面表示時に切り替え処理を入れるのがおすすめ

ユーザーの環境に合わせたUIを提供することで、
Unityアプリのユーザー体験を一段階アップグレードできます!
ぜひあなたのアプリにも導入してみてください!