zoukankan      html  css  js  c++  java
  • unity3d-excel

    http://www.360doc.com/content/15/1206/14/7014874_518308674.shtml原文地址

    凡是做过较大型游戏的人都清楚,用Excel做配置文件是非常合适的选择。因为Excel有强大的编辑功能,还有数学计算功能,对于数值策划来说是非常好用的。还有一些标记颜色的功能也很有用,比如以前我们会将一列或一行标记成灰色,插件导出的时候不会将灰色的导出,这样就很容易控制一部分策划内容不投放。

    在Unity3d引擎中,我目前采用的导出和读取方法是用了一个能读取Excel数据的插件,先导出为xml格式,然后在u3d中直接用xml类加载数据。

    首先先介绍一个能直接读取Excel的U3d插件,这个插件是跨平台的,导入插件后,按如下方式就可以读取:

    FileStream stream = File.Open(Application.dataPath + "/UserLevel.xlsx", FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);   DataSet result = excelReader.AsDataSet();

    int columns = result.Tables[0].Columns.Count; int rows = result.Tables[0].Rows.Count;

    for(int i = 0;  i< rows; i++)

    {     for(int j =0; j < columns; j++)     {         string  nvalue  = result.Tables[0].Rows[i][j].ToString();         Debug.Log(nvalue);     } }

    接下来就要解决具体配置的问题。

    在游戏中使用配置表,需要解决两个问题 :

    1. 一般来说数据表都有一个数字ID,但在代码中最好能够使用宏代替这个数字ID;

    2. 如果表中引用了另外一个表或代码的宏,需要在导出的时候识别出来。

    比如一个装备表,可能是下面这个样子的:

     

    这个装备的ID就是1000,但为了易读性在代码中我们希望写一个有意义的宏来代替这个ID,所以我们在ID前面同时写上了对应的宏。我们的方案是,导出后会自动生成一个宏定义文件(比如DefineEquip.cs),然后会自动生成这样的代码:

    namespace Define {     public static class EQUIP     {         public const uint II_TEST001 = 1000;     }; }

    只要能读取Excel里的内容,要生成这个文件是很容易的事。

    第二个问题就麻烦一点了,比如Job这一列,这个FIGHTER是另外一个宏定义文件(比如DefineJob.cs)里的。要在导出的时候识别出这个宏的数值就需要用到C#的反射机制。

    比如我的DefineJob.cs是这样子:

    namespace Define {  public static class JOB  {   public const byte FIGHTER = 1;   ...  }; } 当读到Job列里FIGHTER字符串的时候,就去查找JOB这个类中叫做FIGHTER的成员变量的值,查找不到就提示错误信息:

    FieldInfo info = Typeof(JOB).GetField("FIGHTER"); if (info == null)     Debug.LogError("undefined value"); else     string value = Convert.ToString(info.GetValue(null));

    最后导出的xml大致是这个样子的:

    <?xml version="1.0" encoding="GB2312"?> <Root>  <Item ID="1000" Name="测试" ModelPath="prefabs/equips/test" Job="1" ToolTip="这是一个测试装备"></Item> </Root> 如果引用的宏是另外一个表里的,就要先把那个表的Define先导出来。实际的函数肯定比这里的要复杂,这里只是说一个大致的方法。

    体会: C#的反射机制真的很有用,开发很多工具会很方便!注意,u3d文档中说ios不能用反射是不正确的,mac os和ios下都可以使用反射,只是不能进行代码的反编译。

  • 相关阅读:
    centos8重置root密码
    Mysql查询某列最长字符串记录
    ssm连接mysql出现Connections could not be acquired from the underlying database 问题
    spring-基于xml配置Bean
    WinForm控件命名缩写
    SQL Server 将一张表的某个字段更新到另一张表中
    SQL Server 取出指定字符后字符串(用于分割)
    小白学CMD下运行MySQL
    Bootstrap3.0和bootstrap2.x的区别
    有关js弹出提示框几种方法
  • 原文地址:https://www.cnblogs.com/ShineaSYR/p/5453739.html
Copyright © 2011-2022 走看看