【Unity】Easy Save 3の使い方|保存・ロード・Auto Saveと暗号化
この記事について
Unityでゲームを作っていると、「セーブ・ロードって意外とめんどくさい…」と思うこと、ありませんか?
PlayerPrefsで数値や文字列を保存できても、アイテム一覧やキャラクターのデータをまとめて扱うには、もう少し仕組みが必要になります。
そんなときに便利なのが、Easy Save 3(ES3)です。
この記事では、Easy Save 3の導入方法から基本的な使い方までを、サンプル付きで丁寧に解説します!
※投稿者はEasy Save3を購入し、実際にApp Storeにてアプリを出しています。
まず押さえるポイント
スクリプトではES3.Saveで保存し、ES3.Loadで読み込みます。保存時と読み込み時のキー・ファイル名・設定をそろえることが大切です。初回起動ではデータがないため、Loadに既定値を指定しておきましょう。
説明はEasy Save 3の公式資料をもとにしています。掲載画像は以前の設定画面で、バージョンによってメニューや項目の位置が異なる場合があります。
この記事で学べること
- Easy Save 3のインストール方法と設定場所
- Auto Saveで保存する対象とタイミングの設定
- ES3.Save/ES3.Loadによる保存・読み込みと初回起動への対応
- ES3ファイルの保存場所・ファイル分割・削除
- AES暗号化の設定と、読み込めないときの確認点
Easy Save 3とは?
Easy Save 3は、Unity向けの有料アセットで、セーブ・ロード機能を簡単に実装できるアセットです。キーと値を組み合わせて保存するため、スコアのような数値から、対応するクラスやコレクションまで同じ流れで扱えます。
- 幅広いデータ型に対応
数値・文字列・配列・List・Dictionary・カスタムクラスなどを保存できます。GameObjectやPrefabも扱えますが、保存できるComponentや参照の復元には条件があります。 - 保存先やファイルを指定できる
ファイルやPlayerPrefsなどの保存先を選び、セーブスロットごとにファイル名を分けられます。 - AES暗号化に対応
保存データをそのまま読まれにくくできます。ただし、暗号化だけで改ざんやチートを完全に防げるわけではありません。 - クロスプラットフォーム対応
Windows・Mac・iOS・Android・WebGLなどに対応しています。開発元の対応プラットフォームも確認できます。保存方法は環境によって異なり、WebGLの保存先については後半で説明します。
クラスのフィールドにも条件があります。public、または[SerializeField]などの対応属性が付いたフィールドで、対応する型であることなどを確認してください。詳しくは公式の対応型一覧にまとまっています。
BGM音量などの簡単な設定だけなら、Unity標準のPlayerPrefsも選択肢です。使い分けを考えるときは、PlayerPrefsでデータを保存・読み込みする方法も参考にしてください。
自分で保存用クラスとJSONファイルを用意する方法を知りたい場合は、JsonUtilityでデータを保存・読み込みする方法も参考にしてください。
Easy Save 3の導入・設定
インストール方法
- Unity Asset StoreでEasy Saveを購入する
- UnityのPackage Managerを開き、My Assetsからダウンロード・インポートする
購入に使用したUnityアカウントでサインインしておきましょう。詳しいインポート手順は以下の記事で説明しています。
Easy Save 3の設定場所
Unity上部のTools → Easy Save 3 → Settingsから設定画面を開きます。バージョンによってはWindow → Easy Save 3にあります。保存先・ファイル名・暗号化や、Auto Saveの設定場所を確認しておきましょう。

Runtime Settingsで保存先とファイル名を確認する
Runtime Settingsでは、まず次の項目を確認します。
- Location:保存先。この記事の基本コードは、テスト用データをFileに保存する設定を想定しています。Cacheを使う場合は、ファイルへ書き出す設定や処理も必要です。
- Default File Path:コードでファイル名を省略したときの保存先ファイル。ファイル名を指定した場合は、その指定が使われます。
- Encryption/Encryption Password:暗号化方式とパスワード。以下の基本例はEncryptionとCompressionがNoneのテスト用設定を想定し、暗号化は後半で説明します。

