Начиная с основной ветки выпуска GitHub об этом разработчики плагинов AdMob Unity заявили: «В следующем выпуске будет определена приоритетность совместимости надрезов». еще в октябре, отметив, что они знают об ошибке, и они опубликовали 22 января сообщение «Эта работа была отложена, но она будет включена в следующий выпуск. Пока нет никаких ETA, но это должно произойти в ближайшее время». Итак, кто знает, когда проблема когда-нибудь будет решена.
Но для всех, кто борется с этой проблемой: я нашел обходной путь. В моем случае это обходной путь для показа объявления внизу экрана, но я также упомяну, как его можно правильно отобразить вверху. Я все еще надеюсь на выпуск, который скоро исправит это, но есть вариант для тех, кто не хочет ждать ...
Я нашел этот обходной путь, потому что сначала начал с очевидного решения: вычислите позицию y вручную по очевидной формуле: int yDP = DensityIndependentPixels(Mathf.RoundToInt(Screen.safeArea.y + Screen.safeArea.height) - ScreenPixels(adSize.Height));
Это будет работать, за исключением того факта, что с Unity 2018.3.5 safeArea
всегда имеет 0 , 0 для x и y, и в то время как ширина и высота могут использоваться для определения наличия метки по сравнению с Display.main.systemHeight
(хотя, насколько я могу судить, Screen.height == safeArea.height
и то же самое для width
, поэтому safeArea
сейчас совершенно бесполезен, так как он передает только информацию, которую вы можете получить из Screen.height
и Screen.width
), вы не можете определить, где находится метка ... это означает, что в этом обходном пути я предполагаю, что метка находится на верхняя часть экрана (безопасное предположение, но в некоторых телефонах есть две метки, одна сверху и одна снизу, и для этих устройств мой обходной путь оставит рекламу частично закрытой нижней меткой ... если safeArea
когда-либо станет полезным значения, мой обходной путь может объяснить это ... в любом случае, я отвлекся.) ...
С этим предположением мы можем использовать слегка измененную формулу: int yDP = DensityIndependentPixels(Screen.height - ScreenPixels(adSize.Height));
Но, к сожалению, пока я регистрировал значения, я ожидал, что для позиции y ... она все еще обнаруживалась в той же странной позиции смещения! Я начал вручную увеличивать позицию y с 0 постепенно и подтвердил, что при определенной координате y, даже если вы увеличите значение, позиция, в которой оно появится, будет такой же! А потом я обнаружил, что если вы добавите чуть больше к значению y, это необъяснимым образом выскочит вверх в верхней части экрана, и вы могли бы продолжать увеличивать позицию y, чтобы вернуть его обратно на экран, за исключением того времени, когда это не не застрять в странной позиции смещения! После долгих экспериментов я обнаружил, что формула для этого необъяснимого дополнительного смещения y по кругу: (DensityIndependentPixels(Display.main.systemHeight) + adSize.Height)
, а при добавлении к intendedDensityIndependentPixelPosition
... теперь у вас есть баннер в позиции y, которую вы ожидали!
Как только вы упростите математику, ручная позиция y, которая является функциональным обходным путем для размещения баннера внизу на надрезанном устройстве, будет шокирующе простой:
int yDP = DensityIndependentPixels(Screen.height + Display.main.systemHeight);
Я проверил это на всех имитированных надрезах в Android 9, и это работает (с оговоркой, что двойная насечка частично покрывает рекламу, но это лучше, чем реклама, покрывающая пользовательский интерфейс приложения), но будьте осторожны что я еще не проверял это на реальных устройствах с надрезом!
Обратите внимание, что вам нужно делать это только тогда, когда Screen.height != Display.main.systemHeight
... в противном случае вы используете устройство без зазубрин и должны использовать AdPosition.BOTTOM
.
Для тех, кто хочет, чтобы ваш баннер отображался вверху, ручной расчет для y позиции еще проще. При том же предположении, что вырезы всегда находятся сверху, позиция y объявления должна быть установлена на DensityIndependentPixels(Display.main.systemHeight - Screen.height)
без какого-либо причудливого необъяснимого смещения обтекания. Обратите внимание, что я не проверял отображение баннера вверху, поскольку баннер в моем приложении всегда отображается внизу.
Ручная формула x позиции, чтобы убедиться, что объявление центрировано точно так, как вы ожидаете: int xDP = Mathf.RoundToInt(DensityIndependentPixels(Display.main.systemWidth - ScreenPixels(adSize.Width)) / 2f);
Ничего особенно странного там нет.
И последнее замечание. Я заметил, что после того, как я начал вручную указывать позицию объявления, я не мог позвонить Show()
после вызова Hide()
на BannerView
... он бы оказался в странном состоянии, где он был невидимый, но кликабельный; чтобы исправить это просто Destroy()
и создать новый AdRequest
вместо вызова Show()
... Я видел некоторые заявления на форумах поддержки Google, которые говорят, что в любом случае это лучше.
Надеюсь, день, когда я потерял погружение в эту причудливую проблему, и найти этот обходной путь кому-то здесь поможет.