Unity加载配置文件【解析Json】

news2025/1/23 12:24:44

Json 文件

Json文件的存储:

存储在StreamingAssets目录下的:
//这里用了游戏配置表常用的Json存储格式-对象数组

{
   "data":[
     {
      "id": 1001,
      "name": "ScreenFront_1",
    },
    {
      "id": 1002,
      "name": "ScreenLeft_1",
    },{
      "id": 1003,
      "name": "ScreenRight_1",
    },{
      "id": 1004,
      "name": "ScreenBottom_1",
    },{
      "id": 1005,
      "name": "Logo_1",
    },]
}

Json文件的解析:

定义本地存储结构

定义本地数据结构,添加序列化标签[System.Serializable]

using System.Collections.Generic;

[System.Serializable]
public class ConfigData {
    public bool debug { get; set; }
    public bool debugConsole { get; set; }
    public int logDeleteTime { get; set; }
    public int debugLevel { get; set; }
    public bool connectWs { get; set; }
    public bool debugMultiPlayer { get; set; }
    public bool allowSetCave { get; set; }
    public int playerCount { get; set; }
    public int noBodyTime { get; set; }
    public float video360Volume { get; set; }
    public float roiRadius { get; set; }
    public bool allowClose { get; set; }
    public int uiPlan { get; set; }

}

[System.Serializable]
public class ArrObject {
    public string child { get; set; }
    public int age { get; set; }
}

[System.Serializable]
public class ObjObject {
    public string parent { get; set; }
    public int age { get; set; }
}

public class AppData
{
    public AppItem[] data;
}
public class AppItem
{
    public string name;
    public string description;
    public string picture;
    public string appName;
    public string appUrl;
}

public class UIData
{
    public UIElement[] data;
}

public class UIElement
{
    public int id { get; set; }
    public string name { get; set; }   
}

反序列化Json到本地数据结构

    void MergeJson()
    {
        // Merge all JSON files in the json folder
        string jsonFolderPath = Application.streamingAssetsPath + "/json";
        List<string> jsonFiles = new List<string>(Directory.GetFiles(jsonFolderPath, "*.json"));
        foreach (string filePath in jsonFiles)
        {
            string fileName = Path.GetFileName(filePath).Split('.')[0];
       
            switch (fileName)
            {
                case "config":
                    data = ReadJsonFile<ConfigData>(filePath);
                    break;
                case "display":
                    display = ReadJsonFile<DisplayConfig.DisplayConfigData>(filePath);
                    break;
                case "apps":
                    appsData = ReadJsonFile<AppData>(filePath);
                    break;
                case "UIElements":
                    uiData = ReadJsonFile<UIData>(filePath);
                    break;
                default:
                    break;
            }
        }
    }

ReadJson 方法

 public static T ReadJsonFile<T>(string filePath)
 {
     string readData = File.ReadAllText(filePath);
     // 支持数组嵌套的情况
     return JsonConvert.DeserializeObject<T>(readData);
 }

JsonConvert.DeserializeObject(readData);
来自于Newtonsoft.Json 库
用于将参数中的字符串文本反序列化到T泛型的实例化数据结构。(可自定义序列化过程)
返回类型可空

运行时调用

可以将Merge()方法做成单例。在程序一开始时,显示的调用。
也可以在配置文件更新数据【热更新时】动态地去更新本地数据结构。
在本地数据结构不为空时,在其他模块拿到里面的数据。

例. 加载UI图片

1.实例化本地存储结构

private IList<UIElement> uiDataList;
uiDataList = new List<UIElement>(ConfigManager.Instance.uiData.data);

2.读取本地(已Merge过的数据)

 public void InitializeImageByName(string targetName,int width,int height,GameObject targetObject)
 {
     foreach (var item in uiDataList)
     {
         if(item.name == targetName)
         {
             ResourcesManager.Instance.InitializeImageFromStreamingAssets(ResPath.StreamingUIDir, item.name, width, height,targetObject);
         }
     }
 }

item.name 即访问到了
image.png
的name 属性。
后续从资源管理器加载对应UI资源即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1282861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业计算机服务器中了Mallox勒索病毒如何解密,Mallox勒索病毒数据恢复

随着计算机技术的不断应用与发展&#xff0c;网络为企业的生产运营提供了极大帮助&#xff0c;越来越多的企业开始利用网络办公&#xff0c;因此&#xff0c;随之而来的网络安全威胁也在不断增加。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计…

Nature Food:这么吃,可延长十年寿命

人类进入20世纪以来&#xff0c;科技水平和医疗水平的进步&#xff0c;尤其是抗生素和疫苗的使用&#xff0c;粮食产量的提高&#xff0c;让人类的预期寿命得到了大幅提升&#xff0c;像日本等发达国家人均寿命已突破80岁。 我们知道&#xff0c;饮食是健康的基础&#xff0c;在…

【有ISSN、ISBN号!往届均已完成EI检索】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;…

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

【已解决】xxljob连接报错HTTP 302(HTTP 401账号或密码错误)

