ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Quick Save:データのセーブ・ロード・暗号化などができる無料アセットを使ってみる -

初めに

 Quick Save というデータのセーブ・ロード・暗号化などができる無料アセットについて、まとめてみます。


ダウンロード・インポート

 Asset Store からダウンロードできます。
assetstore.unity.com
 
 ダウンロード後は、Package Manager から Import します。


インポート後にエラーを吐く

 インポート後に、次のようなエラーを吐くことがあります。
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.

 原因は、Unity2020以降のVersionControl が Newtonsoft.Json を利用するようになり、すでに Newtonsoft.Json.dll が含まれているからだそうです。ようするに、同じファイルが重複してあることが問題となり、エラーになっています。

 解決策は、重複しているファイルを消すことです。具体的にファイルを消す方法は次のリンク先で分かりやすく説明してくださっています。

qiita.com

Quick Save の使い方

ドキュメント

github.com

名前空間

 名前空間に次を追加することで、使用できるようになります。

using CI.QuickSave;
セーブ:QuickSaveWriter
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CI.QuickSave;  //追加

public class SaveTestScript : MonoBehaviour
{
    void Start()
    {
      //保存先の確認
      Debug.Log("保存先:" + Application.persistentDataPath);
      // QuickSaveWriterのインスタンスを作成
      QuickSaveWriter writer = QuickSaveWriter.Create("Player");
      // データを書き込む
      writer.Write("Name", "Fine");
      writer.Write("Position", Vector3.zero);
      writer.Write("Level", 5);
      // 変更を反映
      writer.Commit();
    }
}

 各関数の役割、引数は次の通りとなります。

関数 機能 引数の役割
Create Json ファイルの作成 ファイル名
Writer Json ファイルに書き込む 第1引数:キー、第2引数:値
Commit 変更を反映 なし

(作成された Json ファイル)

 デフォルトの保存先は、Application.persistentDataPath で確認できます。

ロード:QuickSaveReader

 QuickSaveReader の Read 関数を用いて、データを読み込みます。

// QuickSaveReaderのインスタンスを作成
QuickSaveReader reader = QuickSaveReader.Create("Player");
// データを読み込む
string name = reader.Read<string>("Name");
Vector3 position = reader.Read<Vector3>("Position");
int time = reader.Read<int>("Level");

Debug.Log("name:" + name + ", position:" + position + ", time:" + time);

(実行結果)


保存先の変更:QuickSaveGlobalSettings.StorageLocation

 QuickSaveGlobalSettings.StorageLocation を用いて、保存先の変更ができます。

// データの保存先をApplication.dataPathに変更
QuickSaveGlobalSettings.StorageLocation = Application.dataPath;
暗号化・圧縮:QuickSaveSettings

 QuickSaveSettings を用いて、暗号化・圧縮していきます。

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

 暗号化の方法は Security Mode で選択します。SecurityMode は次の3つから選択できます。

 Base64 は精確には暗号化ではありません。簡単にもとに戻せてしまいます。そのため、暗号化したい場合は、Aes を用いましょう。

 圧縮の方法は CompressionMode で指定します。None と Gzip しか選択肢がないため、Gzip を指定しましょう。

 暗号化・圧縮をする場合は、QuickSaveWriter、QuickSaveReader の第2引数に QuickSaveSettings のインスタンスを渡しましょう。

// QuickSaveSettingsのインスタンスを作成
QuickSaveSettings settings = new QuickSaveSettings();

// QuickSaveWriterのインスタンスを作成
QuickSaveWriter writer = QuickSaveWriter.Create("Player", settings);
// QuickSaveReaderのインスタンスを作成
QuickSaveReader reader = QuickSaveReader.Create("Player", settings);
動作確認用スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CI.QuickSave;

public class SaveTestScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
      // QuickSaveSettingsのインスタンスを作成
      QuickSaveSettings settings = new QuickSaveSettings();
      // 暗号化の方法
      settings.SecurityMode = SecurityMode.Aes;
      // Aesの暗号化キー
      settings.Password = "Password";
      // 圧縮の方法
      settings.CompressionMode = CompressionMode.Gzip;

      PlayerSave(settings);

      PlayerLoad(settings);
    }

    public void PlayerSave(QuickSaveSettings set)
    {
      Debug.Log("保存先:" + Application.persistentDataPath);
      // QuickSaveWriterのインスタンスを作成
      QuickSaveWriter writer = QuickSaveWriter.Create("Player", set);
      // データを書き込む
      writer.Write("Name", "Fine");
      writer.Write("Position", Vector3.zero);
      writer.Write("Level", 5);
      // 変更を反映
      writer.Commit();
    }

    public void PlayerLoad(QuickSaveSettings set)
    {
      // QuickSaveReaderのインスタンスを作成
      QuickSaveReader reader = QuickSaveReader.Create("Player", set);
      // データを読み込む
      string name = reader.Read<string>("Name");
      Vector3 position = reader.Read<Vector3>("Position");
      int level = reader.Read<int>("Level");

      Debug.Log("name:" + name + ", position:" + position + ", level:" + level);
    }
}

(実行結果)

最後に

 インストール時のエラーさえ何とかなれば、非常に使いやすいかったです。パスワードは簡単に分かるものにしないように注意してください。