AdMob広告の表示位置でめちゃくちゃ悩んだ話【Unity UIと重なる問題】

App

Unityアプリでバナー広告を表示しようとすると、
UIに被ってしまう問題で悩んだ人は多いのではないでしょうか?

「MinuteMind」でも、下部ナビゲーションUI(bottomIconPanel)にバナーが重なる問題に直面し、かなり試行錯誤しました。

この記事では、広告位置の調整を行っている具体的な処理(SetBannerPosition())について、実装レベルで丁寧に解説していきます。


なぜ自動配置(AdPosition)ではダメだったのか?

UnityのAdMob実装では、BannerViewに対して AdPosition.TopAdPosition.Bottom を指定できますが、
これだけだとUIとバナー広告の重なりを避けられません。

  • AdPosition.Bottom → スマホのナビゲーションバーやUIと被る
  • AdPosition.Top → ヘッダーやタイトルUIと重なる
  • CanvasScalerが効いていると、意図しない表示崩れが発生する

独自にY座標を計算して広告を表示する

「MinuteMind」では、広告の位置を実際のUIサイズを加味して計算する方式を取りました。

その処理がこちら

private void SetBannerPosition()
{
if (bannerView == null || bottomIconPanel == null) return;

float dpi = Screen.dpi > 0 ? Screen.dpi : 160f;
float densityScale = dpi / 160f;

float scaleFactor = bottomIconPanel.GetComponentInParent<Canvas>().scaleFactor;
float uiHeight = bottomIconPanel.rect.height * scaleFactor;
float bannerHeight = bannerView.GetHeightInPixels();

#if UNITY_IOS && !UNITY_EDITOR
float safeBottomPadding = Screen.height - (Screen.safeArea.y + Screen.safeArea.height);
int yPosition = Mathf.RoundToInt((Screen.height - uiHeight - bannerHeight - safeBottomPadding) / densityScale);
#else
int yPosition = Mathf.RoundToInt((Screen.height - uiHeight - bannerHeight) / densityScale);
#endif

bannerView.SetPosition(0, yPosition);
}

詳細解説:何をしているのか?

bottomIconPanelの高さを取得

float uiHeight = bottomIconPanel.rect.height * scaleFactor;

→ UI下部ナビゲーションの高さ(実際の描画サイズ)を取得。
これが広告と被らないようにするための基準。


bannerView.GetHeightInPixels() で広告の高さを取得

→ バナーの高さ(px)を得て、重ならないように表示位置を下げるために使う。


densityScale でデバイスごとのDPI変換

float dpi = Screen.dpi > 0 ? Screen.dpi : 160f;
float densityScale = dpi / 160f;

→ デバイスに応じてdp単位に変換することで、機種ごとの差異を吸収


最終的なY座標を計算

int yPosition = Mathf.RoundToInt((Screen.height - uiHeight - bannerHeight) / densityScale);

→ スクリーン全体からUIと広告の高さを引いた位置に配置。

※ iOSの場合はさらに SafeArea によるパディングも考慮!


なぜ Invoke("SetBannerPosition", 0.5f) しているの?

RequestBanner()内でこのように呼び出しています:

Invoke("SetBannerPosition", 0.5f);
  • 広告が非同期で読み込まれるため、ちょっと遅らせてから位置をセットしないとずれることがある
  • 描画タイミングのずれを防ぐため、0.5秒後に実行している

結果どうなったか?

  • 全機種でUIとの重なりがなくなり、自然な見た目に
  • SafeAreaやDPIを考慮しているので、iPhoneでもAndroidでも安定表示
  • 自前で広告位置を制御することで、ユーザー体験が損なわれない設計にできた

まとめ

Unityでバナー広告を導入するとき、見落としがちな「位置調整」こそがUXの良さを決める要素になります。

  • AdPositionだけで満足せず、UIとの兼ね合いを計算しよう
  • RectTransformCanvas.scaleFactorでUIサイズを正確に取得
  • DPI変換やSafeAreaの考慮も忘れずに

こういった細かい対応が、広告収益にもユーザー満足にもつながると実感しました。

コメント

タイトルとURLをコピーしました