找回密码
 立即注册
查看: 184|回复: 0

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

[复制链接]
发表于 2022-11-22 20:19 | 显示全部楼层 |阅读模式
· 编辑器插件使用类:

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 对应的值(如果存在)。
<hr>· 游戏内部储存数据类

1. PlayerPrefs

描述


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

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

    macOS:PlayerPrefs 存储在 /Library/Preferences/[bundle identifier].plist 中。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文件夹下就可以读取到。
暂时学到的就这几种,后面有新的再添加
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-27 20:41 , Processed in 0.093370 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表