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