目录 问题现象&#xff1a; 问题分析&#xff1a; 1、密码中的特殊字符。 2、密码长度问题。 解决方法&#xff1a; 拓展&#xff1a; 问题现象&#xff1a; 今天在生产环境使用xxljob任务调度来创建并执行任务时&#xff0c;出现了程序报错&#xff1a; 通过查询xxljob日志…

freeRTOS创建任务

一.动态创建任务 1.函数xTaskCreate() BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // …

mysql数据导入时数据太大(2006 - MySQL server has gone away)——笔记

打开mysql的安装路径&#xff0c;找到my.ini文件 my.ini打开后修改max_allowed_packet的值变成32或者更大 max_allowed_packet32M修改之后重启mysql

蓝桥杯真题:四平方和

import java.io.*;/*先找后两个数for(int i 0; 2 * i * i < n;i)for(int j i; i * i j * j < n;j ) 再找前两个数 for(int i 0;4 * i * i < n; i )for(int j i;2 * (j * j i * i) < n;j )//这样就可以让后两个数尽量大,前两个数尽量小 这样就可以确定后…

ToDesk优惠码来了,需要的不容错过

最近发现Todesk也有活动了&#xff0c;很多小伙伴不知道&#xff0c;除了中秋国庆双节&#xff0c;ToDesk另有专享优惠码&#xff0c;输入优惠码最高立减25元&#xff0c;即使是活动日也能折上折&#xff0c;不影响此优惠码的折扣力度&#xff01; Todesk作为国内优良的远程控制…

广告公司选择企业邮箱的策略与技巧

对于广告公司而言&#xff0c;选择一款适合的企业邮箱不仅能提升工作效率&#xff0c;更能维护并强化公司的品牌形象。以下是在选择企业邮箱时需关注的关键因素和注意事项。 1、邮件服务商的安全性。 邮件服务商应具备严密的安全防护措施&#xff0c;包括反垃圾邮件、防病毒、防…

优思学院|六西格玛中的过程管理思维

过程是什么&#xff1f; 过程&#xff08;Process&#xff09;是一系列相互关联的活动&#xff0c;将输入转化为输出&#xff0c;我们习惯于用 X 来表示输入&#xff0c;用 Y 来表示输出&#xff0c;就如下图一样。在产品&#xff08;服务&#xff09;质量形成过程中&#xff…

DCDC电源的选择

https://blog.csdn.net/xiahailong90/article/details/79086490 先说结论&#xff1a; 高开关频率的交换式电源转换器有利也有弊&#xff0c;本文提到的好处包括体积更小、瞬时响应更快以及电压overshoot 和undershoot 值都更小&#xff0c;主要缺点则是效率降低和热量增加。 …

idea__SpringBoot微服务01——了解Springboot

了解Springboot 一、回顾学习与现在三、回顾什么是Spring三、Spring是如何简化Java开发的四、什么是SpringBoot五、看图————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 一…

使用群晖Docker搭建HomeAssistant并实现异地公网访问家中智能设备

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使…

SQL Server 数据库,多表查询

4.2使用T-SQL实现多表查询 前面讲述过的所有查询都是基于单个数据库表的查询&#xff0c;如果一个查询需要对多个表进行操作&#xff0c; 就称为联接查询&#xff0c;联接查询的结果集或结果称为表之间的联接。 联接查询实际上是通过各个表之间共同列的关联性来查询数据的&…

如何看待 Android 面试却是 Java 面试官?

如何看待 Android 面试却是 Java 面试官&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Android资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…

热点新闻 | 许战海:零食行业的革新之道

2023年11月29日&#xff0c;华糖万商大会在南京国际会展中心隆重举行。著名战略定位咨询专家许战海受邀出席&#xff0c;在“量贩零食产业年度盛典”上发表了主题为《如何通过竞争战略布局年度规划》的精彩演讲&#xff0c;吸引了众多业界关注。 演讲中&#xff0c;许战海老师指…

【Avue】select的远程搜索 [模糊搜索]

一、需求 【模糊搜索】 二、实现avue的远程搜索 1、search为搜索 2、remote远程搜索 3、dictValue{{key}}为输入的值

cleer耳机怎么样?cleer和索尼哪个好?热门开放式耳机推荐!

不讲废话&#xff0c;如果你在南卡、Cleer和索尼之间犹豫不决&#xff0c;不知道该选哪个开放式耳机&#xff0c;直接进&#xff0c;跟你保证看完这篇绝对能够帮助你做出最佳决策。 玩开放式耳机也接近5年了&#xff0c;用过的耳机不下十几款&#xff0c;这次花了几千块入手了…

2.4 API 开发和集成

文章目录 API 开发和集成API 的概念和作用API 开发基础API 集成API 鉴权和安全API 文档和测试微服务和 API 网关云服务和 API 集成未来趋势和发展实验实验一&#xff1a; 通过api post方式传入 json实验二&#xff1a;通过api将所需数据传入 API 开发和集成 API 的概念和作用介…