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