Unity×iOS

【Unity×iOS】ダークモード・ライトモードを判定する方法|コピペOKネイティブ連携で実現

iOSではシステム全体に「ダークモード/ライトモード」の切り替え機能があり、ユーザーは見た目のテーマを自由に選択できます。
アプリのデザインもこれに連動すれば、より一貫性のある体験が可能です。
しかしUnity単体では、iOSのUIモード(Dark / Light)を直接判定する方法が用意されていません
この記事では、Objective-C++プラグインを使ってiOSの外観モードをUnity側から取得する方法を、コピペOKでわかりやすく解説します!

この記事で分かること

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

なぜ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アプリのユーザー体験を一段階アップグレードできます!
ぜひあなたのアプリにも導入してみてください!