Unity记录4.4-存储-系统数据以配置文件保存

文章首发见博客:https://mwhls.top/4818.html

无图/格式错误/后续更新请见首发页。

更多更新请到mwhls.top查看

欢迎留言提问或批评建议,私信不回。
汇总:Unity 记录

摘要:处处修改->一处修改的系统配置文件。

思路-2023/08/18

  • 前面的文件读取、模板转换等涉及路径信息,或是一些游戏的配置信息,都是以字符串变量来处理的。一次修改需要处处修改,因此转为系统配置文件。
  • 系统配置信息:两个地方存,可变的配置存在文件里,不可变的配置存在类里。
  • 存档配置信息:以文件存,存档名下保存配置文件与地图文件。

最终效果-2023/08/18

  • 后几个标题都是虚的,目的就是实现下面的转换。
c 复制代码
    string tiles_info_path = "Assets/Resources/Saved/TilesInfo.json";
    ->
    string tiles_info_path = game_configs.get_config("TilesInfo");
    
    string filename = "Map_" + block_offsets[0] + "-" + block_offsets[1] + ".json";
    string file_path = "Assets/Resources/Saved/" + filename;
    ->
    string file_path = game_configs.get_saveConfig("MapNameFormat");
    file_path = file_path.Replace("{x}", block_offsets[0].ToString());
    file_path = file_path.Replace("{y}", block_offsets[1].ToString());

数据结构-2023/08/17

  • 不变数据。
c 复制代码
    // config
    private string _version = "0.0.1";
    // dir
    private string _root_dir = "Assets/Resources/Saved";
    private string _save_dir = "Saves";
    // file
    private string _config_file = "Configs.json";
    private string _tilesInfo_file = "TilesInfo.json";
    // format of file
    private string _mapName_format = "Map_{x}_{y}.json";
    
    private SystemConfig _system_config;
    private Dictionary<string, SaveConfig> _saves_config;
  • 可变数据。
c 复制代码
    public struct SaveConfig{
        public string version;
        public string name;
    }
    
    public struct SystemConfig{
        public string version;
        public string last_save;
    }

系统配置-2023/08/17

  • 用于外部读取配置信息,暂时仅实现保存。
c 复制代码
    public string get_config(string name){
        // ------------- config -------------
        if (name == "version")
            return _system_config.version;
        else if (name == "last_save")
            return _system_config.last_save;
        // -------------  file  -------------
        else if (name == "TilesInfo")
            return Path.Combine(_root_dir, _tilesInfo_file);
        // -------------  dir   -------------
        else if (name == "SaveDir")
            return Path.Combine(_root_dir, _save_dir);
        // -------------  save  -------------
        else // e.g. Assets/Resources/Saved/ + Save/ + "PlayerName"/ + configs.json
            return Path.Combine(get_config("SaveDir"), name, _config_file);
    }
    
    public void select_save(string name){
        _system_config.last_save = name;
    }
    
    private void _init_system_config(string path){
        _system_config = new SystemConfig();
        _system_config.version = _version;
        _system_config.last_save = "";
        string system_config_json = JsonConvert.SerializeObject(_system_config, Formatting.Indented);
        File.WriteAllText(path, system_config_json);
    }
    
    private void _load_system_config(){
        string system_config_path = Path.Combine(_root_dir, _config_file);
        if (File.Exists(system_config_path)){ // load
            string jsonText = File.ReadAllText(system_config_path);
            _system_config = JsonConvert.DeserializeObject<SystemConfig>(jsonText);
        }
        else{ // init
            _init_system_config(system_config_path);
        }
    }

存档配置-2023/08/17

  • 保存读取与初始化。
c 复制代码
        public string get_saveConfig(string name, string save_name=""){
            if (save_name == "")
                save_name = get_config("last_save");
            SaveConfig save_config = _saves_config[save_name];
    
            // ------------- config -------------
            if (name == "root") // root dir of save
                return Path.Combine(get_config("SaveDir"), save_name);
            else if (name == "version") // save version
                return _system_config.version;
            // ------------- format -------------
            else if (name == "MapNameFormat")
                return Path.Combine(get_saveConfig("root", save_name), _mapName_format);
            else
                return "";
        }
    
        private SaveConfig _init_save_config(string name){
            SaveConfig save_config = new SaveConfig();
            if (name == "")
                throw new System.Exception("Name of save is EMPTY.");
            else if (_saves_config.ContainsKey(name))
                return _saves_config[name];
            save_config.version = _version;
            save_config.name = name;
    
            string save_config_path = Path.Combine(get_config(name));
            string save_config_dir = Path.GetDirectoryName(save_config_path);
            Directory.CreateDirectory(save_config_dir);
            string save_config_json = JsonConvert.SerializeObject(save_config, Formatting.Indented);
            File.WriteAllText(save_config_path, save_config_json);
    
            _saves_config.Add(name, save_config);
            return save_config;
        }
    
        private void _load_saves_config(){
            // Init, and get all saves ("dir name" == "save name")
            _saves_config = new Dictionary<string, SaveConfig>();
            string save_dir = get_config("SaveDir");
            string[] saves_name = Directory.GetDirectories(save_dir);
    
            // Loop for load config of save
            foreach (string save_name in saves_name){
                string name = Path.GetFileName(save_name);
                string save_config_path = get_config(name);
                string jsonText = File.ReadAllText(save_config_path);
                SaveConfig save_configs = JsonConvert.DeserializeObject<SaveConfig>(jsonText);
                _saves_config.Add(name, save_configs);
            }
        }
相关推荐
℡枫叶℡8 小时前
Unity - Import Activity Window 资源导入诊断信息窗口
unity·资源导入诊断
TO_ZRG10 小时前
Unity 证书校验
unity·游戏引擎
mxwin12 小时前
Unity Shader 切线空间数据是如何计算出来的
unity·游戏引擎·shader
mxwin15 小时前
Unity Shader 法线贴图跟切线空间有什么关系
unity·游戏引擎·贴图·shader
mxwin15 小时前
Unity Shader 贴图和采样的关系 如何保证贴图清晰
unity·游戏引擎·贴图·shader
心前阳光17 小时前
Unity之使用火山引擎实现文字提问流式回复
unity·游戏引擎·火山引擎
mxwin20 小时前
Unity Shader 什么是球谐光照 原理是什么
unity·游戏引擎·shader
心前阳光20 小时前
Unity之使用火山引擎实现语音识别
unity·语音识别·火山引擎
心前阳光20 小时前
Unity之使用火山引擎实现流式语音合成
unity·游戏引擎·火山引擎