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
存储和访问 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
项目中可以共享数据的保存方法。在这里保存的数据都会被加密,很适合保存个人信息系或是密码之类的东西。
使用这个 API 保存的数据只会对自身的Project产生影响。
以 value 加密的形式,保存在项目内的文件中。
以 Unity2021 为例,数据保存在项目的 UserSettings
目录下的 EditorUserSettings.asset
。(txt格式)
旧版本存储在 Library的EditorUserSettings.asset
中。(二进制格式)
函数 | 说明 |
---|---|
SetConfigValue | 为给定键标识的项设置单个字符串值。 |
GetConfigValue | 返回 EditorUserSettings.asset 文件中与 key 对应的值(如果存在)。 |
PlayerPrefs
是一个存储游戏会话之间玩家偏好的类。 它可以将字符串、浮点数和整数值存储到用户的平台注册表中。
Unity 根据应用程序运行的操作系统以不同方式存储 PlayerPrefs 数据。 本页给出的文件路径中,公司名称和产品名称是您在 Unity 的 Player Settings 中设置的名称。
PlayerPrefs
存储在 ~/Library/Preferences/com.ExampleCompanyName.ExampleProductName.plist
中。 Unity 对编辑器和独立设备上的项目使用相同的 .plist 文件。PlayerPrefs
存储在 HKCU\Software\公司名称\产品名称
键中。PlayerPrefs
存储在 ~/.config/unity3d/公司名称/产品名称
中。PlayerPrefs
存储在 %userprofile%\AppData\Local\Packages\[产品包编号]\LocalState\playerprefs.dat
中。PlayerPrefs
数据存储在应用程序的本地文件夹中。有关详细信息,请参阅 Directory.localFolder
。PlayerPrefs
存储在 /data/data/pkg-name/shared_prefs/pkg-name.v2.playerprefs.xml
中。 Unity 将 PlayerPrefs
数据存储在设备上的 SharedPreferences
中。 C#、JavaScript、Android Java 和本机代码都可以访问 PlayerPrefs 数据。IndexedDB API
存储 PlayerPrefs
数据。有关更多信息,请参阅 IndexedDB
。PlayerPrefs
存储在 /Library/Preferences/[bundle identifier].plist
中。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
假设有一个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;
}
}
}
使用 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;
}
}
假如有类
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文件为:
<ArrayOfEntity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Entity>
<Name>AliceName>
<School>SJTUSchool>
Entity>
<Entity>
<Name>CiciName>
<School>CSUSchool>
Entity>
<Entity>
<Name>ZeroName>
<School>HITSchool>
Entity>
ArrayOfEntity>
TextAsset text=(TextAsset)Resources.Load("unity3d");
Debug.Log(text.text);
在Project窗口的根目录创建Resources文件夹,然后把名字为unity3d.txt的文件夹的文件放在Resources文件夹下就可以读取到。