一个在unity3d中使用Excel做配置的解决方案
来源:互联网 发布:织梦gbk转utf8 编辑:程序博客网 时间:2024/04/30 00:41
凡是做过较大型游戏的人都清楚,用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,比如这个例子的II_TEST001。(其实C#是没有宏定义这个概念的)
要做到这点很容易,只需要编写相应的代码将Define和ID从Excel中读出来,然后按如下格式写入一个宏定义代码文件(比如DefineEquip.cs):
namespace Define{ public static class EQUIP { public const uint II_TEST001 = 1000; };}
这样,我们就可以在代码中直接使用Define.EQUIP.II_TEST001来代替数字ID了。
第二个问题就麻烦一点了,比如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下都可以使用反射,只是不能进行代码的反编译。
- 一个在unity3d中使用Excel做配置的解决方案
- 一个在unity3d中使用Excel做配置的解决方案
- xlsxtools游戏配置表工具,开源跨平台,支持多语言,Unity3D等游戏引擎使用Excel做游戏配置表的解决方案
- 一个在unity3d中使用多语言的方案
- [Unity3D]在Unity3D中Javascript的基本使用与介绍
- [Unity3D]在Unity3D中Javascript的基本使用与介绍
- 【Unity3d】在Unity3d中播放视频:AVPro Video的使用
- 【Unity3d】在Unity3d中播放视频:AVPro Video的使用
- Excel中如何定义一个变量在表达式中使用
- 在unity3d中实现求一个三角形的外接圆
- 在unity3D中使用xml
- 在Unity3D中使用EmguCV
- 在Unity3d中使用Json
- 在 Unity3d 中使用 GLSL
- 在Unity3D中使用全局变量
- 在Unity3D中使用委托
- Aurora:一个让你在word、PowerPoint、excel、visio等软件中使用LaTex的软件
- 一个统计当前在线用户的解决方案,可以在聊天室、论坛、网站中使用
- 串口通信与编程:串口基础知识
- hdu 1421
- solr和java时区时间日期转化方法
- 魔术师发牌问题
- 登陆页面时JSP Session保存了用户信息 Flex 怎么获取 Session
- 一个在unity3d中使用Excel做配置的解决方案
- POJ 1006 Biorhythms(中国剩余定理)
- 北大oj--3981
- hdu1166(线段树)
- 网络连接
- AtomicInteger效率
- POJ2187-Beauty Contest
- 百度地图定位操作
- 计算机可以这样玩—自我学习,自我思维,自我工作(编程)