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

embedded/2025/2/1 2:49:44/

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

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

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

private void ShowStatusBar()
{#if UNITY_ANDROID && !UNITY_EDITORScreen.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_STATUSvar 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 threadusing 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.ppmy.cn/embedded/158518.html

相关文章

Kiwi 安卓浏览器本月停止维护,扩展功能迁移至 Edge Canary

IT之家 1 月 25 日消息&#xff0c;科技媒体 Android Authority 今天&#xff08;1 月 25 日&#xff09;发布博文&#xff0c;报道称 Kiwi 安卓浏览器将于本月停止维护&#xff0c;相关扩展支持功能已整合到微软 Edge Canary 浏览器中。 开发者 Arnaud42 表示 Kiwi 安卓浏览器…

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能&#xff1f; 如果你曾经参加过重要的会议或者演讲&#xff0c;你就会知道&#xff0c;演讲者视图&#xff08;Presenter View&#xff09;对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏&#xff0c;还能提供额外的提示和支持&#…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后&#xff1a; 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…

华为云云原生王者之路集训营(黄金-第一章和第二章)

十年云计算浪潮下,DevOps、容器、微服务等技术飞速发展,云原生成为潮流。2020年华为云在业界率先提出了云原生2 .0的理念。云原生2.0是企业智能升级新阶段,企业云化从“ON Cloud”走向“IN Cloud”,成为“新云原生企业”,新生能力与既有能力立而不破、有机协同,实现资源高…

Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件

目录 前言 创建项目 插件导入 地形插件 前言 这是游戏开发第一篇&#xff0c;进行开发准备。 创作不易&#xff0c;欢迎支持。 我的编辑器布局是【Tall】&#xff0c;建议调整为该布局&#xff0c;如下。 创建项目 首先创建一个项目&#xff0c;过程略&#xff0c;名字请勿…

低代码产品插件功能一览

下图是统计的目前市面上流行的低代码、零代码产品的插件功能。 产品名称 产品类型 官方插件数量 支持拓展 官方插件功能 宜搭 零代码 3 暂不支持 云打印、CAD看图、打印表单详情 微搭 低代码 1 暂不支持 小程序 明道云 低代码 2 支持 视图、工作流节点 简道…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

oracle中使用in 和 not in 查询效率分析

在Oracle数据库中&#xff0c;IN和NOT IN的查询效率受多种因素影响&#xff0c;以下是关键点总结和优化建议&#xff1a; 1. IN 的效率 优化方式&#xff1a; IN 通常会被优化为 OR条件 或 半连接&#xff08;Semi-Join&#xff09;&#xff0c;如果子查询关联到外部表&#x…