Unity用于储存数据的几种方式

· 编辑器插件使用类:

1. SessionState

描述

SessionState 是一种键/值存储,旨在存储和检索应在重新加载程序集期间保留的 Editor 会话状态。
退出 Unity 时,系统将清除 SessionState 中存储的状态信息。用于存储应在使用 EditorPrefs 的 Unity Editor 会话中持久保留的状态信息。

静态函数

函数 说明
EraseBool 擦除键/值存储中的布尔值条目。
EraseFloat 擦除键/值存储中的浮点条目。
Eraselnt 擦除键/值存储中的整数条目。
EraselntArray 擦除键/值存储中的整数条目。
EraseString 擦除键/值存储中的字符串条目。
EraseVector3 擦除键/值存储中的 Vector 3 条目。
GetBool 检索布尔值。
GetFloat 检索浮点值。
Getlnt 检索整数值。
GetIntArray 检索整数数组。
GetString 检索字符串值。
GetVector3 检索 Vector3。
SetBool 存储布尔值。
SetFloat 存储浮点值
SetInt 存储整数值。
SetIntArray 存储整数数组。
SetString 存储字符串值。
SetVector3 存储Vector3。

官方地址:https://docs.unity3d.com/cn/2020.3/ScriptReference/SessionState.html

2. EditorPrefs

描述

存储和访问 Unity 编辑器偏好设置。
在 macOS 上,EditorPrefs 存储在~/Library/Preferences/com.unity3d.UnityEditor5.x.plist
在 Windows 上,EditorPrefs 存储在注册表中,在 HKCU\Software\Unity Technologies\UnityEditor 5.x 键之下。

静态函数

函数 说明
DeleteAll 从偏好中删除所有键和值。请谨慎使用。
DeleteKey 从偏好中删除key及其对应值。
GetBool 返回偏好设置文件中与key对应的值(如果存在)。
GetFloat 返回偏好设置文件中与key对应的浮点值(如果存在)。
Getlnt 返回偏好设置文件中与key对应的值(如果存在):
GetString 返回偏好设置文件中与key对应的值(如果存在)。
HasKey 如果偏好设置文件中存在/key/,则返回true.
SetBool 设置由key标识的偏好的值。
SetFloat 设置由key标识的偏好设置的浮点值。
SetInt 将由键标识的偏好设置的值设置为整数。
SetString 设置由key标识的偏好设置的值。请注意,EditorPrefs不支持null字符串,而是存储空字符串。

官方地址:https://docs.unity3d.com/cn/2020.3/ScriptReference/EditorPrefs.html

3. EditorUserSettings

描述

项目中可以共享数据的保存方法。在这里保存的数据都会被加密,很适合保存个人信息系或是密码之类的东西。
使用这个 API 保存的数据只会对自身的Project产生影响。
以 value 加密的形式,保存在项目内的文件中。
以 Unity2021 为例,数据保存在项目的 UserSettings 目录下的 EditorUserSettings.asset 。(txt格式)
旧版本存储在 Library的EditorUserSettings.asset 中。(二进制格式)

静态函数

函数 说明
SetConfigValue 为给定键标识的项设置单个字符串值。
GetConfigValue 返回 EditorUserSettings.asset 文件中与 key 对应的值(如果存在)。

· 游戏内部储存数据类

1. PlayerPrefs

描述

PlayerPrefs 是一个存储游戏会话之间玩家偏好的类。 它可以将字符串、浮点数和整数值存储到用户的平台注册表中。
Unity 根据应用程序运行的操作系统以不同方式存储 PlayerPrefs 数据。 本页给出的文件路径中,公司名称和产品名称是您在 Unity 的 Player Settings 中设置的名称。

独立设备上的储存位置

  1. macOS:PlayerPrefs 存储在 ~/Library/Preferences/com.ExampleCompanyName.ExampleProductName.plist 中。 Unity 对编辑器和独立设备上的项目使用相同的 .plist 文件。
  2. Windows:PlayerPrefs 存储在 HKCU\Software\公司名称\产品名称 键中。
  3. Linux:PlayerPrefs 存储在 ~/.config/unity3d/公司名称/产品名称 中。
  4. Windows 应用商店应用程序:PlayerPrefs 存储在 %userprofile%\AppData\Local\Packages\[产品包编号]\LocalState\playerprefs.dat 中。
  5. Windows Phone 8:Unity 将 PlayerPrefs 数据存储在应用程序的本地文件夹中。有关详细信息,请参阅 Directory.localFolder
  6. Android:PlayerPrefs 存储在 /data/data/pkg-name/shared_prefs/pkg-name.v2.playerprefs.xml 中。 Unity 将 PlayerPrefs 数据存储在设备上的 SharedPreferences 中。 C#、JavaScript、Android Java 和本机代码都可以访问 PlayerPrefs 数据。
  7. WebGL:Unity 使用浏览器的 IndexedDB API 存储 PlayerPrefs 数据。有关更多信息,请参阅 IndexedDB

编辑器内播放模式存储位置

  1. macOS:PlayerPrefs 存储在 /Library/Preferences/[bundle identifier].plist 中。
  2. Windows 上,PlayerPrefs 存储在 HKCU\Software\Unity\UnityEditor\ExampleCompanyName\ExampleProductName 键中。 Windows 10 使用应用程序的 PlayerPrefs 名称。 例如,Unity 添加一个 DeckBase 字符串并将其转换为 DeckBase_h3232628825。 应用程序忽略扩展名。

Unity 将 PlayerPrefs 存储在本地注册表中,没有加密。 不要使用 PlayerPrefs 数据来存储敏感数据。

静态函数

函数 说明
DeleteAll 从偏好中删除所有键和值。请谨慎使用。
DeleteKey 从 PlayerPrefs 中删除给定的键。 如果键不存在,DeleteKey 没有影响。
GetFloat 返回偏好设置文件中与 key 对应的值(如果存在)。
GetInt 返回偏好设置文件中与 key 对应的值(如果存在)。
GetString 返回偏好设置文件中与 key 对应的值(如果存在)。
HasKey 如果 PlayerPrefs 中存在给定键,则返回 true,否则返回 false。
Save 将所有修改的偏好写入磁盘。
SetFloat 为给定键标识的首选项设置单个浮点值。 您可以使用 PlayerPrefs.GetFloat 来检索此值。
SetInt 为给定键标识的首选项设置单个整数值。 您可以使用 PlayerPrefs.GetInt 来检索此值。
SetString 为给定键标识的首选项设置单个字符串值。 您可以使用 PlayerPrefs.GetString 来检索此值。

官方地址:https://docs.unity3d.com/cn/2020.1/ScriptReference/PlayerPrefs.html

2.BinaryFormatter 二进制序列化

假设有一个Player类

[System. Serializable]
public class Player
{
      public int health;
      public int  power;
      public Vector3 position;
}

由于BinaryFormatter序列化不支持Unity的Vector3类型,所以我们需要做一下包装。

public class PlayerData{
    
    public int level;
    public int health;
    public float[] position;

    public PlayerData(Player player)
    {
        this.level = player.level;
        this.health = player.health;
        this.position = new float[3];
        this.position[0] = player.transform.position.x;
        this.position[1] = player.transform.position.y;
        this.position[2] = player.transform.position.z;
    }
}

我们对PlayerData进行保存和读取。读取出来的PlayerData可以赋给Player。

public static class SaveSystem{
       //保存数据
    public static void SavePlayer(Player player)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath+"/player.fun";
        FileStream stream = new FileStream(path,FileMode.Create);
        PlayerData data = new PlayerData(player);
        formatter.Serialize(stream,data);
        stream.Close();
    }

     //读取数据
    public static PlayerData LoadPlayer()
    {
        string path = Application.persistentDataPath+"/player.fun";
        if(File.Exists(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream stream = new FileStream(path,FileMode.Open);
            PlayerData data = formatter.Deserialize(stream) as PlayerData;
            stream.Close();
            return data;
        }else{
            Debug.LogError("找不到保存文件  "+path);
            return null;
        }
    }
}

3. 保存为json格式的文本文件

使用 Unity 自身API JsonUtility。
保存数据

    public static void SavePlayerJson(Player player)
    {
        string path = Application.persistentDataPath+"/player.json";
        var content = JsonUtility.ToJson(player,true);
        File.WriteAllText(path,content);
    }

读取数据

    public static PlayerData LoadPlayerJson()
    {
        string path = Application.persistentDataPath+"/player.json";
        if(File.Exists(path)){
            var content = File.ReadAllText(path);
            var playerData = JsonUtility.FromJson(content);
            return playerData;
        }else{
            Debug.LogError("找不到保存文件  "+path);
            return null;
        }
    }

4. XmlSerializer进行序列化

假如有类

public class Entity
{
    public Entity()
    {
    }
    public Entity(string c, string f)
    {
      name = c;
      school = f;
    }
    public string name;
    public string school;
}

读取数据

List entityList=null;
XmlSerializer xs = new XmlSerializer(typeof(List));
using (StreamReader sr = new StreamReader(configPath))
{
   entityList = xs.Deserialize(sr) as List;
}

保存数据

List entityList=null;
XmlSerializer xs = new XmlSerializer(typeof(List));
using (StreamWriter sw = File.CreateText(configPath))
{
  xs.Serialize(sw, entityList);
}

对应的xml文件为:



 
  Alice
  SJTU
 
 
  Cici
  CSU
 
 
  Zero
  HIT
 

5.TextAsset(普通文本读取)

TextAsset text=(TextAsset)Resources.Load("unity3d");
Debug.Log(text.text);

在Project窗口的根目录创建Resources文件夹,然后把名字为unity3d.txt的文件夹的文件放在Resources文件夹下就可以读取到。

暂时学到的就这几种,后面有新的再添加

你可能感兴趣的:(Unity用于储存数据的几种方式)