スポンサーリンク
UnityUnityメモ

Unityでセーブスロット選択画面を作る方法|JSON・PlayerPrefs・Easy Save 3を比較解説

Unity

はじめに

ゲーム開発において「セーブできるかどうか」は、プレイヤーの体験を大きく左右しますよね。 特にRPGやADV、シミュレーション系のゲームでは、複数の進行状況を管理できる「セーブスロット選択画面」は、もはや必須の機能と言っても過言ではありません。

ただ、いざUnityで実装しようとすると、こんなことで悩みませんか?

  • スロットごとに「レベル・所持金・プレイ時間」を表示したい
  • データがあるスロットと空のスロットでUIを切り替えたい
  • ロード画面を開くたびに処理が重くなるのを避けたい
  • 上書き保存や削除処理がどんどん複雑になる

セーブスロットの実装は、「保存処理」だけでなく「UI・設計・パフォーマンス」まで含めて考える必要があるため、初心者の方はもちろん、ある程度Unityに慣れている方でもつまずきやすいポイントです。

この記事では、Unityで「セーブスロット選択画面」を作るために知っておきたい考え方と、代表的な3つの実装アプローチを整理して解説していきます。

  • 最短で安定した実装ができる Easy Save 3
  • 拡張性と管理性を重視した JSONによる自作実装
  • 小規模向けの PlayerPrefsによる簡易実装

それぞれの方法について、どんなゲームに向いているのかどこで注意すべきかを実例ベースでお話しします。 「とりあえず動く」ではなく、あとから困らないセーブスロット設計を一緒に作っていきましょう😊


セーブスロット選択画面でよくある悩み

セーブ機能そのものは作れたのに、セーブスロット選択画面の実装で一気に難易度が上がった、という声はとても多いです。 私も最初は「保存できればOKでしょ?」と思っていたのですが、実際に作り始めると想像以上に考えることが多いんですよね。

特につまずきやすいのが、次のようなポイントです。

  • このスロットにセーブデータが存在するかどうかをどう判定する?
  • 「ニューゲーム」と「ロード」をスロットごとに切り替えたい
  • 概要表示のために毎回セーブデータ全文を読み込んでいいの?
  • スロット数が増えたら処理が重くならない?

特に多い失敗が、スロット選択画面を開くたびに、巨大なセーブデータをすべて読み込んでしまうケースです。 レベルや所持金を表示したいだけなのに、マップ情報やフラグ、インベントリまで全部ロードしてしまうと、ロード時間が目に見えて伸びてしまいます。

また、UI周りも意外と厄介です。

  • データがあるスロット → ロードボタンを表示
  • 空のスロット → ニューゲームボタンを表示
  • 上書き時は確認ダイアログを出す

こうした制御を場当たり的に追加していくと、条件分岐だらけの読みにくいスクリプトになりがちです。 後から「スロット削除を追加したい」「オートセーブを入れたい」となった瞬間に、修正が地獄になります…。

だからこそ、セーブスロットは最初に「どういう設計で管理するか」を決めることがとても大切です。 次の章では、実際に使われることが多い3つの実装アプローチを比較しながら、それぞれの向き・不向きを整理していきます。




セーブスロット実装の3つのアプローチ比較

Unityでセーブスロット選択画面を作る方法は、実はひとつではありません。 ゲームの規模や開発目的によって、最適な実装方法は大きく変わります

ここでは、よく使われる次の3つのアプローチを比較しながら見ていきましょう。

  • Easy Save 3 を使う方法
  • JSONで自作する方法
  • PlayerPrefsで管理する方法

「どれが正解」という話ではなく、どんなゲームに向いているかを知ることが大切です。


① Easy Save 3 を使う方法(最短・安定)

とにかく早く、確実にセーブスロットを実装したい場合に最適なのが、Easy Save 3を使う方法です。 セーブスロット用のUIや管理機能が最初から用意されているため、設計で悩む時間を大幅に減らせます

向いているケースはこんな感じです。

  • 個人・少人数開発でスピード重視
  • RPG・ADVなどセーブが重要なゲーム
  • セーブ周りでバグを出したくない

一方で、「内部の仕組みをすべて把握したい」「完全自作にこだわりたい」という人には、ややブラックボックスに感じるかもしれません。


② JSONで自作する方法(柔軟・拡張向け)

拡張性や将来のアップデートを重視するなら、JSONで自作する方法が有力です。 セーブデータの構造を自分で設計できるため、大規模なゲームや長期運用を前提としたタイトルに向いています。

この方法の特徴は、

  • データ構造を完全にコントロールできる
  • 概要用データと本体データを分離できる
  • バージョン管理や移行設計がしやすい

