Android/Unity - 全屏模式、Android 的状态栏和 3D 纵横比

Android/Unity - Fullscreen mode, Android's status bar, and 3D aspect ratios

我已经绞尽脑汁一个星期了,左右尝试,但似乎找不到答案。我可能还有更多问题。

我们有一个应用程序在其活动之一中使用 Unity 视图来呈现一些图形。由于这是一个普通的应用程序,而不是我们想要删除沉浸式模式和全屏的游戏,因此我们可以恢复系统栏(状态和导航)

自从最新版本的 Unity 以来,他们在 Android 的播放器设置中添加了 Start in fullscreen mode 选项。问题是上面的选项只带回导航栏。

下一步是尝试用一些本地 Android 编码带回来。所以基本上是这样的: this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 完成工作并恢复状态栏。

在我使用高纵横比 (18.5:9 - Pixel 3 XL - Android 9) 设备之前,它一直很有效。

如果我简单地使用 Unity 全屏选项来实现它,图形可以很好地缩放,但我没有状态栏,这对于缺口来说更加明显 phone:

如果我从 Android 中删除全屏标志,那么我会恢复状态栏,但渲染会中断:

???就是出现的黑色区域。

抱歉,我无法向您展示实际的应用程序。

现在,我玩弄了所谓 "immersive mode" 的其他标志:

// When init of Unity
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.showSystemUi();
this.addUiVisibilityChangeListener();

// What the above does
private static int getLowProfileFlag() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
            View.SYSTEM_UI_FLAG_FULLSCREEN : View.SYSTEM_UI_FLAG_LOW_PROFILE;
}

private void showSystemUi() {
    this.mUnityPlayer.setSystemUiVisibility(this.mUnityPlayer.getSystemUiVisibility() & ~getLowProfileFlag());
}

private void addUiVisibilityChangeListener() {
    this.mUnityPlayer.setOnSystemUiVisibilityChangeListener(visibility -> RadarOverviewActivity.this.showSystemUi());
}

在某些情况下,图形区域上方会出现类似大小的黑条。

最后,当黑条出现时,原生 UI 也中断了。对于底部栏,应该有一些工具被推到图形实际开始的地方。底部的黑条是 UnityPlayer 的一部分,因为触摸那里实际上会引起与图形的交互。顶部栏,当它在那里时,甚至更奇怪。该区域实际上是本机工具栏应该在的地方,并且在某种程度上是这样。它看不见,但触摸那里会触发 UI 事件!!!看起来 Unity 视图在不全屏时无法正确放置自己,因为 Native UI 最初显示正确但当 Unity 启动时一切都很奇怪。再次强调一下。这仅发生在高纵横比设备中。 16:9 设备似乎没有问题。

所以主要问题是,如何将应用程序从全屏模式中取出,同时出现状态栏并且不破坏 Unity 在高方面的渲染?

我不是 100% 确定原因,但似乎其他人也有这个问题,特别是 Android 9。更新到 Unity 2019.1.5f1 实际上为我解决了这个问题。

我将此答案发布给可能需要它但目前尚未接受的其他人。我想首先确定问题点是什么。我会相应地更新。