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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏中对策划的配置数据导入处理常用分为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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值