当前位置: 首页 > article >正文

「Unity3D」在Unity中使用C#控制显示Android的状态栏

Unity打包的Android默认都是全屏,如果想要在真机上显示状态栏,就需要额外设置,有两种方式:

  • 第一种,使用Android的Java代码去控制,然后以插件的方式放到Unity中,被C#调用。
  • 第二种,使用Unity封装的C#代码,直接调用Android上的Java代码,去控制。

本文采用第二种方法,简单快捷,但会有几个坑,全部避开之后才能正确显示,先给正确代码,再指出踩坑点——只有一个函数,直接运行即可,内部精确控制,可以自定义。

private void ShowStatusBar()
{
    #if UNITY_ANDROID && !UNITY_EDITOR
    Screen.fullScreen     = false;
    using var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    using var activity    = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

    activity.Call
    (
        "runOnUiThread", new AndroidJavaRunnable
        (
            () =>
            {
                // WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
                // WINDOW_FLAG_FORCE_NOT_FULLSCREEN         | 
                // WINDOW_FLAG_LAYOUT_IN_SCREEN             | 
                // WINDOW_FLAG_TRANSLUCENT_STATUS
                var flags             = unchecked((int) 0x80000000) | 0x00000800 | 0x00000100 | 0x04000000;
                // VIEW_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                // SYSTEM_UI_FLAG_LIGHT_STATUS_BAR (black text and icons)
                var uiOptions         = 0x00000400 | 0x00002000;        

                // the outer unityPlayer and activity will be disposed by other thread
                using var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                using var activity    = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");                        
                using var window      = activity.Call<AndroidJavaObject>("getWindow");
                using var view        = window.Call<AndroidJavaObject>("getDecorView");

                // 0xAARRGGBB
                // window.Call("setStatusBarColor",  unchecked((int) 0xFF000000));
                window.Call("setFlags", flags,       unchecked((int) 0xFFFFFFFF));
                view  .Call("setSystemUiVisibility", uiOptions);
            }
        )
    );
    #endif
}   

需要注意的地方,在于:

  1. Screen.fullScreen = false——需要设置,否则状态栏会自动隐藏。

  2. runOnUiThread——需要控制Android UI的调用,在UI线程中执行。

  3. window.setFlags——设置布局,view.setSystemUiVisibility——设置外观。

  4. unchecked((int) 0x80000000)——这个越界int类型了,C#向Java传递会有问题,需要控制一下溢出。

  5. unityPlayeractivity——在匿名函数中需要重新获取,外部的会在外层函数结束时释放资源,内部的在UI线程中执行,所以不能用闭包捕获外层的使用。

  6. setFlags的第二个mask参数——这个0xFFFFFFFF会越界int类型,需要unchecked一下。

多布局与外观的控制,查看WINDOW_FLAG_SYSTEM_UI_FLAG的设定,添加到flagsuiOptions即可,注意int类型的越界处理。


http://www.kler.cn/a/523653.html

相关文章:

  • Windows11无法打开Windows安全中心主界面
  • 再见了流氓软件~~
  • CAPL编程常见问题与解决方案深度解析
  • 5分钟带你获取deepseek api并搭建简易问答应用
  • 使用飞书群机器人监控服务器GPU使用率
  • 【信息系统项目管理师-选择真题】2010上半年综合知识答案和详解
  • 02数组+字符串+滑动窗口+前缀和与差分+双指针(D5_双指针)
  • Oracle PMON进程清洗功能
  • Unbutu虚拟机+eclipse+CDT编译调试环境搭建
  • DeepSeekMoE:迈向混合专家语言模型的终极专业化
  • 从腾讯云数据仓库TCHouse安全地转移数据到AWS Redshift
  • SQL在DBA手里-改写篇
  • 实验七 带函数查询和综合查询(2)
  • Deepseek-R1性能指标
  • 【Android】问deepseek存储访问
  • 当AI学会“顿悟”:DeepSeek-R1如何用强化学习突破推理边界?
  • TypeScript中的函数:类型安全与高级特性
  • Vue.js组件开发-实现下载动态进度条
  • 机器学习(7):集成学习
  • HTML中的元素(elements)
  • 特征衍生与XGB
  • RockyLinxu9远程登录问题
  • HashMap讲解
  • windows lm studio 0.3.8无法下载模型,更换镜像
  • 复古壁纸中棕色系和米色系哪个更受欢迎?
  • 09 以太坊技术介绍