ES3ファイルの保存場所は、File保存の既定設定ではApplication.persistentDataPathです。UnityのTools → Easy Save 3 → Open Persistent Data Pathからフォルダを開けます。バージョンによってはEasy Save 3のウィンドウ内にあるToolsタブから開きます。
WebGLではPlayerPrefsを経由してブラウザのIndexedDBに保存されるため、PC向けと同じように保存フォルダを開く手順にはなりません。保存先の詳細は公式の保存先・パスの説明を確認してください。
既存データがある場合は設定変更に注意
暗号化や圧縮を途中で変更すると、以前の設定で保存したファイルを読み込めなくなることがあります。テストは別のファイル名で行い、元データを残しましょう。Clear Persistent Data Pathは削除操作なので、保存場所を確認するために押さないでください。
Auto Saveの使い方:保存対象とイベントを選ぶ
Auto Saveは、シーン上のGameObjectにある対応Componentなどを保存する機能です。「Enable Auto Save for this scene」で有効にしたあと、何を・いつ保存するかまで設定します。

- Easy Save 3のAuto Saveを開き、「Enable Auto Save for this scene」を押す
- 対象のGameObjectから、保存したいComponentを選ぶ
- 必要に応じてComponentの歯車アイコンから、保存する変数を選ぶ。この選択は同じ型のComponentに共通で適用される
- Save EventとLoad Eventを選び、保存・読み込みのタイミングを決める
- 再生中に対象の値を変え、設定した保存イベントを発生させてから、再度読み込んで復元を確認する
Auto Saveは保存したシーンと同じシーンで読み込む用途を想定しています。シーンをまたいで数値などを引き継ぐ場合は、後半のES3.Save/ES3.Loadを使う方法を検討してください。Prefabは別途「Enable Easy Save for Prefab」と保存対象の選択が必要です。
コードからES3AutoSaveMgr.Current.Save()/Load()を呼ぶ場合、公式はSave EventとLoad EventをNoneにすることを推奨しています。詳しい対象設定は公式のAuto Saveガイドを参照してください。
アプリ終了時だけの保存には頼らないようにしましょう。特にモバイルでは、OSによる終了時にOnApplicationQuitが呼ばれないことがあります。ステージクリアや設定変更の確定時など、必要な進捗が決まったタイミングでの保存も考えます。Unity公式の終了イベントに関する注意も確認してください。
Easy Save 3の基本的なスクリプトの使い方
保存・ロード:初回は既定値を読み込む
ES3.Saveの第1引数はキー、第2引数は保存する値です。キーは「Score」のようなデータの名前で、同じファイルの同じキーへ保存すると値が上書きされます。第3引数にファイル名を指定できます。
次の例では、起動時にsave1.es3のScoreを読み込み、保存は必要なときにSaveScoreを呼んで行います。Startで初期値を保存し直さないので、起動するたびに以前のスコアを上書きしてしまうのを避けられます。
using UnityEngine;
public class EasySaveSample : MonoBehaviour
{
private const string SaveFile = "save1.es3";
private const string ScoreKey = "Score";
[SerializeField] private int score;
private void Start()
{
LoadScore();
}
[ContextMenu("Save Score")]
public void SaveScore()
{
ES3.Save(ScoreKey, score, SaveFile);
}
[ContextMenu("Load Score")]
public void LoadScore()
{
// ファイルやキーがない初回起動は0を返す
score = ES3.Load<int>(
ScoreKey,
filePath: SaveFile,
defaultValue: 0);
Debug.Log("Score: " + score);
}
}EasySaveSample.csとして保存し、空のGameObjectにアタッチしてください。動きを確認する手順は次のとおりです。
- Unityを再生する。まだファイルやキーがなければ、Scoreには0が入る
- 再生中にInspectorのScoreを12345などへ変更する
- Componentのメニューから「Save Score」を選び、値を保存する
- 再生を停止して再開し、InspectorとConsoleで保存した値を確認する
ContextMenuはEditorで試すための呼び出し口です。ゲーム内ではセーブボタンや進捗確定の処理からSaveScoreを呼んでください。ES3.SaveをUpdateで毎フレーム呼ぶ必要はありません。
既定値は「まだ保存していない場合」のため
defaultValueはファイルやキーがないときに返す値で、この指定だけでは保存されません。また、ファイル破損・パスワード不一致・容量不足などのエラーを処理するものではありません。実際のゲームでは例外処理やエラー表示を用意し、読み込み失敗後に初期値で自動上書きしないようにしてください。公式のエラー処理ガイドが参考になります。
文字列の既定値は、ファイル名との取り違えを避けるため、ES3.Load<string>(“PlayerName”, filePath: “save1.es3”, defaultValue: “No Name”)のように名前付き引数で指定するとわかりやすくなります。ES3.Loadの引数も確認してください。
存在確認:FileExistsとKeyExistsの違い
ファイルの有無はES3.FileExists、ファイル内のキーの有無はES3.KeyExistsで確認します。ファイルが存在していても、Scoreが保存されているとは限りません。
以下はメソッド内に書く処理例です。ファイル名は保存・読み込みと同じsave1.es3にそろえます。
if (!ES3.FileExists("save1.es3"))
{
Debug.Log("セーブファイルが見つかりません");
}
else if (!ES3.KeyExists("Score", "save1.es3"))
{
Debug.Log("ファイルはありますが、Scoreがありません");
}
else
{
int score = ES3.Load<int>("Score", "save1.es3");
Debug.Log("Score: " + score);
}「Scoreを保存済みか」だけを調べるなら、KeyExistsだけでも確認できます。ファイル自体がない場合もfalseになります。初回と保存済みで処理を分ける必要がなければ、前の例のdefaultValue付きLoadで十分です。
ファイル分けして保存するには?
セーブスロットを分ける場合は、同じキーでもファイル名を変えます。次の例は、2つのテスト用ファイルに異なるスコアを保存する処理です。
// それぞれのファイルへ保存
ES3.Save("Score", 200, "save1.es3");
ES3.Save("Score", 500, "save2.es3");
// save2.es3から読み込む
int score = ES3.Load<int>(
"Score", filePath: "save2.es3", defaultValue: 0);この処理では、読み込み先がsave2.es3なので500を取得します。サンプルを実行すると各ファイルのScoreが上書きされるため、実際のゲームでは200・500の固定値を現在のスコアへ置き換え、保存が必要なときだけ呼んでください。
キーやファイルを削除するには?
Scoreだけを消すならDeleteKey、セーブスロット内のデータをまとめて消すならDeleteFileです。削除は確認画面などで対象を確かめてから実行しましょう。次の2つは別々の操作例です。
// save1.es3内のScoreだけを削除する
ES3.DeleteKey("Score", "save1.es3");// save1.es3そのものを削除する
ES3.DeleteFile("save1.es3");DeleteKeyでファイル名を省略すると、既定ファイルが対象になります。保存時にファイル名を指定したら、存在確認や削除でも同じ名前を渡してください。暗号化したファイルのDeleteKeyには、保存時と同じ暗号化設定も渡します。
セキュリティ(AES暗号化)の設定
暗号化を個別に指定する場合は、ES3Settingsを作って保存と読み込みの両方に渡します。以下はメソッド内で使う例で、平文のテストデータと混ざらないよう別ファイルに保存します。
// 動作確認用の仮の値。実際の秘密情報は書かない
string demoPassword = "DemoOnly-ChangeBeforeUse";
var settings = new ES3Settings(
ES3.EncryptionType.AES, demoPassword);
ES3.Save("SecretScore", 999, "encrypted-score.es3", settings);
int score = ES3.Load<int>(
"SecretScore",
filePath: "encrypted-score.es3",
defaultValue: 0,
settings: settings);同じファイルを扱う処理では、暗号化方式とパスワードをそろえます。KeyExistsなど、ファイルの内容を読み取る操作にも同じsettingsを指定してください。上の固定文字列は説明用で、本番用パスワードの管理方法を示したものではありません。
アプリ内に埋め込んだパスワードは解析で取り出される可能性があります。AESを有効にしても、セーブデータの改ざんやチートを完全には防げません。課金に関わる権利やランキングなどは、ローカルの値だけを信用せず、用途に応じてサーバー側での検証も検討します。
既存の平文ファイルを使っているゲームへ暗号化を追加する場合は、旧設定で読み込み、新しい設定で別ファイルへ保存するなどの移行を設計してください。開発中の不要なテストデータを消すことと、公開済みユーザーのデータを移行することは分けて考えましょう。詳細は公式の暗号化・圧縮ガイドを確認してください。
Easy Save 3でよくある疑問・つまずき
ES3ファイルの中身を確認・編集できる?
自作ゲームの開発中に保存内容を調べる場合、暗号化・圧縮していないテスト用ES3ファイルはテキストエディターで確認できます。Easy Save 3の保存形式はJSONです。拡張子が.es3だから自動的に暗号化されている、という意味ではありません。保存形式についての開発元の回答も参考になります。
まずOpen Persistent Data Pathで保存先を開き、ファイルのコピーを取ってから中身を確認しましょう。直接書き換えると、値の型や構造が崩れて読めなくなることがあります。テスト値の変更は、できるだけUnity側のES3.Saveから行うと、キーと型をそろえやすくなります。既存の暗号化設定を外して上書きする手順にはしないでください。
セーブしたのにロードできないときは?
- キー・ファイル名:Scoreとscoreのような表記違いや、別スロットを読んでいないか
- 保存する型と読み込む型:intで保存した値を、別の型として扱っていないか
- 暗号化・圧縮・保存先:SaveとLoadで同じ設定を使っているか
- 初回起動:まだファイルやキーがない場合に、defaultValueを指定しているか
- 保存タイミング:値を変えたあとにSaveが呼ばれたか。Auto Saveなら対象Component・変数・イベントを選んだか
- Consoleの例外:ファイル破損・容量不足・アクセス権などのエラーが出ていないか
原因がわからないままファイルを削除するより、まずバックアップを取り、ファイル名・キー・設定とエラー内容を確認するのがおすすめです。
Google DriveやDropboxへそのまま保存できる?
標準のES3.Saveを呼ぶだけで、Google DriveやDropboxへ直接同期される仕組みではありません。公式のES3Cloudは、PHP・MySQLに対応した自分のサーバーへファイルを送受信する機能です。サーバーの準備が必要で、ログインシステムも含まれません。
別のクラウドサービスを使う場合は、そのサービスのAPIやプラグインとの連携を検討します。詳しくはES3Cloudの公式ガイドと、他のストレージAPIとの連携を参照してください。
まとめ
Easy Save 3は、保存に悩む時間を減らし、ゲームの開発を進めたいときに便利なツールです。対応するクラスやコレクションも保存できるので、セーブ周りをまとめやすくなります。
- 保存はES3.Save、読み込みはES3.Load。キー・ファイル名・設定をそろえる
- 初回起動にはdefaultValueを使い、起動時の初期値上書きを避ける
- FileExistsはファイル、KeyExistsはファイル内のキーを確認する
- Auto Saveは、有効化に加えて対象・変数・イベントまで設定する
- 暗号化には同じ設定での読み込みと、既存データの移行・パスワード管理が必要
まずはテスト用のスコア1つを保存し、再起動後に読み込むところから試してみてください。基本の流れをつかんでから、ファイル分割や暗号化を追加すると整理しやすくなります。

サイトアイコン-2-150x150.png)