编辑器下的几种数据存储方式

本文介绍了Unity中的SessionState用于临时会话存储,EditorPrefs用于跨启动保存,以及如何创建自定义ProjectSettings实现版本控制下的数据持久化。通过实例展示了如何操作和同步这些数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.SessionState

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

SessionState中文文档icon-default.png?t=M4ADhttps://docs.unity3d.com/cn/current/ScriptReference/SessionState.html

2.EditorPrefs

编辑器下的存储数据方式,退出Unity不会清除存储的数据。

在Windows下会存到注册表中,而Mac中会存在Library中。

EditorPrefs中文文档icon-default.png?t=M4ADhttps://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));
        }
    }
}

 尽管代码有很大的提升空间,至少我们暂时可以同步我们的编辑器数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值