その分、設計ミスがあると後から修正が大変になるため、最初の設計がとても重要になります。 「セーブスロットは後で考えよう」は、だいたい失敗します…。


③ PlayerPrefsで管理する方法(小規模・簡易)

もっとも手軽なのが、PlayerPrefsを使った方法です。 キーにスロットIDを付けることで、疑似的に複数セーブスロットを実現できます。

向いているのは次のようなケースです。

  • ミニゲームやプロトタイプ
  • 保存するデータ量が少ない
  • 設定情報の保存がメイン

ただし、データ量が増えたり構造が複雑になると、一気に管理がつらくなります。 本格的なゲームでは、あくまで「簡易手段」として考えておくのが安全です。

このあとからは、それぞれの方法について実際の実装イメージを見ていきます。 まずは、もっとも導入しやすく失敗しにくいEasy Save 3を使ったセーブスロット実装から解説していきますね。




Easy Save 3でセーブスロット選択画面を作る方法

「セーブスロットの設計で悩みたくない」「できるだけ早く安定した仕組みを作りたい」 そんなときに心強いのが Easy Save です。

Easy Save 3は、Unity向けの定番セーブ&ロードアセットで、 複数セーブスロット・上書き確認・ロード制御といった面倒な部分を最初からカバーしてくれます。

なぜEasy Save はセーブスロットと相性がいいの?

セーブスロット実装で大変なのは、「保存処理」よりも実は周辺の管理です。 Easy Save 3が便利な理由は、次の点にあります。

  • セーブ用・ロード用のスロットUIが用意されている
  • スロットごとのファイル管理を意識しなくていい
  • 上書き確認ダイアログが標準対応
  • スロット選択後のシーン遷移まで一括管理できる

「このスロットにデータある?」「上書きして大丈夫?」 といった毎回作りがちな処理を自分で書かなくていいのは、かなり大きなメリットです。

導入と基本設定の流れ

Easy Save を使ったセーブスロット実装は、大まかに次の流れになります。

  1. Easy Save をプロジェクトに導入
  2. シーンにSave Slot / Load Slotを追加
  3. ES3SlotManagerで挙動を設定
  4. 通常のセーブ処理を呼び出す

特に重要なのが、ES3SlotManagerの設定です。

  • 上書き時に確認ダイアログを出すか
  • スロット選択後に遷移するシーン
  • 保存ファイルのディレクトリや拡張子

ここを正しく設定しておくだけで、セーブスロット周りの挙動が一気に安定します。

Easy Save を使うならここから

「自作よりも、まずはちゃんと動くものを作りたい」 「セーブデータ周りでバグに悩みたくない」 という人には、Easy Save はかなり相性がいい選択肢です。

Easy Save をアセットストアでチェックする

このあと、「自作したい人向け」に、 JSONを使ったセーブスロット実装と高速化の考え方を解説していきます。 Easy Saveを使う場合でも、設計の考え方自体はとても参考になるので、ぜひ続けて読んでみてくださいね。




JSONを使ったセーブスロットの実装方法(自作派向け)

「セーブ周りは自分でコントロールしたい」 「将来のアップデートや拡張にも耐えられる設計にしたい」 そんな人に向いているのが、JSONを使った自作のセーブスロット実装です。

最初は少し大変ですが、仕組みをきちんと作っておけば、 大規模なRPGや長期運用を前提としたゲームでも安心して使い続けられます。

基本的な構成イメージ

JSON方式では、まず「どんなデータを保存するか」をクラスとして定義します。

  • プレイヤーのステータス
  • 現在のレベル・マップ情報
  • 所持金・フラグ・進行状況

これらを [System.Serializable] なクラスにまとめ、 JsonUtility.ToJson で文字列化して保存するのが基本の流れです。 保存先には Application.persistentDataPath を使うことで、 PC・スマホどちらでも安全にデータを扱えます。

JSONによるセーブ&ロードの基本については、こちらの記事で詳しく解説しています👇

セーブスロット管理の考え方

複数スロットを実装する場合は、スロットIDごとにファイルを分けるのが基本です。

  • slot1.json
  • slot2.json
  • slot3.json

スロット選択時には、File.Exists を使って 「このスロットにデータがあるかどうか」を判定し、 UIを切り替えるだけでOKです。

高速化のポイント:概要データを分ける

JSON方式で特に重要なのが、概要表示用データを別ファイルに分ける設計です。

セーブスロット選択画面では、

  • レベル
  • プレイ時間
  • 所持金

といった軽い情報だけ表示できれば十分ですよね。 そこで、

  • 本体用セーブデータ(slot1.json)
  • 概要用データ(slot1_info.json)

