Unity 中配置文件Excel 转xml ;josn;序列化ScriptableObject及加载(最详细)。

本文详述了在Unity中如何将Excel配置文件转换为XML和JSON,并序列化为ScriptableObject。推荐使用ScriptableObject方法,尽管内存占用稍大,但在编辑器中便于数据管理。内容包括Excel格式说明、Unity编辑器操作步骤、代码实现以及所需库文件的介绍。

游戏中对策划的配置数据导入处理常用分为1.转xml或josn.2.序列化为ScriptableObject类。第一种方法游戏加载耗时一些,第二种避免了第一种方法加载缺点但内存要占用大一些。不过推荐第二种方法,现在手机不差那几m.并且第二种在unity编辑器中使用方便,对数据的更改直接在编辑器中更改到满意位置。第一种会不断导入配置文件比较繁琐。

分三部分介绍(本文中写在一块的有一千多行代码所有区分开介绍比较简单易懂): 1 xml;2 json; 3 ScriptObject;

Excel: excel 部分是导入的朋友项目中的部分数据,放入路径如图:(项目的同级别目录下方)

 

 

Excel 格式如图:第一行为Excel表功能概述 ,第二行为每一列的字段名字 ,第三行为每列的类型划分,第四行为每列的说明概述。

另外的Excel表:

 

unity编辑器部分:

分为转入的类型 xml json 和Scripts(创建脚本类:创建scriptsObjcet使用)如图1;在点击createScripts创建成功后,点击CreateScriptsObject 编辑器如图:2

       2 

 

点击选取excel文件夹:

 

创建数据结果如图:

 

1.json:

 

 

2.xml如图:

 

3.scriptsObject:

 

代码:

公用代码(公用列表和枚举和定义类型以及按条件调用创建为xml,josn,scrits脚本的方法):

using System.Collections;
using System.Collections.Generic;
//using UnityEngine;
using UnityEditor;
using System.IO;
using Excel;
using System.Data;
using System.Xml;
using System;
using System.Reflection;

public enum SlectExcelType
{
    Xml = 1, Josn = 2, ScriptObject = 3
};
public enum ParamType { Int = 0, String = 1, Float = 2, ListInt = 3, ListString = 4, MyDic = 5, Class };


public class ReadDataEditor : Editor
{
    public static SlectExcelType excelType = SlectExcelType.Xml;
    public static Dictionary<string, string> FieleNameDic = new Dictionary<string, string>();

    public static List<object> allJsondata = new List<object>();

    [MenuItem("ReadExcel/Xml")]
    static void ReadExcelToXML()
    {
        excelType = SlectExcelType.Xml;

        SelectExcel();

    }
    [MenuItem("ReadExcel/Josn")]
    static void ReadExcelToJosn()
    {
        excelType = SlectExcelType.Josn;
        SelectExcel();
    }
    [MenuItem("ReadExcel/CreateScripts")]
    static void ReadExcelToScriptObject()
    {
        excelType = SlectExcelType.ScriptObject;

        SelectExcel();

    }

    //选取xml文件或文件夹
    private static bool SelectExcel()
    {
        FieleNameDic.Clear();
        DirectoryInfo dir = new DirectoryInfo(UnityEngine.Application.dataPath).Parent;
        dir = new DirectoryInfo(dir.FullName + "/game_jobskill");
        if (Directory.Exists(dir.FullName) == false)
        {
            Directory.CreateDirectory(dir.FullName);
            UnityEngine.Debug.Log(string.Format("创建{0}目录成功!", dir.FullName));
        }
        // string filePath = EditorUtility.OpenFilePanel("请选择配置文件", dir.FullName, null);//单独选择一个文件夹
        string path = EditorUtility.OpenFolderPanel("", "", "");
        string[] files = Directory.GetFiles(path);
        for (int i = 0; i < files.Length; i++)
        {
            string filePath = files[i];
            if (filePath.Length == 0)
            {
                return false;
            }
            string[] fileNamees = filePath.Split('\\')[1].Split('.');
            if (FieleNameDic.ContainsKey(fileNamees[0]))
                FieleNameDic.Remove(fileNamees[0]);
            FieleNameDic.Add(fileNamees[0], filePath);
            FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
            DataSet result = excelReader.AsDataSet();
            if (excelType == SlectExcelType.Xml)
            {
                CreateXml(result, GetPathe(fileNamees[0]), fileNamees[0]);
                excelReader.Close();
            }
            else if (excelType == SlectExcelType.Josn)
            {
                // TODO添加了所有类型的列表,遍历列表进行创建(判断类别类型名称和文件名相同或者关联,本篇中是在文件名上加了“Data”后缀为类名)
                game_jobskillData obj = new game_jobskillData();
                city_infoData obj2 = new city_infoData();
                allJsondata.Add(obj);
                allJsondata.Add(obj2);
                for (int j = 0; j < allJsondata.Count; j++)
                {
                    if (fileNamees[0] + "Data" == allJsondata[j].GetType().Name)
                        CreateJosn(allJsondata[j].GetType(), result, GetPathe(fileNamees[0]));
                    continue;
                }

                excelReader.Close();
            }
            else if (excelType == SlectExcelType.ScriptObject)
            {
                CreateScriptObject(result, GetPathe(fileNamees[0]), fileNamees[0]);
            }
            excelReader.Close();

            stream.Close();

        }
        AssetDatabase.Refresh();

        string PatheName = UnityEngine.Application.dataPath + @"/Editor/";
        // string filePath = null;
        CreateObjectStart(PatheName, FieleNameDic);

        AssetDatabase.Refresh();
        UnityEngine.Debug.Log("导入xml" + dir.Name + "结束");
        return true;
    }
}

 

