Unity插件学习(五) ------ 本地存储Easy Save3

文章目录

      • 一.前言及下载地址
      • 二.功能介绍
      • 三.使用方法
          • 1.[Easy Save3存储支持的类型](https://docs.moodkie.com/easy-save-3/es3-supported-types/)
          • 2.设置
          • 3.Keys, Paths and Locations
            • File
            • PlayerPrefs
            • Resources
            • Memory
          • 5.加密
          • 6.保存并加载字符串和字节到文件
          • 7.保存和加载gameobject和Prefabs
          • 8.备份
          • 9.使用ES3File缓存
          • 10.保存和加载Image、audio
          • 11.Saving and Loading from Resources
          • 12.使用es3类型控制序列化
          • 13.与其他存储api集成
          • 14.电子表格

一.前言及下载地址

公司小项目,经常要保存数据到本地,unity自带API PlayerPrefs只能简单的存储基本类型,因此找到这个比较好用的插件Easy Save

插件以及demo下载链接:https://download.csdn.net/download/dengshunhao/10765006
官网 : https://docs.moodkie.com/product/easy-save-3/

二.功能介绍

链接:https://docs.moodkie.com/easy-save-3/es3-guides/features/
1.保存及获取

              ES3.Save / ES3.Load / ES3.LoadInto
              Save and Load from Resources
              Save and Load Strings and Bytes to File

3.加密
4.缓存
5.备份
6.保存并加载GameObjects和Prefab Instances
7.保存及加载图片、音频
8.File IO

            Check if Key, File or Directory Exists
            ES3.KeyExists / ES3.FileExists / ES3.DirectoryExists
            Find Keys, Files and Directories
            ES3.GetKeys / ES3.GetFiles / ES3.GetDirectories
            Delete Keys, Files and Directories
            Rename Files
            Copy Files

三.使用方法

1.Easy Save3存储支持的类型
Primitive types(原始类型)
Structs(结构体)
Enums(枚举)
Components/MonoBehaviours(组件)
ScriptableObjects
Non-abstract classes with a parameterless constructor(具有无参数构造函数的非抽象类)
Arrays, Lists, Dictionaries, Queues, Stacks and HashSets of supported types(数组、列表、字典、队列、堆栈和受支持类型的散列集)
Non-generic(非泛型)

Nice,我想要的都有了,特别喜欢Dictionariesn能存储,毕竟先前自己写转成List,再读取蛮麻烦的

2.设置

修改默认设置:


Unity插件学习(五) ------ 本地存储Easy Save3_第1张图片
Unity插件学习(五) ------ 本地存储Easy Save3_第2张图片

这里面的属性也比较好理解,自己看看吧,工具也挺实用的
运行时修改:
最简单的保存方法允许您提供一个ES3Settings对象作为参数来覆盖默认设置。
只需创建一个新的ES3Settings对象,更改它的变量,并将其作为参数提供给您的方法调用,以在运行时覆盖默认设置。

// Create a new ES3Settings to enable encryption.
var settings = new ES3Settings(ES3.EncryptionType.AES, "myPassword");
// Change the save location to PlayerPrefs.
settings.saveLocation = ES3.Location.PlayerPrefs;
  
// Use the ES3Settings object to encrypt data and save to PlayerPrefs.
ES3.Save("myTransform", this.transform, settings);

补充下参数说明:

属性 意义
location The storage location where we wish to store data by default.
path The path this ES3Settings object points to, if any.
encryptionType The type of encryption to use when encrypting data, if any.
encryptionPassword The password to use to encrypt the data if encryption is enabled.
directory The default directory in which to store files when using the File save location, and the location which relative paths should be relative to.
format The format we should use when serializing and deserializing data.
bufferSize Any stream buffers will be set to this length in bytes.
encoding What text encoding to use when writing and reading text from a file.
3.Keys, Paths and Locations

键允许您将多个数据片段存储到同一个文件中。例如:

// These three values are stored to the default file.
ES3.Save("myKey1", 1);
ES3.Save("myKey2", 2);
ES3.Save("myKey3", 3);
 
// These three values are stored to the file "myFile.es3".
ES3.Save("myKey1", 1, "myFile.es3");
ES3.Save("myKey2", 2, "myFile.es3");
ES3.Save("myKey3", 3, "myFile.es3");
 
// These three values are stored to different files.
ES3.Save("myKey1", 1);
ES3.Save("myKey2", 2, "myFile.es3");
ES3.Save("myKey3", 3, "anotherFile.es3");

如果一个文件已经包含了给定的键,文件中的值将被覆盖。例如:

// This adds the key "myKey" to the file with a value of '1'.
ES3.Save("myKey", 1);
// This overwrites "myKey", so the value is now '2'.
ES3.Save("myKey", 2);
// This overwrites "myKey" again, so the value is now '3'.
ES3.Save("myKey", 3);

支持相对路径和绝对路径。如果文件或目录不存在,将创建它。

// Save a value to the default file in the default save location.
ES3.Save("myKey", myValue);
 
// Save a value to a file named "myFile.es3" in the default save location.
ES3.Save("myKey", myValue, "myFile.es3");
 
// Save a value to a file named "myFile.es3" in a sub-directory called "myFolder" in the default save location.
ES3.Save("myKey", myValue, "myFolder/myFile.es3");

// Save a value to a file named "myFile.es3" in an absolute folder.绝对路径
ES3.Save("myKey", myValue, "C:/Users/User/Documents/myFile.es3);

您可以在默认设置中指定存储位置,或者提供ES3Settings对象作为参数。

File

将数据存储到文件系统中的文件中。
默认的文件目录是Unity的应用程序。可以得到使用Debug.Log(Application.persistentDataPath)的精确位置。
您还可以选择使用应用程序。通过更改ES3Settings来使用dataPath。目录变量到ES3.Directory。DataPath,但只能保证可从编辑器写入。
文件在WebGL中不受支持,并且将自动默认为PlayerPrefs,不管位置设置为什么。

PlayerPrefs

将数据存储在Unity的PlayerPrefs中,后者通常将数据存储在注册表或独立存储中。
这是为WebGL等平台提供的,这些平台不支持保存到文件,但是很少需要手动将保存位置设置为PlayerPrefs。
在WebGL中,PlayerPrefs有1MB的限制。

Resources
Memory

内存保存位置只能在特殊情况下使用,例如ES3File。

5.加密

Easy Save目前支持AES加密,使用128位密钥,可以在默认设置中启用,也可以使用ES3Settings对象作为参数。
默认情况下,加密是禁用的。
由于导出限制,一些应用程序商店要求您声明正在使用加密。要了解更多相关信息,你应该联系相关的app store

// Create a new ES3Settings to enable encryption.
var settings = new ES3Settings(ES3.EncryptionType.AES, "myPassword");
  
// Use the ES3Settings object to encrypt data.
ES3.Save("myTransform", this.transform, settings);
// Use the ES3Settings object to load and decrypt the data.
ES3.LoadInto("myTransform, this.transform, settings");
6.保存并加载字符串和字节到文件

Easy Save允许您使用ES3将字符串和字节直接保存到文件中。SaveRaw ES3.AppendRaw。
如果您想将数据写入文件,而文件的格式与容易保存的用途不同,那么这是非常有用的。
您还可以使用ES3以字符串或字节数组的形式读取文件。LoadRawString或ES3.LoadRawBytes。
保存:

// Create a string which represents three lines in a text file.
string myString = "Line1\nLine2\nLine3";
 
// Save the string as a file.
ES3.SaveRaw(myString, "myFile.txt");
 
// Append another line to the file.
ES3.AppendRaw("\nLine4", "myFile.txt");
 
// Now load the file back.
// This string will be "Line1\nLine2\nLine3\nLine4"
myString = ES3.LoadRawString("myFile.txt");

获取:

// Create some bytes which we wish to store to a file.
byte[] myBytes = GetBytes();
 
// Save the bytes as a file.
ES3.SaveRaw(myBytes, "myFile.bytes");
 
// Append more bytes to the file.
ES3.AppendRaw(GetMoreBytes(), "myFile.bytes");
 
// Now load the file back as a byte array.
myBytes = ES3.LoadRawBytes("myFile.bytes");
7.保存和加载gameobject和Prefabs

手动保存和加载gameobject:

// Save a GameObject.
ES3.Save("myGameObject", go);
 
// Load a GameObject, automatically assigning it to an existing
// GameObject if one exists, or create a new GameObject if not.
ES3.Load("myGameObject");
 
// Or we can choose what instance we load the data into.
ES3.LoadInto("myGameObject", go);

这将保存和加载以下内容:

  • 层,标签,名称和hideFlags。
  • 本地支持的类型列表中的组件,或者使用ES3Type手动支持的组件。
  • 对于GameObject的每个子对象,上述所有内容都适用。

手动保存和加载Prefabs:


Unity插件学习(五) ------ 本地存储Easy Save3_第3张图片
保存和加载预置实例:

  • 启用Easy Save for Prefab
  • 通过右键单击它并选择Enable Easy Save for预设。
  • 可以使用ES3.Save保存。
  • 要加载,请使用ES3。负载< GameObject >或ES3.LoadInto < GameObject >。
  • 加载时,如果加载的实例不存在,Easy Save将创建预置实例。
8.备份

有时候创建保存文件的备份是很有用的,例如,如果您希望在罕见的情况下恢复保存文件,比如由于硬件故障导致数据损坏,或者文件被篡改。
你可以用ES3来做这个。CreateBackup,胡状。还原备份以恢复备份。备份是通过复制文件并给它一个.bak扩展名来创建的。
如果备份已经存在,它将被覆盖,因此您需要确保在创建新备份之前不需要旧备份。
还要注意,恢复备份将覆盖它是备份的文件。

// Save some data and then make a backup.
ES3.Save("myKey", "myFile.es3");
ES3.CreateBackup("myFile.es3");

try
 {
     myInt = ES3.Load("myInt", "myFile.es3");
 }
 catch
 {
     if(ES3.RestoreBackup("myFile.es3"))
         Debug.Log("Backup restored.");
     else
         Debug.Log("Backup could not be restored as no backup exists.");
 }
9.使用ES3File缓存

使用ES3File缓存文件可以显著提高性能。这样做的好处是:

  • 访问密钥要快得多。
  • 覆盖键要快得多,需要的内存也少得多。
  • 只需要一次写入存储。
  • 该文件将存储在内存中,但在大多数情况下,内存使用是可以忽略不计的。
    使用ES3File:
  • 当您使用 ES3File Constructor时,文件将从存储库加载到ES3File中。
  • 要保存和加载密钥,请使用 ES3File.Save, ES3File.Load 和ES3File.LoadInto方法。
  • 若要将ES3File提交回存储区,请调用 ES3File.Sync 。这将用缓存的数据覆盖存储中的文件。
  • 要将ES3File转换为字节数组或字符串,请使用 ES3File.LoadRawBytes and ES3File.LoadRawString方法。
public class SaveLoadCache : MonoBehaviour
{
    public static ES3File file;
 
    public void Start()
    {
        // Create a new ES3File. This automatically loads
        // the data from myFile.es3 into the ES3File.
        file = new ES3File("myFile.es3");
    }
 
    public void OnApplicationQuit()
    {
        // Commit our ES3File to storage when the application quits.
        file.Sync();
    }
 
    // We can call this method whenever we want to save.
    public static void Save()
    {
        file.Save("myName", this.name);
        file.Save("myTransform", transform);
    }
 
    // We can call this method whenever we want to load.
    public static void Load()
    {
        this.name = file.Load("myName", "defaultName");
        // We can check whether a key exists in the ES3File before loading it.
        if(file.KeyExists("myTransform"))
            file.LoadInto("myTransform", transform);
    }
}
10.保存和加载Image、audio

Image:

// Take a screenshot.
var texture = new Texture2D(Screen.width, Screen.height);
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
texture.Apply();
  
// Save the screenshot as a PNG file.
ES3.SaveImage(texture, "screenshot.png");
 
// Save the screenshot as a JPG file.
ES3.SaveImage(texture, "screenshot.jpg");

// Load a Texture2D from a PNG file.
var texture = ES3.LoadImage("myImage.png");
// Apply the Texture2D to the material on this object.
GetComponent.material.mainTexture = texture;

// Get the bytes of a PNG file from an external cloud service.
byte[] bytes = CloudService.GetFileBytes("file.png");
// Turn these bytes into a Texture2D.
var texture = ES3.LoadImage(bytes);

audio:
加载:
MP3文件只支持移动设备,Ogg Vorbis文件只支持独立平台。
除了WebGL之外,所有平台都支持WAV、XM、IT、MOD和S3M文件。
由于此方法需要文件访问,所以WebGL不支持此方法。
如果文件不存在,将抛出FileNotFoundException。在这种情况下,您可以使用ES3。FileExists用于在加载前检查数据是否存在。

保存:
目前不可能将音频保存到压缩格式,因为Unity缺乏这样做所需的编码器。
但是,可以使用普通ES3以轻松保存的格式保存和加载AudioClip。保存并胡状。加载方法。由于数据未压缩,文件大小将大于压缩格式。

// Get the AudioSource we want to use to play our AudioClip.
var source = this.GetComponent();
// Load an AudioClip from the streaming assets folder into our source.
source.clip = ES3.LoadAudio(Application.streamingAssetsPath + "/AudioFile.wav");
// Play the AudioClip we just loaded using our AudioSource.
source.Play();

// Get the AudioSource containing our AudioClip.
var source = this.GetComponent();
// Save an AudioClip in Easy Save's uncompressed format.
ES3.Save("myAudio", source.clip);
// Load the AudioClip back into the AudioSource and play it.
source.clip = ES3.Load("myAudio");
source.Play();
11.Saving and Loading from Resources

Load:
要从资源加载,必须在默认设置中将位置设置为资源,或者使用ES3Settings对象。
文件必须具有扩展名.bytes,以便能够从参考资料中加载它

// Create an ES3Settings object to set the storage location to Resources.
var settings = new ES3Settings();
settings.location = ES3.Location.Resources;
 
// Load from a file called "myFile.bytes" in Resources.
var myValue = ES3.Load("myFile.bytes", settings);
 
// Load from a file called "myFile.bytes" in a subfolder of Resources.
var myValue = ES3.Load("myFolder/myFile.bytes");

Save:
Easy Save只能从编辑器中保存到Resources文件夹,因为在构建Unity应用程序时,Resources文件夹不存在。
如果希望将数据保存到资源中,以便稍后加载,则文件必须以扩展名.bytes结束。
要直接保存到资源,可以使用应用程序。获取路径的dataPath + “/Resources/”。但是,您需要退出Play模式并调用AssetDatabase.Refresh()或手动刷新项目才能从该文件加载。
或者,您可以将数据保存到您选择的文件夹中,然后将其拖放到Resources文件夹中。

ES3.Save("myKey", 123, Application.dataPath+"/Resources/myFile.bytes");
AssetDatabase.Refresh();
12.使用es3类型控制序列化

ES3Type脚本告诉我们如何保存类型的字段和属性,以及如何保存它们。这可以自动创建,并在必要时进行修改。
一旦创建了脚本,Easy Save就会自动找到它,并使用它序列化和反序列化您的类型。您不需要创建ES3Type的实例。
创建一个ES3Type:
可以通过转到窗口> Easy Save 3来创建ES3Type,并选择Types选项卡。
从这里,您可以从列表中选择您的类型,并选择希望保存的字段和属性。

  1. 注意,所有字段和属性都将显示,而不管它们是否用[Serializable]属性标记。
    有时候,试图保存一个属性可能会产生意想不到的效果。
  2. 因此建议您在选择属性之前确保序列化它是安全的。
    手动修改ES3Type:
    在某些情况下,您需要修改ES3Type。例如:
    当类型没有无参数的构造函数时。
  3. 当您需要调用一个方法来访问您正在保存/加载的变量时。
  4. 可以通过修改Types窗格中生成的ES3Type脚本的写、读和读入方法来实现这一点。ES3Type脚本可以在/Assets/Easy Save 3/Types/中找到。
    注意,一旦您手动修改了ES3Type文件,那么在Types面板中所做的任何更改都会覆盖您的手动修改。
    写:
protected override void WriteComponent(object obj, ES3Writer writer)
{
    var instance = (MyScript)obj;
    
    writer.WriteProperty("points", instance.points);
    writer.WriteProperty("speed", instance.speed);
    writer.WriteProperty("partner", instance.partner);
}

读:

protected override void ReadComponent(ES3Reader reader, object obj)
{
    var instance = (MyScript)obj;
    foreach(string propertyName in reader.Properties)
    {
        switch(propertyName)
        {
            case "points":
                instance.points = reader.Read();
                break;
            case "speed":
                instance.speed = reader.Read();
                break;
            case "partner":
                instance.partner = reader.Read();
                break;
            default:
                reader.Skip();
                break;
        }
    }
}
 
13.与其他存储api集成

有时需要将Easy Save的API与其他服务的存储API集成。例如,支持控制台,或与云存储插件集成。
这可以通过使用ES3File写入内存而不是本地存储,并以字节数组或字符串的形式检索ES3File的内容来实现。
以字符串或字节数组的形式保存:

// Create a new ES3File, providing a false parameter.
var es3file = new ES3File(false);
 
// Save your data to the ES3File.
es3File.Save("myTransform", this.transform);
es3File.Save("myName", myScript.name);
// etc ...
 
// Get the ES3File as a string.
string fileAsString = es3File.LoadRawString();
// Or get it as a byte array.
byte[] fileAsByteArray = es3File.LoadRawBytes().

从字符串或字节数组加载:
存储API应该允许您以字符串或字节数组的形式检索数据。
然后,可以将这个字符串或字节数组加载到ES3File中并从中读取。

// If we're loading from a byte array, simply provide it as a parameter.
var es3file = new ES3File(fileAsByteArray, false);
 
// If we're loading as a string, we need to convert it to a byte array first.
var es3file = new ES3File((new ES3Settings()).encoding.GetBytes(fileAsString), false);
 
// Load the data from the ES3File.
es3File.LoadInto("myTransform", this.transform);
myScript.name = es3File.Load("myName");
// etc ...
14.电子表格

使用ES3Spreadsheet, Easy Save能够创建电子表格并以CSV格式存储,所有流行的电子表格软件都支持这种格式,包括Excel、OSX数字和OpenOffice。
Save:

var sheet = new ES3Spreadsheet();
// Add data to cells in the spreadsheet.
for(int col=0; col<10; col++)
    for(int row=0; row<8; row++)
        sheet.SetCell(col, row, "someData");
sheet.Save("mySheet.csv");

如果要将数据追加到现有的电子表格,请将电子表格的追加变量设置为true。电子表格中的任何行都将被添加到保存到的行末尾。
Load:

// Create a blank ES3Spreadsheet.
var sheet = new ES3Spreadsheet();
sheet.Load("spreadsheet.csv");
// Output the first row of the spreadsheet to console.
for(int col=0; col(col, 0));

最新版的easySave3运行会报错,按照以下修改即可:
Unity插件学习(五) ------ 本地存储Easy Save3_第4张图片

你可能感兴趣的:(unity)