のようにファイルを分けておくと、ロード画面の表示が一気に軽くなります

スロット選択画面では概要用JSONだけを読み込み、 実際にロードするタイミングで本体データを読む。 この分離設計は、かなりおすすめです。

どんなゲームに向いている?

JSONによる自作セーブスロットは、次のようなゲームと相性がいいです。

  • セーブデータの項目が多いRPG
  • アップデートを前提とした運営型ゲーム
  • 将来的にデータ移行や互換性対応を考えている

少し設計コストはかかりますが、あとから困らないという意味では、 長期的に見てとてもコスパの良い方法です。




PlayerPrefsでセーブスロットを管理する方法(簡易実装)

「とにかく手軽に複数セーブを実装したい」 「まずはプロトタイプを作りたい」 そんな場合に使われるのが、PlayerPrefsを使ったセーブスロット管理です。

Unity標準機能なので導入コストはゼロ。 仕組みもシンプルなため、小規模ゲームや検証用には十分役立ちます。

基本的な考え方

PlayerPrefsで複数スロットを扱う場合は、 スロットIDをキー名に含めるのが基本です。

例えば、スロットIDを saveID とした場合、

  • PlayerPrefs.SetInt("Level_" + saveID, level);
  • PlayerPrefs.SetInt("Gold_" + saveID, gold);

のように保存します。 こうすることで、1つのPlayerPrefs内に複数スロット分のデータを持たせることができます。

スロット選択画面での判定方法

スロットにデータが存在するかどうかは、 PlayerPrefs.HasKey を使えば簡単に判定できます。

  • データがある → ロードボタンを表示
  • データがない → ニューゲームボタンを表示

UIの切り替えは SetActive を使うだけなので、 仕組み自体はとても分かりやすいです。

向いているケース・向いていないケース

PlayerPrefs方式が向いているのは、次のようなケースです。

  • ミニゲーム
  • 設定項目の保存
  • 短期間で作るプロトタイプ

一方で、次のような用途にはあまり向いていません。

  • セーブデータの項目が多いゲーム
  • 画像や複雑な構造を保存したい場合
  • 将来的な拡張やアップデートを考えている場合

データが増えてくるとキー管理が煩雑になり、 どのスロットに何が入っているのか分からなくなるのがよくある落とし穴です。

そのため、PlayerPrefsは 「とりあえず動かすための簡易手段」 と割り切って使うのがおすすめです。

次の章では、セーブスロット選択画面を一気に「それっぽく」できる、 サムネイル表示の実装方法について解説していきます📸




セーブスロットにサムネイルを表示する方法

セーブスロット選択画面で、 「どこまで進んだデータなのか」が一目で分かると、かなり親切ですよね。

そこでおすすめなのが、セーブ時の画面をサムネイルとして保存し、スロットに表示する方法です。 見た目の完成度が一気に上がり、プレイヤー体験もかなり良くなります。

基本的な実装アイデア

サムネイル表示の流れは、次の3ステップで考えると分かりやすいです。

  1. セーブ時にゲーム画面をキャプチャする
  2. 画像データを保存できる形に変換する
  3. スロット選択画面で復元して表示する

Unityでは ScreenCapture.CaptureScreenshotAsTexture を使うことで、 現在の画面を Texture2D として取得できます。

画像データを保存する方法

取得したテクスチャは、そのままでは保存できないため、 Base64文字列に変換してセーブデータの一部として保存する方法がよく使われます。

流れとしては、

  • Texture2D.EncodeToPNG() でバイト配列に変換
  • System.Convert.ToBase64String で文字列化
  • JSONやEasy Saveで保存

といった形です。

スロット選択画面での表示

スロット選択画面では、保存しておいたBase64文字列を使って、

  • Convert.FromBase64String でバイト配列に戻す
  • Texture2D.LoadImage で画像を復元
  • UIのImageコンポーネントに反映

という手順でサムネイルを表示できます。

注意点(とても大事)

サムネイル表示は便利ですが、やりすぎるとパフォーマンスに影響します。 特に注意したいポイントはこちらです。

  • Base64画像はテキスト量が増えやすい
  • スロット数が多いとメモリを圧迫する
  • GC(ガベージコレクション)が発生しやすくなる

おすすめなのは、

  • 解像度を小さくする
  • 必要最低限のサイズで保存する
  • 概要データ専用として分離する

という運用です。

「見た目を良くするための機能」が、 ロードを遅くしてしまっては本末転倒なので、 ほどほどの設計を意識しましょう。

次は、セーブスロットを安全に・長く使うための設計ポイントについて解説していきます。




設計・運用で気をつけるポイント

