如何在Unity开发的Android游戏中检测系统深色模式?
Unity Android 同步系统深色模式实现方案
核心思路
通过Unity调用Android原生API读取系统UI模式状态,结合本地存储(PlayerPrefs)处理手动主题与系统主题的优先级,实现UI自动同步。
步骤实现
1. 编写系统深色模式检测方法
直接在Unity的C#代码中调用Android原生类UiModeManager获取系统主题状态:
public static bool IsAndroidDarkModeEnabled() { #if UNITY_ANDROID && !UNITY_EDITOR try { AndroidJavaClass uiModeManagerClass = new AndroidJavaClass("android.app.UiModeManager"); AndroidJavaObject unityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject appContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext"); AndroidJavaObject uiModeManager = appContext.Call<AndroidJavaObject>("getSystemService", "ui_mode"); int nightMode = uiModeManager.Call<int>("getNightMode"); // MODE_NIGHT_YES对应深色模式开启,值为1 return nightMode == uiModeManagerClass.GetStatic<int>("MODE_NIGHT_YES"); } catch (System.Exception e) { Debug.LogError("检测Android深色模式失败:" + e.Message); return false; } #else return false; #endif }
2. 初始化时同步主题
优先读取用户手动设置的主题,无手动设置时跟随系统:
void Start() { if (PlayerPrefs.HasKey("SelectedTheme")) { // 应用用户手动选择的主题 bool useDarkMode = PlayerPrefs.GetInt("SelectedTheme") == 1; ApplyTheme(useDarkMode); } else { // 跟随系统主题 bool useDarkMode = IsAndroidDarkModeEnabled(); ApplyTheme(useDarkMode); } } // 替换为你项目中实际的UI主题切换逻辑 void ApplyTheme(bool isDark) { // 示例:切换UI背景、文本颜色、Sprite资源等 if (isDark) { // 启用深色UI配置 } else { // 启用浅色UI配置 } // 保存当前主题设置 PlayerPrefs.SetInt("SelectedTheme", isDark ? 1 : 0); PlayerPrefs.Save(); }
3. 监听系统主题变化(可选)
当游戏从后台回到前台时,重新检测系统主题并同步(仅当用户未手动设置主题时):
void OnApplicationFocus(bool hasFocus) { if (hasFocus && !PlayerPrefs.HasKey("SelectedTheme")) { bool useDarkMode = IsAndroidDarkModeEnabled(); ApplyTheme(useDarkMode); } }
注意事项
- 版本兼容:Android 10(API Level 29)及以上正式支持系统深色模式,低于该版本的设备会默认返回
false,可根据需求添加低版本的 fallback 逻辑。 - 权限说明:无需额外申请权限,读取系统UI模式属于常规系统信息访问。
- 优先级控制:确保用户手动选择的主题优先级高于系统主题,可在设置界面添加「跟随系统」选项,当用户选择该选项时清除
SelectedTheme的PlayerPrefs记录,恢复自动同步。
内容的提问来源于stack exchange,提问作者user21417410
相关产品推荐
相关产品推荐

