1.SessionState
SessionState 是一种键/值存储,旨在存储和检索应在重新加载程序集期间保留的 Editor 会话状态。退出 Unity 时,系统将清除 SessionState 中存储的状态信息。
SessionState中文文档
https://docs.unity3d.com/cn/current/ScriptReference/SessionState.html
2.EditorPrefs
编辑器下的存储数据方式,退出Unity不会清除存储的数据。
在Windows下会存到注册表中,而Mac中会存在Library中。
EditorPrefs中文文档
https://docs.unity3d.com/cn/current/ScriptReference/EditorPrefs.html
3.保存数据到ProjectSettings中
由于以上两种方式不能在项目中提交到版本控制系统中,所以我们可以自制一个存储系统。
基本思路就是将我们的数据保存在 ProjectSettings目录下这样便可以和我们的版本系统同步版本。
让其遵循Unity本身的EditorPrefs文档Api,方便我们更能接受。
using System.Collections.Generic;
using System.IO;
namespace UnityEditor
{
/// <summary>
/// 保存在ProjectSettings的偏好设置
/// </summary>
public class ProjectSettingsPrefs
{
/// <summary>
/// 存储的文件类
/// </summary>
[System.Serializable]
class PrefsDatas
{
public Dictionary<string, string> StringDatas = new Dictionary<string, string>();
}
/// <summary>
/// 存储的文件位置
/// </summary>
const string filePath = "ProjectSettings/ProjectSettingsPrefs.assets";
static PrefsDatas _datas;
static PrefsDatas datas
{
get
{
if (_datas == null)
{
if (File.Exists(filePath))
{
_datas = Newtonsoft.Json.JsonConvert.DeserializeObject<PrefsDatas>(File.ReadAllText(filePath));
}
else
{
_datas = new PrefsDatas();
}
}
return _datas;
}
}
/// <summary>
/// 删除所有数据
/// </summary>
public static void DeleteAll()
{
datas.StringDatas.Clear();
DataChange();
}
/// <summary>
/// 删除指定Key
/// </summary>
/// <param name="key">Key</param>
public static void DeleteKey(string key)
{
if (HaveKey(key))
{
datas.StringDatas.Remove(key);
DataChange();
}
}
/// <summary>
/// 是否包含Key
/// </summary>
/// <param name="key">Key</param>
/// <returns></returns>
public static bool HaveKey(string key)
{
return datas.StringDatas.ContainsKey(key);
}
/// <summary>
/// 获取Bool值
/// </summary>
/// <param name="key">Key</param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static bool GetBool(string key, bool def = false)
{
if (datas.StringDatas.ContainsKey(key) && bool.TryParse(datas.StringDatas[key], out bool value))
{
return value;
}
else
{
return def;
}
}
/// <summary>
/// 获取Float值
/// </summary>
/// <param name="key">Key</param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static float GetFloat(string key, float def = 0)
{
if (datas.StringDatas.ContainsKey(key) && float.TryParse(datas.StringDatas[key], out float value))
{
return value;
}
else
{
return def;
}
}
/// <summary>
/// 获取Int值
/// </summary>
/// <param name="key">Key</param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static int GetInt(string key, int def = 0)
{
if (datas.StringDatas.ContainsKey(key) && int.TryParse(datas.StringDatas[key], out int value))
{
return value;
}
else
{
return def;
}
}
/// <summary>
/// 获取String值
/// </summary>
/// <param name="key">Key</param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static string GetString(string key, string def = null)
{
if (datas.StringDatas.ContainsKey(key))
{
return datas.StringDatas[key];
}
else
{
return def;
}
}
/// <summary>
/// 设置Bool值
/// </summary>
/// <param name="key">Key</param>
/// <param name="value">目标值</param>
public static void SetBool(string key, bool value)
{
if (datas.StringDatas.ContainsKey(key))
{
datas.StringDatas[key] = value.ToString();
}
else
{
datas.StringDatas.Add(key, value.ToString());
}
DataChange();
}
/// <summary>
/// 设置Float值
/// </summary>
/// <param name="key">Key</param>
/// <param name="value">目标值</param>
public static void SetFloat(string key, float value)
{
if (datas.StringDatas.ContainsKey(key))
{
datas.StringDatas[key] = value.ToString();
}
else
{
datas.StringDatas.Add(key, value.ToString());
}
DataChange();
}
/// <summary>
/// 设置Int值
/// </summary>
/// <param name="key"></param>
/// <param name="value">目标值</param>
public static void SetInt(string key, int value)
{
if (datas.StringDatas.ContainsKey(key))
{
datas.StringDatas[key] = value.ToString();
}
else
{
datas.StringDatas.Add(key, value.ToString());
}
DataChange();
}
/// <summary>
/// 设置String值
/// </summary>
/// <param name="key">Key</param>
/// <param name="value">目标值</param>
public static void SetString(string key, string value)
{
if (datas.StringDatas.ContainsKey(key))
{
datas.StringDatas[key] = value;
}
else
{
datas.StringDatas.Add(key, value);
}
DataChange();
}
/// <summary>
/// 当数据修改时,保存数据
/// </summary>
private static void DataChange()
{
File.WriteAllText(filePath, Newtonsoft.Json.JsonConvert.SerializeObject(datas));
}
}
}
尽管代码有很大的提升空间,至少我们暂时可以同步我们的编辑器数据。