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);
            }
        }
相关推荐
小贺儿开发3 小时前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com3 小时前
Unity UniText笔记
unity·unitext
杨丰玮4184 小时前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技15 小时前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui36119 小时前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎
五仁烧饼19 小时前
Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略
unity·游戏引擎
新手unity自用笔记1 天前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光1 天前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr
帅_shuai_2 天前
unity 静态字段内存查找工具
unity·游戏引擎
郝学胜-神的一滴2 天前
[简化版 GAMES 104] 现代游戏引擎 06:从Tick时序到邮局模型,拆解确定性世界的底层密码
开发语言·c++·游戏引擎·图形渲染·软件开发·opengl