【Unity】ゲーム終了前にセーブする|すぐ使える実例集#1

当ブログではアフィリエイト広告を含みます
Unity

今日からすぐに使えるUnity実例集と題して、「他のアプリでよく見るアレ」を実装していこうじゃないかという企画です。定期的に行っていくつもりですので、そのうち求めていた実装を紹介するかもしれません。是非チェックしにきてください。

早速ですが、今回はセーブに関する話題です。

アプリを閉じたはずなのに、次に起動したら「え、さっきの進行どこ行った?」となった経験、ありませんか?KuroMikanはあります。

・ホームボタンを押した
・アプリをバックグラウンドに送った
・電話がかかってきた
・OSに突然落とされた

プレイヤー側から見ると「普通にゲームを終えた」つもりでも、開発者側からすると想定外の終了ルートはかなり多いです。

今回は、そんな“あるある事故”を防ぐためのゲーム終了前に自動でセーブする仕組みを、Unityで実装していきます。

「アプリ終了」は1種類じゃない

まず前提として知っておきたいのは、
Unityでは「ゲーム終了=OnApplicationQuit」だけでは足りないという点です。

特にモバイルでは、以下のようなケースが頻発します。

・ホームボタンでバックグラウンドへ
・他アプリ起動による中断
・OSのメモリ管理による強制終了

このうち、OnApplicationQuitが呼ばれないケースも普通にあります。
つまり「終了時にセーブするつもりだったのに、保存されない」事故が起きやすいわけです。

基本戦略:2つのタイミングでセーブする

結論から言うと、
以下の2つを両方実装するのが安定します。

  1. アプリが終了するとき
  2. アプリがバックグラウンドに入るとき

これにより、かなりのケースをカバーできます。

Unityでの実装例

OnApplicationQuit(アプリ終了時)

まずは定番の終了イベントです。

void OnApplicationQuit()
{
    SaveGame();
}

エディタ停止時や、PCビルドでは確実に呼ばれます。
ただし、モバイルではこれだけだと不十分です。

OnApplicationPause(バックグラウンド遷移)

ここが重要ポイントです。

void OnApplicationPause(bool pause)
{
    if (pause)
    {
        SaveGame();
    }
}

pause == true のとき、
アプリはバックグラウンドに入ろうとしています。

プレイヤー視点では「ちょっと閉じただけ」ですが、
この後そのままOSに落とされる可能性も高いため、
ここで必ずセーブしておくのが安全です。

セーブ処理は「軽く」しておく

終了直前の処理で重たいことをすると、
セーブが終わる前にアプリが落ちる可能性があります。

おすすめなのは、

・PlayerPrefs
・ローカルJSON保存
・メモリ上のデータを即時書き出すだけ

といった短時間で終わる処理に限定することです。

「クラウド保存」「通信必須の処理」は、ここではやらない方が安全です。


まとめ

ゲーム終了時のセーブは、プレイヤーの信頼を守るための必須実装です。

・OnApplicationQuitだけに頼らない
・OnApplicationPauseで必ず保存する
・終了直前の処理は軽くする

これだけでも、「進行が消えた!」というクレームは大きく減らせます。

地味ですが、作っておくと確実に効いてくる仕組みなので、ぜひ早めに組み込んでおきましょう。

タイトルとURLをコピーしました