iOS対応

【Unity×iOS】ステータスバー(ヘッダー)を表示する方法|ヘッダーを隠さないSafe Area対応

iOS 向けに Unity でゲームをビルドすると、デフォルトではステータスバー(時計・電波・バッテリー表示のあるヘッダー)が非表示になります。しかし「時計や通知領域を常時見せておきたい」「シンプルなウィジェット系ゲームで OS 標準 UI を残したい」——そんなケースも少なくありません。この記事では ステータスバーを隠さずに Unity 製 iOS ゲームを動かす手順 を Safe Area 対応込みで解説します。

この記事で分かること

  1. Unity が iOS でステータスバーを自動的に隠す理由
  2. Player Settings と Info.plist の正しい設定方法
  3. Objective-C(++) プラグインでステータスバーを制御するコード例(コピペ可)
  4. Safe Area を使って UIをノッチ・Dynamic Island 衝突から守る方法

なぜUnityはヘッダーを隠すのか?

  • フルスクリーン前提でゲーム画面を確保 → UI 破綻を防ぐ
  • iPhone X 以降は ノッチや Dynamic Island があるため、誤表示を避けたい
  • そのため Status Bar Hidden = true がデフォルトで書き出される

つまり設定を明示的に変えれば表示できるというのが今回のポイントです。

Player SettingsとInfo.plistを編集してヘッダーを常時表示する手順

手順設定場所
Player → Resolution & Presentation → Status Bar Hiddenfalse
Player → Resolution & Presentation → Status Bar StyleDark Content / Light Content(好み)
Player → Other Settings → Requires Full Screenfalse(iPad 分割表示も許可する場合)
Info.plist 追加/確認
UIViewControllerBasedStatusBarAppearance
YES 推奨(コードで動的制御しやすい)

Objective-C++プラグインを使ったステータスバーの動的制御【コピペOK】

Player Settingsだけで常時表示はできますが、「起動画面だけは隠してゲーム画面では出す」といった細かい制御には Objective-C++ プラグインが便利です。

フォルダ構成

Assets/
└─ Plugins/
   └─ iOS/
      └─ StatusBarPlugin.mm

StatusBarPlugin.mm(コピペOK)

#import <UIKit/UIKit.h>

extern "C" {

// ステータスバーを表示
void ShowStatusBar()
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] setStatusBarHidden:NO
                                                withAnimation:UIStatusBarAnimationFade];
    });
}

// ステータスバーを非表示
void HideStatusBar()
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] setStatusBarHidden:YES
                                                withAnimation:UIStatusBarAnimationFade];
    });
}
}

C#スクリプト

シーン開始時に StatusBarPlugin.Show() を呼び出すだけでヘッダーを復活できます。

using System.Runtime.InteropServices;
using UnityEngine;

public static class StatusBarPlugin
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")] private static extern void ShowStatusBar();
    [DllImport("__Internal")] private static extern void HideStatusBar();
#else
    private static void ShowStatusBar() { }
    private static void HideStatusBar() { }
#endif

    public static void Show() => ShowStatusBar();
    public static void Hide() => HideStatusBar();
}

Safe Area対応:ノッチ・Dynamic Islandを避けるUIレイアウト実装

ステータスバーを表示したままでも、UIがノッチやDynamic Islandに被るとタップ漏れや視認性低下の原因になります。Unity UIでは以下 2 つが王道。

Screen.safeAreaを使うスクリプト

UIルート (Canvas 配下の Panel 等) に付けるだけで、自動的にノッチを避けた矩形でレイアウトされます。

using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// Safe Area に合わせて RectTransform をリサイズ
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class SafeAreaFitter : MonoBehaviour
{
    void Awake()
    {
        var rt = GetComponent<RectTransform>();
        var area = Screen.safeArea;

        // 左下原点 → Pivot (0,0) 前提
        rt.anchorMin = area.position / new Vector2(Screen.width, Screen.height);
        rt.anchorMax = (area.position + area.size) / new Vector2(Screen.width, Screen.height);
    }
}

Unity 2022.2〜のSafe Area バックグラウンド

Unity 2022.2以降なら Player Settings → Resolution & Presentation → Render Outside Safe Area を OFF にしても OK。自動的にレターボックスを生成してくれます。

まとめ

やることポイント
Player Settings で Status Bar Hidden = false基本設定
Info.plist で UIViewControllerBasedStatusBarAppearance = YES動的制御に必須
Objective-C++ プラグインで Show/Hide 関数を用意シーンごとに切り替え可能
Safe Area 対応スクリプトを UI ルートに付与ノッチ・Dynamic Island を回避

ステータスバーを活かすことで、カジュアルゲームや情報系アプリ風 UI を作る際の没入感コントロールが容易になります。
ぜひあなたの Unity × iOS プロジェクトで試してみてください!