使用環境
・Unity Editor:2021.3.18f1
この記事で分かること
- iOSアプリのライフサイクル(フォアグラウンド・バックグラウンド)とは?
- Unity標準のイベントで非表示・再表示を検知する方法
- コピペOK!OnApplicationPauseとOnApplicationFocusの使い分け
- よくある落とし穴と実装時の注意点
iOSの非表示・再表示・バックグラウンドとは?
ピッグダディ
UnityでiOSアプリを作っていて、「アプリがホームに戻ったとき」「戻ってきたとき」にうまく制御したいって思ったことありませんか?
ピッグボーイ
あります!
戻ってきた時に強制的にタイトル画面に飛んだりして困ってました。
ピッグガール
勝手に再ログインとかされると、ユーザーも離れていきますよね…
ピッグダディ
その通りです。
この記事では、アプリのバックグラウンド移行・復帰をUnityで検知する方法を紹介します。
コピペで使えるサンプルコードと、iOS特有の注意点も解説するので、初心者でも安心して実装できますよ!
iOSアプリのライフサイクルとは?
iOSアプリは、次のようなライフサイクルで状態が切り替わります。
状態 | 説明 |
---|---|
フォアグラウンド | 画面に表示され、操作可能な状態 |
バックグラウンド | 非表示状態だが一時的にメモリ上に存在 |
サスペンド | メモリにも存在せず停止寸前状態(iOS管理) |
ユーザーがホームボタン(もしくはスワイプ)でアプリを閉じたり、別アプリに切り替えた時に、バックグラウンド→再表示(復帰)が発生します。
これをUnityで検知できれば、
- ゲームを一時停止したり
- データのオートセーブをしたり
- ネットワークセッションを切断したり など、ユーザー体験の向上に繋げることができます!
Unity標準のイベントで非表示・再表示を検知する
Unityには、アプリ状態の変化を検知できる標準イベントが2つ用意されています。
OnApplicationPause(bool pauseStatus)
- pauseStatus == true ならアプリがバックグラウンドへ移行
- pauseStatus == false ならアプリがフォアグラウンド復帰
void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
{
Debug.Log("アプリがバックグラウンドに入りました");
}
else
{
Debug.Log("アプリがフォアグラウンドに復帰しました");
}
}
ほとんどのケースでは、これだけで十分です!
OnApplicationFocus(bool hasFocus)
- hasFocus == true なら操作可能な状態
- hasFocus == false なら外れた状態(例えばコールが来た時なども)
void OnApplicationFocus(bool hasFocus)
{
if (hasFocus)
{
Debug.Log("アプリにフォーカスが戻りました(操作可能)");
}
else
{
Debug.Log("アプリからフォーカスが外れました");
}
}
注意点:
OnApplicationFocusは単純なバックグラウンド移行以外にも反応するため、
確実に「非表示→再表示」を検知したいなら、OnApplicationPauseを使う方が安全です。
【コピペOK】バックグラウンド検知スクリプト
このスクリプトを、シーンに存在するどこかのGameObjectにアタッチしておけばOK!
using UnityEngine;
public class AppLifecycleHandler : MonoBehaviour
{
private void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
{
Debug.Log("バックグラウンドへ移行");
// 例)自動セーブ、ネットワーク切断
}
else
{
Debug.Log("フォアグラウンドに復帰");
// 例)データ再ロード、ネットワーク再接続
}
}
private void OnApplicationFocus(bool hasFocus)
{
Debug.Log($"アプリフォーカス状態: {(hasFocus ? "取得" : "喪失")}");
// ※通知表示後など、細かい制御が必要ならこちらも併用
}
}
よくある落とし穴と注意点
問題 | 解説 | 対策 |
---|---|---|
通知バナーが出たときにもOnApplicationFocusが呼ばれる | フォーカス喪失だけでは必ずしも「非表示」とは限らない | OnApplicationPause中心で管理する |
アプリ復帰直後にシーン遷移してしまう | 状態復帰タイミングで別処理が動くと不具合の原因に | 1フレーム遅らせる or フラグ管理 |
iOSのタスクキル(完全終了)時は検知できない | アプリが生きていないため通知されない | バックグラウンド復帰だけに絞って設計する |
まとめ
ポイント | 内容 |
---|---|
アプリ非表示・再表示はUnity標準イベントで検知可能 | OnApplicationPause(bool) を活用 |
iOSではバックグラウンド復帰管理が重要 | 自動セーブ、ネット切断/再接続に応用 |
OnApplicationFocusは補助的に使う | 細かいUXチューニングに便利 |
iOS向けUnityアプリでは、非表示・再表示イベントを正しく処理することがユーザー満足度に直結します!
ぜひ今回紹介したテクニックを、あなたのアプリに取り入れてみてください。