📝

Unityでステータスバーの文字色が端末ごとに変わる問題と、その安定解

に公開

Unityでモバイルアプリを作っていると、ステータスバーの文字色が端末によって白になったり黒になったりする問題に遭遇することがあります。特にAndroidは端末依存が大きく、開発者の端末では黒文字なのに、テスターの端末では白文字になるといった状況が普通に発生します。

自分のアプリでも、Android/iOSの両方でこの問題に悩まされました。本記事では、複数の実機検証と試行錯誤の末にたどり着いた、最も再現性が高い解決策をまとめます。


ステータスバーの文字色が統一されない理由

Android:OSとメーカー実装に依存

Androidはステータスバーの文字色を、背景の明度を元に自動判定しています。一般的には、

  • 背景が明るい → 黒文字
  • 背景が暗い → 白文字

となるのですが、判定基準がメーカーごとに微妙に異なり、Xiaomi、Oppo、Samsungなどで結果が変わります。さらにUnityの標準設定だけでは、この挙動を強制できません。

iOS:SafeArea×背景色の影響を受ける

iOSは preferredStatusBarStyle によって色が決まりますが、Unity上では背景色やカメラ設定の影響を受け、意図しない色になる場合があります。


Unity標準だけでは“完全固定”は難しい

Unityの「Status Bar Hidden」や、「Use Cutout」を調整しても、実機の挙動が端末ごとにブレるため、開発者側で色を強制しきれません。

実際に自分の環境では、

  • 開発端末では黒文字
  • テスターの端末では白文字
  • iPadでは黒だがiPhoneは白

という謎挙動が確認されました。


結論:背景Panelを敷いてOSに“黒文字を選ばせる”のが最も安定

最終的に一番安定した方法は、

ステータスバー領域に明るい色の背景Panelを敷く

というUI側のアプローチでした。

OSが「背景が明るい」と判断するため、黒文字を安定して適用してくれます。AndroidでもiOSでも一貫して動作し、Unity側だけで完結するのが強みです。

実際の構成

  • Canvasの最上部にRectTransformを1枚配置
  • SafeAreaを取得して高さを動的に調整
  • 色を #F5F5F5 程度の明るい色で統一

この構成にするだけで、多数の端末で黒文字が安定しました。


実装例(SafeAreaに合わせてPanel高さを調整)

using UnityEngine;
using UnityEngine.UI;

public class StatusBarFiller : MonoBehaviour
{
    public RectTransform statusBarPanel;

    void Start()
    {
        ApplySafeArea();
    }

    void ApplySafeArea()
    {
        Rect safe = Screen.safeArea;
        Vector2 screenSize = new Vector2(Screen.width, Screen.height);
        float topMargin = screenSize.y - safe.yMax;
        statusBarPanel.sizeDelta = new Vector2(0, topMargin);
    }
}

このコードでは、端末ごとに異なるステータスバー高さを自動で取得し、Panelに正しいサイズを適用しています。


iOSでも安定して黒文字にできる

iOSはUnityの背景色に影響されやすく、特に暗い背景+SafeAreaの組み合わせで白文字が出やすいですが、

  • ステータスバー領域に明るいPanelを敷く

という方法なら安定します。

これにより、iPhone・iPad・シミュレーターの挙動が揃いました。


よくある落とし穴

1. AndroidManifestの設定では端末依存が消えない

メーカーやOSバージョンが違う限り、完全な強制はできません。

2. 背景を暗くすると高確率で白文字になる

UI全体が暗いアプリで発生しやすいです。

3. SafeAreaを無視するとノッチ端末で破綻

必ずSafeAreaと組み合わせて制御しましょう。


まとめ

  • Android/iOSどちらもステータスバー色はOSの判断に依存するため、Unity標準では完全固定が難しい
  • Unity側で明るい背景Panelを敷く方法が最も再現性が高かった
  • SafeAreaと組み合わせることで多くの端末で黒文字が安定
  • ネイティブコード不要で実装できるため、個人開発の現場でも有効

この方法は、実際のアプリ開発において複数のテスター端末で検証して安定した手法です。同じ問題で悩んでいる方の参考になれば幸いです。


ブログでもUnityや個人開発ネタを発信中です!

開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com

公開中のアプリ一覧はこちら!

実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/

YouTubeショートでもゲーム開発の裏側を公開中!

Unityで制作中のゲームの進捗や演出テスト、実装の様子を
ショート動画でタイムラプス形式にまとめて発信しています。
▶https://www.youtube.com/@syunpp_8413/shorts

Discussion