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

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资源即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【QT】Qt常用数值输入和显示控件

目录 1.QAbstractslider 1.1主要属性 2.QSlider 2.1专有属性 2.2 常用函数 3.QScrollBar 4.QProgressBar 5.QDial 6.QLCDNumber 7.上述控件应用示例 1.QAbstractslider 1.1主要属性 QSlider、QScrollBar和Qdial3个组件都从QAbstractSlider继承而来&#xff0c;有一些共有的属性…

StackGres 1.6,可私有部署的云原生数据库中间件平台工程

StackGres 数据库平台工程简介 Enterprise Postgres made easy. On Kubernetes StackGres 是 Kubernetes 的全栈 PostgreSQL 发行版&#xff0c;打包成一个简单的部署单元。 使用精心选择和调优的 PostgreSQL 组件。 一个企业级的 PostgreSQL 栈需要几个其他的生态系统组件和重…

4 STM32MP1 Linux系统启动过程

1. ROM代码 这是ST官方写的代码&#xff0c;在STM32MP1出厂时就已经烧录进去&#xff0c;不能被修改。ROM代码是上电以后首先执行的程序&#xff0c;它的主要工作就是读取STM32MP1的BOOT引脚电平&#xff0c;然后根据电平来判断当前启动设备&#xff0c;最后从选定的启动设备里…

案例048:基于微信小程序电影订票系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Navicat 与 华为云 GaussDB 合作再升级,赋能 GaussDB 分布式数据库

2023 年第三季度&#xff0c;Navicat 首次支持了华为云 GaussDB 主备版数据库。经过双方团队进一步的深化合作&#xff0c;Navicat 完成了 GaussDB 分布式的研发适配工作&#xff0c;赋能 GaussDB 全域数据库产品。 GaussDB 数据库分为主备版和分布式版两种模式。主备版适用于…

【React】使用react hooks实现评论示例

实现功能 1、渲染评论列表 2、删除评论 3、渲染导航栏和高亮 4、评论列表排序功能 5、获取评论 6、点击发布按钮发布评论 7、清空输入框 8、重新聚焦 实现代码 1、需要引入 import React, { useRef, useState } from react import avatar from "../logo.png" //头…

Linux socket编程(11):Unix套接字编程及通信例子

Unix套接字是一种用于在同一台计算机上的进程间通信的一种机制。它是Linux和其他类Unix系统中的一项特性&#xff0c;通过在文件系统中创建特殊的套接字文件&#xff0c;进程可以通过这些套接字文件进行通信。 文章目录 1 Unix和TCP套接字对比2 Unix套接字初始化流程3 例:服务端…

【springboot】整合redis和定制化

1.前提条件:docker安装好了redis,确定redis可以访问 可选软件: 2.测试代码 (1)redis依赖 org.springframework.boot spring-boot-starter-data-redis (2)配置redis &#xff08;3&#xff09; 注入 Resource StringRedisTemplate stringRedisTemplate; 这里如果用Autowi…

HarmonyOS学习--了解基本工程目录

1.工程级目录 工程的目录结构如下&#xff1a; 其中详细如下&#xff1a; AppScope中存放应用全局所需要的资源文件。entry是应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包&#xff0c;存放工程依赖的源文件。build-profile.json5是工…

FPGA实现电机位置环、速度环双闭环PID控制

一、设计思路 主要设计思路就是根据之前写的一篇FPGA实现电机转速PID控制&#xff0c;前面已经实现了位置环的控制&#xff0c;思想就是通过电机编码器的当前位置值不断地修正PID去控制速度。 那为了更好的实现控制&#xff0c;可以在位置环后加上速度环&#xff0c;实现电机位…

【S32K3环境搭建】-0.2-安装S32DS product updates和 packages

目录 1 安装S32DS product updates和 packages 1.1 方法一&#xff1a;通过S32DS Extensions and Updates安装product updates和 packages 1.2 方法二&#xff1a;通过Install New Software…安装product updates和 packages 2 S32DS product updates和 packages安装后的效…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

网络安全威胁——中间人攻击

中间人攻击 1. 定义2. 中间人攻击如何工作3. 常见中间人攻击类型4. 如何防止中间人攻击 1. 定义 中间人攻击&#xff08;Man-in-the-Middle Attack&#xff0c;简称MITM&#xff09;&#xff0c;是一种会话劫持攻击。攻击者作为中间人&#xff0c;劫持通信双方会话并操纵通信过…

Java数据结构之《最短路径》(难度系数100)

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题…

Android Chips(标签)

目录 一、流式布局标签发展历程 二、类型及使用 2.1 Chip.Action(默认值) 2.2 Chip.Entry 2.3 Chip.Filter 2.4 Chip.Choice 三、常用事件 3.1 OnClickListener 3.2 OnCheckedChangeListener 3.3 OnCloseIconClickListener 四、ChipGroup 4.1 ChipGroup Chip.Choi…

计算机组成学习-中央处理器总结

复习本章时&#xff0c;思考以下问题&#xff1a; 1)CPU分为哪几部分&#xff1f;分别实现什么功能&#xff1f; 2)指令和数据均存放在内存中&#xff0c;计算机如何从时间和空间上区分它们是指令还是数据&#xff1f; 3)什么是指令周期、机器周期和时钟周期&#xff1f;它们之…

java小工具util系列3:JSON转实体类对象工具

文章目录 准备工作1.JSONObject获取所有的key2.集合中实体对象转换 list中Enrey转Dto3.字符串转List<BusyTimeIndicatorAlarmThreshold>4.json字符串转JSONObject5.list根据ids数组过滤list6.json字符串转JavaBean对象7.json对象转javabean8.jsonObject转map9.List\<U…

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…

IDEA插件配置--maven篇

仓库地址 IDEA中maven插件仓库默认地址&#xff1a;C:\Users\Administrator.m2\repository 在D盘新建一个文件夹用做本地仓库地址&#xff0c;例如 D:\Program Files\maven\repository&#xff0c;将原先C盘路径下的repository拷贝到D盘 修改settings.xml配置文件 镜像地…

基于微服务架构的外卖系统源码开发

在当前互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;用户对于高效、智能的外卖服务需求不断增加。为了满足这一需求&#xff0c;采用微服务架构的外卖系统成为了开发的主流方向。本文将探讨基于微服务的外卖系统源码开发&#xff0c;涉及到关键技术和示例代码。 1. 微…