专栏首页Unity TechnologyJtro的技术分享:Unity读取excel表格文件生成asset配置表文件

Jtro的技术分享:Unity读取excel表格文件生成asset配置表文件

项目开源地址:https://github.com/641273917/unity_Excel-asset- 许多时候,我们需要通过excel表格来生成我们要读取的文件,之前我倒是试过小型的cvs表格,但是感觉不是很方便,这里就用了直接读取excel表格的方式来生成asset了. 比如,我们现在有这样的一个表格:

表格文件

最后我们会转换成这样的文件

asset文件

我们为什么要这么做呢? 因为unity不识别excel,如果在游戏开发中有一些数值变化,只需要修改excel表格,重新生成asset就好. 下面是实现代码:

一 配置代码:

//这里的字符串记录你的excel文件地址以及你要生成的asset文件的地址
using UnityEngine;
public class ExcelConfig 
{
    public static readonly string excelsFolderPath = Application.dataPath + "/Excel/";
    public static readonly string assetPath = "Assets/Resources/Release/";
}

二 表数据信息 这里记录所有表格中的文件,这与之前的文章"解析json文件"比较类似

/// <summary>
/// 读取excel的每行数据
/// </summary>
using UnityEngine;
public class ExcelLineManage:ScriptableObject  
{
    public Item[] dataArray;
}
//excel表格中的每列数据名称
[System.Serializable]
public class Item
{
    public string ID;
    public string ChinaName;
    public string EnglishName;
    public string Age;
    public string height;
    public string weight;
    public string address;
    public string zipcode;
    public string hobbit;
    public string Contact;
    public string emergencycontact;
}

三 读取表格工具脚本 这里需要引用文件

using System.IO;
using System.Data;
using Excel;
using UnityEngine;
public class ExcelTool  
{
    public static Item[] CreatItemArrayWithExcel(string filePath)
    {
        //行与列
        int columnNum = 0, rowNum = 0;
        DataRowCollection collection = ReadExcel(filePath, ref columnNum, ref rowNum);//获得行与列的值
        //从第三行开始才是有效数据
        Item[] array = new Item[rowNum - 2];
        for (int i = 2; i < rowNum; i++)
        {
            Item item = new Item
            {
                ID = collection[i][0].ToString(),
                ChinaName = collection[i][1].ToString(),
                EnglishName = collection[i][2].ToString(),
                Age = collection[i][3].ToString(),
                height = collection[i][4].ToString(),
                weight = collection[i][5].ToString(),
                address = collection[i][6].ToString(),
                zipcode = collection[i][7].ToString(),
                hobbit = collection[i][8].ToString(),
                Contact = collection[i][9].ToString(),
                emergencycontact = collection[i][10].ToString(),
            };
            array[i - 2] = item;
        }
        return array;
    }
    /// <summary>
    /// 读取excel文件内容
    /// </summary>
    /// <param name="filePath">文件路径</param>
    /// <param name="columnnum">行数</param>
    /// <param name="rownum">列数</param>
    /// <returns></returns>
    static DataRowCollection ReadExcel(string filePath, ref int columnnum, ref int rownum)
    {
        FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        DataSet result = excelReader.AsDataSet(); 
        //Tables[0] 下标0表示excel文件中第一张表的数据
        columnnum = result.Tables[0].Columns.Count;
        rownum = result.Tables[0].Rows.Count;
        stream.Close();
        return result.Tables[0].Rows; 
    }
}

四 生成asset文件的编辑器类

using System.IO;
using UnityEditor;
using UnityEngine;

public class CreatAssetWithExcel : Editor
{
    [MenuItem("Tools/生成asset文件")]
    private static void CreatExcel()
    {
            ExcelLineManage manager = ScriptableObject.CreateInstance<ExcelLineManage>();
            //赋值
            manager.dataArray = ExcelTool.CreatItemArrayWithExcel(ExcelConfig.excelsFolderPath + "TESTEXCEL.xlsx");
            //确保文件夹存在
            if (!Directory.Exists(ExcelConfig.assetPath))
            {
                Directory.CreateDirectory(ExcelConfig.assetPath);
            }
 
            string assetPath = string.Format("{0}{1}.asset", ExcelConfig.assetPath, "TESTEXCEL");
            //生成一个Asset文件
            AssetDatabase.CreateAsset(manager, assetPath);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh(); 
    }
}

编译完成之后点击tools/生成asset文件,即可在配置的路径中看到生成的asset文件,那么如何使用呢?

五 解析asset文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ReadAsset : MonoBehaviour
{ 
    // Start is called before the first frame update
    void Start()
    {
        ExcelLineManage LineManage = Resources.Load<ExcelLineManage>("Release/TESTEXCEL");
        foreach (var item in LineManage.dataArray)
        {
            Debug.Log(item.ID + "---" + item.ChinaName + "---" + item.EnglishName + "---" + item.Age + "---" + item.height + "---" + item.weight + "---" + item.address + "---" + item.zipcode + "---" + item.hobbit + "---" + item.Contact + "---" + item.emergencycontact);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

解析就完成了.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:unity接入百度语音识别SDK

    首先,你要去百度申请一个百度的AI开放平台的账号:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpi...

    LittleU
  • Jtro的技术分享:MVC框架

    MVC框架历史悠久了,具体多久我也不知道,但是在游戏开发中的UI 使用太普遍了,最近我的一个徒弟跟我抱怨说网上的mvc框架晦涩难懂,看了一下午看不出所以然来,我...

    LittleU
  • Unity编程技术:封装游戏按钮事件(悬浮,点击,退出)

    这样使用递归算法获取你所需要查找的组件,然后在Getcomponent<Button>(),获取到button组件,

    LittleU
  • List,DataTable实现行转列的通用方案

      最近在做报表统计方面的需求,涉及到行转列报表。根据以往经验使用SQL可以比较容易完成,这次决定挑战一下直接通过代码方式完成行转列。期间遇到几个问题和用到的新...

    用户1168362
  • 让我们的ASP.NET MVC应用可以单独维护验证消息

    在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。虽然我们可以将它们存储于资源文件中,并...

    蒋金楠
  • 聊聊skywalking的log4j2-activation

    skywalking-6.6.0/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activa...

    codecraft
  • 聊聊skywalking的log4j2-activation

    skywalking-6.6.0/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activa...

    codecraft
  • [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

    一枝花算不算浪漫
  • Spring、Spring Boot和TestNG测试指南 - 测试AOP

    Spring提供了一套AOP工具,但是当你把各种Aspect写完之后,如何确定这些Aspect都正确的应用到目标Bean上了呢?本章将举例说明如何对Spring...

    颇忒脱
  • winform制作小工具的技巧

    在使用winfrom制作一些工具的时候,一些基本设置都是去属性里面找来找去,一段时间就忘了,记录记录以备不时之需。

    易墨

扫码关注云+社区

领取腾讯云代金券