【Unity】無料アセット「QuickSave」を使ったセーブ機能の作り方

はじめに

「Unityでセーブ機能を簡単に作る方法が知りたい」

「PlayerPrefsは使わない方がいいと聞いたので、他のセーブ方法を知りたい」

「EasySaveがいいって聞いたけど、有料アセットはちょっと…」

こんな悩みを持っている人はこの記事を読むと解決できるかもしれません!

Unity標準のセーブ機能といえば「PlayerPrefs」ですが、これを使うのはあまりお勧めできません。

良くない理由としては以下が挙げられます。

  • 保存先がレジストリ(Windows版の場合)
  • セーブ対応の型が少ない
  • 暗号化されない

PlayerPrefsを使わない場合だと以下の2つの方法があります。

  • 自分でファイルを読み書きしてセーブ機能を作る
  • Assetに頼る

自分で作るのは面倒だったり、初心者だと難しかったりします。

そこでAssetに頼りたいのですが、1番有名なセーブアセット「EasySave」はお値段が8000円くらいするお高いアセットになります…

これらすべての悩みを解決してくれるのが、無料アセット「Quick Save」です。

今回は無料かつ簡単にセーブ機能が実装できる「Quick Save」の使い方を解説していきたいと思います。

QuickSaveとは?

前述の通り「Quick Save」はセーブ機能を簡単に作成することのできる無料のアセットです。

セーブデータは外部ファイル(Json)として任意の場所に保存できます。

圧縮・暗号化も簡単で、よく使うVector3やSpriteなどの型のセーブにも対応しています。

QuickSaveはPlayerPrefsで上げた「保存先」「対応の型」「暗号化」という問題をクリアしていますね。

QuickSaveのインストール方法

AssetStoreのページからダウンロードします。

Quick Save | ユーティリティ ツール | Unity Asset Store
Use the Quick Save from Clayton Industries on your next project. Find this utility tool & more on the Unity Asset Store.

ダウンロードできたらUnityエディターに戻り、メニューの「Window」>「Package Manager」を開きます。

左上の項目から「MyAsset」を選ぶと「QuickSave」のタブが見つかると思います。

「Download」ボタンを押しダウンロードが出来たら、「Inport」ボタンを押しましょう。

インポート時のエラー対応

インポート後に以下のようなエラーを吐くことがあります。

Multiple precompiled assemblies with the same name Newtonsoft.Json.dll included or the current platform. Only one assembly with the same name is allowed per platform.

これはNewtonsoft.Json.dll というファイルが重複してあることが問題でエラーになっています。

重複しているファイルを消すと解決できます。

具体的な方法は下記のページが分かりやすく説明してくださっています。

Unity2020でNewtonsoft.Jsonを入れる - Qiita
この記事についてUnity2020でNewtonsoft.Jsonをプロジェクトに入れるとMultiple precompiled assemblies with the same name Ne…

QuickSaveの使い方

今回はユーザー名とベストスコアを持ったUserDataクラスを例にセーブ機能の作り方を解説していきます。

サンプルコード

最初に解説するコードの全体を載せておきます。

using UnityEngine;
using CI.QuickSave;
using CI.QuickSave.Core.Storage;

public class UserData
{
    //ユーザー名
    string userName;

    //ベストスコア
    int bestScore;

    //セーブ設定
    QuickSaveSettings m_saveSettings;

    public void Start()
    {
        // QuickSaveSettingsのインスタンスを作成
        m_saveSettings = new QuickSaveSettings();
        // 暗号化の方法 
        m_saveSettings.SecurityMode = SecurityMode.Aes;
        // Aesの暗号化キー
        m_saveSettings.Password = "Password";
        // 圧縮の方法
        m_saveSettings.CompressionMode = CompressionMode.Gzip;
    }

    /// <summary>
    /// セーブデータ読み込み
    /// </summary>
    public void LoadUserData()
    {
        //ファイルが無ければ無視
        if (FileAccess.Exists("SaveData", false) == false)
        {
            return;
        }

        // QuickSaveReaderのインスタンスを作成
        QuickSaveReader reader = QuickSaveReader.Create("SaveData", m_saveSettings);

        // データを読み込む
        userName = reader.Read<string>("UserName");
        bestScore = reader.Read<int>("BestScore");
    }