セーブスロットは「一度作って終わり」ではありません。 アップデートや機能追加を重ねるほど、設計の甘さが後から効いてくる部分でもあります。

ここでは、実際の開発・運用で特に気をつけたいポイントを整理しておきます。

上書き保存は想像以上に危険

一番ありがちなトラブルが、上書き保存によるセーブデータ破損です。

  • 保存中にアプリが落ちた
  • バッテリー切れ・強制終了
  • ファイル書き込み途中で例外が発生

この状態で既存データを直接上書きしていると、 スロットごと完全に壊れることがあります。

安全に運用したい場合は、

  • 一時ファイルに保存してから差し替える
  • バックアップを1世代残す
  • 上書き前に確認ダイアログを出す

といった対策を入れておくのがおすすめです。 セーブ破損対策については、こちらの記事で詳しく解説しています👇

スロット削除時はUIとデータを必ず同期する

スロット削除機能を実装する場合、 データだけ消してUIを更新し忘れるのはよくあるミスです。

削除時には、

  • セーブファイルの削除
  • 概要データの削除
  • スロット表示を「NO DATA」に戻す

この3点を必ずセットで処理するようにしましょう。

スクリプトは役割ごとに分ける

セーブスロット周りの処理は、 ひとつのスクリプトに全部書くと、すぐに破綻します。

おすすめなのは、次のような役割分担です。

  • スロット1つ分の表示・UI制御を担当するクラス
  • セーブ/ロード全体を管理するクラス
  • 現在選択中のスロットIDを管理するクラス

こうしておくと、

  • オートセーブの追加
  • スロット数の増減
  • UIデザイン変更

といった変更にも強くなります。

「あとで拡張する」はだいたい後悔する

セーブ周りは、 後から仕様を変えるのがとても大変な部分です。

最初から完璧にする必要はありませんが、

  • 複数スロットを想定しているか
  • 概要表示が必要か
  • アップデートを予定しているか

このあたりだけでも先に考えておくと、 後々の修正コストがかなり下がります。




まとめ

今回は、Unityで「セーブスロット選択画面」を作るための考え方と、 代表的な実装方法について解説してきました。

セーブスロットは、ただデータを保存するだけでなく、 UI・パフォーマンス・将来の運用まで含めて設計することがとても大切です。

目的別おすすめ構成

  • とにかく早く安定したものを作りたい
    → Easy Save 3 を使う方法
  • 拡張性・アップデート耐性を重視したい
    → JSONによる自作セーブスロット
  • 小規模・プロトタイプで十分
    → PlayerPrefsによる簡易管理

どれが正解というより、 「今作っているゲームに合っているか」 で選ぶのがポイントです。

セーブスロットの実装は、 よく「大変そう」「後回しにしたい」と思われがちですが、 最初にしっかり設計しておくと、後が本当に楽になります。

無理に全部自作しなくても大丈夫です。 アセットに頼るのも立派な選択ですし、 自作する場合でも考え方さえ押さえておけば、失敗はかなり減らせます。

この記事が、 「セーブスロット選択画面、どう作ろう…」と悩んでいる方の 道しるべになればうれしいです😊


参考文献


よくある質問(FAQ)

Q
セーブスロットはいくつ用意するのがベストですか?
A

一般的には、3〜5個程度がもっとも使われることが多いです。 少なすぎるとやり直しがしづらく、多すぎると管理やロード処理が重くなりがちです。

RPGやADVの場合は「手動セーブ用に3枠+オートセーブ1枠」など、 役割ごとに分ける設計もおすすめです。

スロット数はあとから増やすより、 最初から少し余裕を持って設計しておく方が安全です。

Q
オートセーブと手動セーブは分けた方がいいですか?
A

はい、基本的には分けることを強くおすすめします。

オートセーブは便利ですが、

  • 意図しないタイミングで上書きされる
  • 詰み状態をそのまま保存してしまう

といったリスクもあります。

そのため、

  • オートセーブ専用スロット
  • プレイヤーが選べる手動セーブスロット

を分けておくと、プレイヤーの安心感が大きく変わります。

Q
アップデートでセーブデータが壊れないようにするには?
A

もっとも重要なのは、「将来の変更を前提にした設計」です。

具体的には、

  • JSONなど構造化された形式で保存する
  • データにバージョン番号を持たせる
  • 概要データと本体データを分離する

といった対策が効果的です。

また、上書き保存を直接行わず、 一時ファイルを経由するなどの安全策も入れておくと、 セーブ破損のリスクを大きく減らせます

セーブデータは後から修正するのがとても大変な部分なので、 「今は大丈夫そう」でも、最初から守りを固めておくのがおすすめです。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク