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<PlayerData>(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<Entity> entityList=null;
XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
using (StreamReader sr = new StreamReader(configPath))
{
   entityList = xs.Deserialize(sr) as List<Entity>;
}

保存数据

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

对应的xml文件为:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfEntity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Entity>
  <Name>Alice</Name>
  <School>SJTU</School>
 </Entity>
 <Entity>
  <Name>Cici</Name>
  <School>CSU</School>
 </Entity>
 <Entity>
  <Name>Zero</Name>
  <School>HIT</School>
 </Entity>
</ArrayOfEntity>

5.TextAsset(普通文本读取)

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容