iOS 向けに Unity でゲームをビルドすると、デフォルトではステータスバー(時計・電波・バッテリー表示のあるヘッダー)が非表示になります。しかし「時計や通知領域を常時見せておきたい」「シンプルなウィジェット系ゲームで OS 標準 UI を残したい」——そんなケースも少なくありません。この記事では ステータスバーを隠さずに Unity 製 iOS ゲームを動かす手順 を Safe Area 対応込みで解説します。
この記事で分かること
- Unity が iOS でステータスバーを自動的に隠す理由
- Player Settings と Info.plist の正しい設定方法
- Objective-C(++) プラグインでステータスバーを制御するコード例(コピペ可)
- Safe Area を使って UIをノッチ・Dynamic Island 衝突から守る方法
なぜUnityはヘッダーを隠すのか?
- フルスクリーン前提でゲーム画面を確保 → UI 破綻を防ぐ
- iPhone X 以降は ノッチや Dynamic Island があるため、誤表示を避けたい
- そのため Status Bar Hidden = true がデフォルトで書き出される
つまり設定を明示的に変えれば表示できるというのが今回のポイントです。
Player SettingsとInfo.plistを編集してヘッダーを常時表示する手順
手順 | 設定場所 | 値 |
---|---|---|
① | Player → Resolution & Presentation → Status Bar Hidden | false |
② | Player → Resolution & Presentation → Status Bar Style | Dark Content / Light Content(好み) |
③ | Player → Other Settings → Requires Full Screen | false(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 プロジェクトで試してみてください!