Android / Unity - полноэкранный режим, строка состояния Android и 3D-пропорции - PullRequest
1 голос
/ 03 июня 2019

Я ломал голову всю неделю, пытаясь что-то повернуть налево и направо, и я не могу найти ответ. У меня могло бы быть больше вопросов.

У нас есть приложение, которое использует представление Unity в одном из своих действий для представления некоторой графики. Поскольку это обычное приложение, а не игра, мы хотим убрать режим погружения и полноэкранный режим, чтобы можно было вернуться к системным панелям (статус и навигация)

Теперь, начиная с последних версий Unity, они добавили опцию Start in fullscreen mode в настройках плеера для Android. Проблема в том, что вышеупомянутая опция возвращает только панель навигации.

Следующим шагом было попытаться вернуться с некоторой нативной кодировкой Android. Так что в основном это: this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); выполняет работу и возвращает строку состояния.

Теперь это работало как шарм, пока я не перешел на устройство с высоким соотношением сторон (18,5: 9 - Pixel 3 XL - Android 9).

Если я сделаю это просто с полноэкранной опцией Unity, графика прекрасно масштабируется, но у меня нет строки состояния, что еще более очевидно для телефона с надрезом:

enter image description here

Если я уберу флаг полноэкранного режима из Android, тогда я получу обратно свою строку состояния, но рендеринг будет прерван:

enter image description here

??? - это черная область, которая появляется.

Извините, я не могу показать вам реальное приложение.

Теперь я поиграл с другими флагами так называемого "режима погружения":

// 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());
}

и при определенных обстоятельствах черная полоса аналогичного размера появляется над графической областью.

Наконец, когда появляются черные полосы, собственный интерфейс также ломается. Для нижней панели должен быть какой-то инструмент, который подталкивается туда, где фактически начинается графика. Нижняя черная полоса является частью UnityPlayer, поскольку прикосновение к ней может вызвать взаимодействие с графикой. Верхний бар, когда он там, еще более странный. Эта область на самом деле там, где должна быть и в каком-то смысле родная панель инструментов. Это не видно, но касание там вызывает события пользовательского интерфейса !!! Похоже, что представление Unity не может правильно расположиться, когда оно не в полноэкранном режиме, так как Native UI изначально отображается правильно, но когда включается Unity, все становится странно. Чтобы обратить внимание еще раз. Это происходит только в высоких устройствах аспекта. Устройства 16: 9, похоже, не имеют проблем.

Итак, главный вопрос: как вывести приложение из полноэкранного режима, чтобы строка состояния отображалась и не нарушала рендеринг Unity в высоких аспектах?

1 Ответ

0 голосов
/ 05 июня 2019

Я не на 100% уверен в том, почему, но похоже, что другие люди имели эту проблему, особенно с Android 9. Обновление до Unity 2019.1.5f1 фактически решило эту проблему для меня.

Я публикую этот ответ для кого-то еще, кто может нуждаться в нем, но пока не принимает его. Я хочу сначала убедиться, в чем заключалась проблема. Я буду обновлять соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...