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

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

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.lryc.cn/news/528347.html

相关文章:

  • LLM评估优化与新技术创新综述
  • 【Git】使用笔记总结
  • ZZNUOJ(C/C++)基础练习1000——1010(详解版)
  • 搜狐Android开发(安卓)面试题及参考答案
  • WPS数据分析000007
  • SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
  • 把markdown转换为pdf的方法
  • Controller 层优化四步曲
  • Python数据分析-Python语法基础,IPython和Jupyter-Notebooks(二)
  • Nginx 开发总结
  • centos7安装SVN
  • LTV预估 | 多视角对比学习框架CMLTV
  • llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2
  • C语言自定义数据类型详解(二)——结构体类型(下)
  • DeepSeek学术写作测评第二弹:数据分析、图表解读,效果怎么样?
  • 深入理解 Python 中的 `__all__`:控制模块的公共接口
  • 虚幻基础07:蓝图接口
  • 数据结构---哈希表
  • DataWhale组队学习 leetCode task4
  • 【ESP32】ESP-IDF开发 | WiFi开发 | UDP用户数据报协议 + UDP客户端和服务器例程
  • 【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
  • Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件
  • Rust:如何动态调用字符串定义的 Rhai 函数?
  • A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵
  • 【C++】设计模式详解:单例模式
  • 单细胞分析基础-第一节 数据质控、降维聚类
  • 多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude
  • 每日一题-判断是否是平衡二叉树
  • FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验
  • 《多阶段渐进式图像修复》学习笔记