今日からすぐに使えるUnity実例集と題して、「他のアプリでよく見るアレ」を実装していこうじゃないかという企画です。定期的に行っていくつもりですので、そのうち求めていた実装を紹介するかもしれません。是非チェックしにきてください。
早速ですが、今回はセーブに関する話題です。
アプリを閉じたはずなのに、次に起動したら「え、さっきの進行どこ行った?」となった経験、ありませんか?KuroMikanはあります。
・ホームボタンを押した
・アプリをバックグラウンドに送った
・電話がかかってきた
・OSに突然落とされた
プレイヤー側から見ると「普通にゲームを終えた」つもりでも、開発者側からすると想定外の終了ルートはかなり多いです。
今回は、そんな“あるある事故”を防ぐためのゲーム終了前に自動でセーブする仕組みを、Unityで実装していきます。
「アプリ終了」は1種類じゃない
まず前提として知っておきたいのは、
Unityでは「ゲーム終了=OnApplicationQuit」だけでは足りないという点です。
特にモバイルでは、以下のようなケースが頻発します。
・ホームボタンでバックグラウンドへ
・他アプリ起動による中断
・OSのメモリ管理による強制終了
このうち、OnApplicationQuitが呼ばれないケースも普通にあります。
つまり「終了時にセーブするつもりだったのに、保存されない」事故が起きやすいわけです。
基本戦略:2つのタイミングでセーブする
結論から言うと、
以下の2つを両方実装するのが安定します。
- アプリが終了するとき
- アプリがバックグラウンドに入るとき
これにより、かなりのケースをカバーできます。
Unityでの実装例
OnApplicationQuit(アプリ終了時)
まずは定番の終了イベントです。
void OnApplicationQuit()
{
SaveGame();
}
エディタ停止時や、PCビルドでは確実に呼ばれます。
ただし、モバイルではこれだけだと不十分です。
OnApplicationPause(バックグラウンド遷移)
ここが重要ポイントです。
void OnApplicationPause(bool pause)
{
if (pause)
{
SaveGame();
}
}
pause == true のとき、
アプリはバックグラウンドに入ろうとしています。
プレイヤー視点では「ちょっと閉じただけ」ですが、
この後そのままOSに落とされる可能性も高いため、
ここで必ずセーブしておくのが安全です。
セーブ処理は「軽く」しておく
終了直前の処理で重たいことをすると、
セーブが終わる前にアプリが落ちる可能性があります。
おすすめなのは、
・PlayerPrefs
・ローカルJSON保存
・メモリ上のデータを即時書き出すだけ
といった短時間で終わる処理に限定することです。
「クラウド保存」「通信必須の処理」は、ここではやらない方が安全です。
まとめ
ゲーム終了時のセーブは、プレイヤーの信頼を守るための必須実装です。
・OnApplicationQuitだけに頼らない
・OnApplicationPauseで必ず保存する
・終了直前の処理は軽くする
これだけでも、「進行が消えた!」というクレームは大きく減らせます。
地味ですが、作っておくと確実に効いてくる仕組みなので、ぜひ早めに組み込んでおきましょう。

