Unityアプリでバナー広告を表示しようとすると、
UIに被ってしまう問題で悩んだ人は多いのではないでしょうか?
「MinuteMind」でも、下部ナビゲーションUI(bottomIconPanel
)にバナーが重なる問題に直面し、かなり試行錯誤しました。
この記事では、広告位置の調整を行っている具体的な処理(SetBannerPosition()
)について、実装レベルで丁寧に解説していきます。
なぜ自動配置(AdPosition)ではダメだったのか?
UnityのAdMob実装では、BannerView
に対して AdPosition.Top
や AdPosition.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との兼ね合いを計算しようRectTransform
とCanvas.scaleFactor
でUIサイズを正確に取得- DPI変換やSafeAreaの考慮も忘れずに
こういった細かい対応が、広告収益にもユーザー満足にもつながると実感しました。
コメント