You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity开发:如何始终显示Status和Navigation Bar

Unity中始终显示状态栏与导航栏的实现方法

一、基础Player Settings配置

打开Unity编辑器的「Player Settings」路径:Edit > Project Settings > Player,切换到「Android」标签页:

  • 找到「Resolution and Presentation」区域
  • 确保Status Bar Hidden和Navigation Bar Hidden两个选项均未勾选

二、代码强制保持显示(解决场景切换/后台恢复后的隐藏问题)

创建一个C#脚本KeepBarsVisible.cs,挂载到场景中持久化的对象上(比如主相机或全局管理对象),代码如下:

using UnityEngine;

public class KeepBarsVisible : MonoBehaviour
{
    void Start()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        // 获取当前Android活动实例
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject window = currentActivity.Call<AndroidJavaObject>("getWindow");
        
        // 定义需要移除的隐藏标志位
        AndroidJavaClass viewClass = new AndroidJavaClass("android.view.View");
        int flagFullscreen = viewClass.GetStatic<int>("SYSTEM_UI_FLAG_FULLSCREEN");
        int flagHideNavigation = viewClass.GetStatic<int>("SYSTEM_UI_FLAG_HIDE_NAVIGATION");
        int flagImmersiveSticky = viewClass.GetStatic<int>("SYSTEM_UI_FLAG_IMMERSIVE_STICKY");
        
        // 移除隐藏标志,恢复栏目的显示
        int currentFlags = window.Call<int>("getDecorView").Call<int>("getSystemUiVisibility");
        int newFlags = currentFlags & ~flagFullscreen & ~flagHideNavigation & ~flagImmersiveSticky;
        window.Call<AndroidJavaObject>("getDecorView").Call("setSystemUiVisibility", newFlags);
        
        // 取消窗口全屏布局限制
        AndroidJavaClass windowManagerClass = new AndroidJavaClass("android.view.WindowManager$LayoutParams");
        int flagLayoutNoLimits = windowManagerClass.GetStatic<int>("FLAG_LAYOUT_NO_LIMITS");
        int currentWindowFlags = window.Call<int>("getFlags");
        window.Call("setFlags", currentWindowFlags & ~flagLayoutNoLimits, -1);
        #endif
    }

    // 应用从后台返回前台时,重新恢复栏目的显示
    void OnApplicationFocus(bool hasFocus)
    {
        if (hasFocus)
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            Start();
            #endif
        }
    }
}

代码说明

  • 仅在Android平台生效,通过宏定义屏蔽编辑器和其他平台的执行逻辑
  • 调用Android原生API,移除所有可能导致状态栏/导航栏隐藏的系统UI标志
  • 监听应用焦点变化,确保后台切回前台时栏目的显示状态不会丢失

三、注意事项

  • 项目最低Android API级别建议设置为28(Android 9.0)及以上,避免API兼容问题
  • 必须使用真实Android设备测试,编辑器中无法预览状态栏与导航栏的显示效果
  • 若使用第三方插件修改过UI显示逻辑,需确保插件代码不会覆盖当前设置

内容的提问来源于stack exchange,提问作者Ahmet Berat AĞIRMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:01:20