1.josn:

两个excel表类:

[System.Serializable]
public class game_jobskillData
{
    /// <summary>
    /// 技能编号
    /// </summary>
    public int id;
    /// <summary>
    /// 技能名称
    /// </summary>
    public string name;
    /// <summary>
    /// 技能图标路径
    /// </summary>
    public string icon;
    /// <summary>
    /// 技能开始动画路径
    /// </summary>
    public string animation;
    /// <summary>
    /// 消耗的活力
    /// </summary>
    public int power;
    /// <summary>
    /// 技能描述
    /// </summary>
    public string description;
    /// <summary>
    /// 职业限制
    /// </summary>
    public int job;
    /// <summary>
    /// 冷却时间
    /// </summary>
    public float time;
    /// <summary>
    /// 技能类型 1_主动技能 2_被动技能
    /// </summary>
    public string type;

    public int jobId;
    public int jobType;
    public float showTime;
    public float startTime;
    public float continueTime;
    public float releaseTime;
    public string skiljob;
    public string skillMusic;
    public string skillOthers;
}

[System.Serializable]
public class city_infoData
{
    public int id;
    public float lng;
    public float lat;
    public string province;
    public string city;
    public string area;
    public string code;
}

创建josn数据的方法

    #region//调用转出为josn的方法

    /// <summary>
    /// 读取一个工作表的数据
    /// </summary>
    /// <param name="type">要转换的struct或class类型</param>
    /// <param name="dataTable">读取的工作表数据</param>
    /// <param name="jsonPath">存储路径</param>
    private stat
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### Home Bus 协议概述 Home Bus协议,亦被称为家庭总线协议,是由日本研发的一种专门应用于家庭自动化领域的通信标准。该协议在商用空调及其他家用电器的远程操控方面具备广泛的应用范围。借助Home Bus协议,设备之间能够达成高效的通信,使用户能够更加便利地监管家庭中的各类智能设备。 ### ECHONET协议及其背景 Home Bus协议与ECHONET协议存在紧密的联系,实际上,ECHONET代表了一种更为具体的技术规范,其目的在于为家庭自动化领域构建一个开放且统一的通信标准。ECHONET由ECHONET财团负责维护与支持,该组织致力于推动该协议的进步与标准化进程。ECHONET协议的应用范围不仅限于家庭环境,还包括了楼宇自动化以及工业自动化等多个领域。 #### ECHONET的历史版本及修订记录 - **Version 1.0**:发布于2000年3月18日,同年7月对联盟成员公开,终于同年对公众发布。 - **Version 1.01**:在2001年5月23日,向联盟成员发布,主要进行了补充和勘误工作。 - **Version 2.00**:2001年8月7日,针对联盟成员发布。此版本中将电源线A和电源线B两种方式合并为单一电源线方式(基于电源线A),并对相关描述进行了调整。 - **Version 2.01**:2001年11月9日,进行了一些必要的修正,包括排版错误的修正、术语的标准化等。 - **Version 2.10**:经历预览版和草案阶段后,于2002年3月7日正式对联盟成员开放。此次更新主要涉及第3部分关于状态换的描述修改。 -...
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 依据所提供的文档材料,可以归纳出以下核心知识点: 1. **TM1668控制器**:TM1668属于一种专为驱动LED显示屏设计的专用驱动集成电路,其特别适用于驱动数码管,能够达成多路LED的驱动与控制,从而提升了显示的效率。 2. **程序简化与时序控制**:程序完成了对TM1668芯片的操作,其功能已经达到简化程度,且时序设置正确无误。在编程过程中,确保时序的准确性至关重要,因为它直接关联到设备能否正常运作。 3. **寄存器操作**:在编程实践中,运用了 uchar、int 等数据类型来表示数据及控制位。uchar或许是一种8位无符号字符类型,用于存储数据信息。同时,还涉及到对特定位的操作,比如 & 、 >> 等,这些操作用于设定或检测数据位的状态。 4. **硬件控制位**:在代码中,设定了用于控制TM1668的硬件控制位,涵盖 STB(片选信号)、CLK(时钟信号)以及 DIO(数据输入输出信号)。这些控制位的作用在于向TM1668发送指令与数据信息。 5. **数码管显示控制**:借助一系列的 send_data 函数调用,向TM1668发送控制指令与数据,以此来调控数码管的显示状态。例如,设定显示位、挑选显示地址、将数据传输至特定的数码管显示单元等。 6. **定时器中断**:在程序设计中,应用了定时器中断(INT0_timer)来周期性地执行任务。通过设定定时器的初始值(TH0和TL0),定时器在倒计时完成后会触发中断,使得程序能够以固定的频率更新数码管的显示内容。 7. **中断服务程序**:设定了一个中断服务程序,在定时器中断发生时被调用。在中断服务程序...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,DM码(Data Matrix Code)被视为一种二维条形码规范,其功能在于储存海量信息,并在工业自动化、电子元件标记等众多场景中得到普遍应用。DM码的辨识过程是图像处理及计算机视觉学科内的核心研究方向,它涵盖了图像采集、初步处理、特征提取以及模板比对等多个环节。在VC++平台之上,借助MFC(Microsoft Foundation Classes)库开展DM码辨识能够构建一个高效的应用开发环境。 我们将探讨"自适应阈值分割"这一流程。在DM码辨识的进程中,图像的初步处理扮演着至关重要的角色,而阈值分割则是将图像实现二值化的常用手段。自适应阈值分割能够依据图像的局部属性灵活设定阈值,有效处理光照不均、对比度较低等情况。这通常涉及到计算每个像素点邻近区域内的平均灰度级别,并设定一个阈值,通过像素点自身的灰度值与其邻近区域灰度值的关联来判定其终呈现的黑白状态。这样的方法能够确保DM码在复杂的图像背景下依然能够被精确地辨识出来。 随后,"快速定位"技术也是DM码辨识过程中的关键环节。在图像经过二值化处理后,需要迅速识别出DM码所在的位置。一种常用的方法是进行边缘检测,例如采用Canny算子或Sobel算子,这些方法能够识别出图像中的轮廓线。然后,借助矩形模板匹配,例如通过霍夫变换探测直线,并结合交点信息来确定DM码的四个顶点,从而精确获取DM码的位置信息。 在MFC框架的支持下,我们可以运用其图形设备接口(GDI+)以及OpenCV等库来实现上述功能。GDI+提供了丰富的绘图工具,能够便捷地处理图像的显示和初步处理;而OpenCV则包含了大量的图像处理算法,...
标题SpringBoot博物馆综合服务管理系统的设计与实现AI更换标题第1章引言介绍博物馆综合服务管理系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述博物馆信息化管理的必要性和系统开发的重要性。1.2国内外研究现状分析国内外博物馆管理系统的研究现状与存在的不足。1.3研究方法以及创新点概述本文的研究方法,并指出系统的创新之处。第2章相关理论介绍系统开发所需的相关技术理论。2.1SpringBoot框架介绍阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.2数据库技术介绍系统所采用的数据库技术,如MySQL等。2.3Web开发技术概述Web开发技术,包括前端和后端技术。2.4系统安全技术介绍系统安全相关的技术,如数据加密、用户认证等。第3章系统需求分析与设计详细分析系统的需求,并给出系统的设计方案。3.1系统需求分析从功能需求、性能需求等方面对系统进行详细分析。3.2系统架构设计给出系统的总体架构设计,包括各个模块的功能划分。3.3数据库设计设计系统的数据库结构,包括表结构、字段设计等。3.4界面设计展示系统的用户界面设计,包括页面布局、交互设计等。第4章系统实现详细介绍系统的实现过程,包括各个模块的实现方法。4.1系统开发环境搭建介绍系统开发所需的软件、硬件环境及其配置方法。4.2核心功能模块实现详细介绍系统核心功能模块的实现代码和逻辑。4.3系统集成与测试阐述系统各个模块的集成方法以及系统测试的过程和结果。第5章系统应用与效果评估介绍系统的应用情况,并对系统的效果进行评估。5.1系统应用情况系统在博物馆中的实际应用情况。5.2系统效果评估从性能、用户满意度等方面对系统效果进行评估。5.3对比方法分析通过与其他系统对比,分析本系统的优势和不足。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研
已经博主授权,源码载自 https://pan.quark.cn/s/a4b39357ea24 在计算机硬件监控领域,掌握CPU(中央处理器)的温度状况具有核心意义,因为过高的温度水平可能会对其性能造成负面影响,甚至引发硬件层面的损坏。Intel作为全球范围内居于领先地位的CPU生产厂商,其产品在个人电脑和服务器市场得到了广泛部署。本文将系统性地阐释如何借助驱动程序获取Intel CPU的温度数据,并深入分析相关技术细节。 Intel CPU内部构建了数字温度传感器(Digital Thermal Sensor,DTS),该组件负责实时追踪核心温度的变化情况。这些传感器所采集的数据能够通过系统管理接口(System Management Interface,SMI)或 ACPI(Advanced Configuration and Power Interface)机制向操作系统进行呈现。操作系统以及第三方应用程序可以通过访问这些数据来评估温度状态。 获取CPU温度的一种常规途径是借助硬件监控工具,例如HWMonitor、Core Temp等软件。此类工具多数情况下依赖于Microsoft的WMI(Windows Management Instrumentation)服务,该服务为应用程序提供了查询系统信息的标准化接口,其中包括温度数据。针对Intel CPU,WMI内置了一个名为"MSCTM"(Microsoft Core Temp Monitor)的类别,能够用于查询CPU的温度读数。 另一种技术方案涉及自主开发驱动程序或利用开源驱动库,比如lm_sensors,这是一个专门为Linux系统设计的硬件监控库。在Linux操作系统环境中,用户可以通过执行`sudo se...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在Android系统程序设计中,有时需要依据设备制造商或操作系统版本来达成特定功能或进行适配。 这个名为"判断android手机是华为小米魅族系统"的工具类正是为了应对此类场景而构建,它能够协助程序员识别用户设备属于华为、小米还是魅族等品牌。 该类通常会集成一系列函数,用于检测设备的制造商信息,进而明确其所属的ROM类型。 我们需要明确Android ROM的概念。 Android ROM(Read-Only Memory)指的是Android系统的固件,它包含了Android操作系统的底层组件、驱动程序以及个性化的用户界面。 不同厂商如华为(EMUI)、小米(MIUI)和魅族(Flyme)会基于Android源代码进行深度开发,形成各自独有的ROM,提供了各自独有的功能和用户体验。 在开发这个工具类时,程序员通常会借助Android提供的`Build`类,该类包含了关于设备的多种信息,例如设备制造商、型号、版本等。 例如,可以使用以下代码片段来获取设备制造商: ```java String manufacturer = Build.MANUFACTURER; ``` 接下来,我们可以依据`manufacturer`值来判断手机品牌。 如果为"huawei",则设备属于华为;如果为"xiaomi",则代表小米;如果为"meizu",则意味着魅族。 当然,实际应用中可能还需要考虑其他品牌,因此工具类通常会包含一个函数,如`checkBrand()`,它会遍历所有已知的品牌并进行对比: ```java public static boolean isHuawei() { return "huaw...
已经博主授权,源码载自 https://pan.quark.cn/s/a4b39357ea24 快速傅里叶变换(FFT)是一种高效的离散傅立叶变换(DFT)方法,能够将时域信号有效地换为频域表示。这种换方式在信号处理、图像处理、通信工程等多个领域具有广泛的应用价值,因为它能够揭示出信号的频率构成,进而辅助进行信号特征的分析。 在实际操作过程中,信号首先需要通过ADC(模拟到数字换器)进行采样处理。依据奈奎斯特定理,采样频率应当超过信号高频率的两倍,以此防止出现混叠现象。如果设定采样频率为Fs,信号频率为F,采样点数为N,那么FFT运算的结果将输出N个复数,每一个复数都对应一个特定的频率成分。 每一个FFT运算结果中的点的模值反映了对应频率下的信号幅度大小。比如,如果原始信号的峰值为A,那么除了直流分量(第一个点)之外的其他点的模值是A的N/2倍,而直流分量的模值则是A的N倍。此外,相位信息则表示了该频率下信号的相位状况。 FFT运算的结果呈现出对称分布的特性,通常情况下,我们只需关注其中前半部分(即小于采样频率一半的频率范围),因为这部分包含了所有正频率成分的信息。频率分辨率与采样时间呈现反比关系,若需提升频率分辨率,则必须增加采样点数或延长采样时间。 比如,当采样率为1024Hz,且采样1024个点时,频率分辨率能够达到1Hz;而如果采样持续时间为2秒,即采集2048个点,频率分辨率则可以提升至0.5Hz。计算FFT运算结果中某个频率点n(n≠1,且n≤N/2)所对应的信号表达式可以表示为An/(N/2) * cos(2πFn*t + Pn),即2*An/N * cos(2πFn*t + Pn)。对于直流分量n=1的情况,其幅度为A1/N。 以下通过一个包含直...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值