    /// <summary>
    /// データセーブ
    /// </summary>
    public void SaveUserData()
    {
        Debug.Log("セーブデータ保存先:" + Application.persistentDataPath);

        // QuickSaveWriterのインスタンスを作成
        QuickSaveWriter writer = QuickSaveWriter.Create("SaveData", m_saveSettings);
        
        // データを書き込む
        writer.Write("UserName", userName);
        writer.Write("BestScore", bestScore);

        // 変更を反映
        writer.Commit();
    }
}

名前空間

スクリプトの先頭に下記を定義することによって、QuickSaveの機能が使えるようになります。

using QuickSave;

セーブ機能の作り方

QuickSaveWriter.Create関数にファイルの名前を指定して、セーブファイルを作成します。

Write関数を使ってデータを書き込むことが出来ます。

最後にCommit関数を呼び出すことで書き込んだデータを反映することが出来ます。

// QuickSaveWriterのインスタンスを作成
QuickSaveWriter writer = QuickSaveWriter.Create("SaveData");

// データを書き込む
writer.Write("UserName", userName);
writer.Write("BestScore", bestScore);

// 変更を反映
writer.Commit();

ロード機能の作り方

QuickSaveReader.Create関数にセーブデータのファイル名を指定すると、セーブファイルを取得することが出来ます。

あとはRead関数を使って各データを取り出しましょう。

// QuickSaveReaderのインスタンスを作成
QuickSaveReader reader = QuickSaveReader.Create("SaveData");

// データを読み込む
userName = reader.Read<string>("UserName");
bestScore = reader.Read<int>("BestScore");

保存先の変更方法

QuickSaveGlobalSettings.StorageLocationに任意のパスを書き込むと保存先を変更することが出来ます。

// データの保存先をApplication.dataPathに変更
QuickSaveGlobalSettings.StorageLocation = Application.dataPath;

デフォルトの保存先はApplication.persistentDataPathになっています。

圧縮・暗号化のやり方

QuickSaveSettingsという変数を設定することでデータの圧縮・暗号化が可能です。

// QuickSaveSettingsのインスタンスを作成
m_saveSettings = new QuickSaveSettings();
// 暗号化の方法 
m_saveSettings.SecurityMode = SecurityMode.Aes;
// Aesの暗号化キー
m_saveSettings.Password = "Password";
// 圧縮の方法
m_saveSettings.CompressionMode = CompressionMode.Gzip;

暗号化

暗号化方法はSecurityModeで指定します。

  • SecurityMode.None:暗号化なし
  • SecurityMode.Aes:共通鍵暗号方式
  • SecurityMode.Base64:64進数に変換

暗号化したい場合はSecurityMode.Aesを指定しましょう。

圧縮

圧縮方法はCompressionModeで指定します。

  • CompressionMode.None:圧縮なし
  • CompressionMode.Gzip:圧縮あり

設定を使用

QuickSaveReaderとQuickSaveWriterのCreate関数の第2引数にSettingを渡してやれば、ここで設定した内容が適用されます。

QuickSaveWriter writer = QuickSaveWriter.Create("SaveData", m_saveSettings);
QuickSaveReader reader = QuickSaveReader.Create("SaveData", m_saveSettings);

公式ドキュメント

詳しい仕様などを知りたいときは、以下の公式ドキュメントを参照してみてください。

GitHub - ClaytonIndustries/QuickSave: Quick Save is a plugin that makes it easy to save and load content to / from files in Unity games
Quick Save is a plugin that makes it easy to save and load content to / from files in Unity games - ClaytonIndustries/QuickSave

まとめ

以上がセーブ機能が簡単に作れる無料アセット「Quick Save」の使い方でした。

Quick Saveにはセーブ・ロード機能を作る上で十分な機能が搭載されています。

無料なので気になる方は1度試してみてはいかがでしょうか?

👇あなたにお勧めの書籍

コメント