引言

现在做游戏开发的没有几个不用Excel的,用的最多的就是策划。尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数。但是作为程序来说其实关注的不是Excel而是它最终形成的数据,而在程序中数据其实就是二进制,比如说一个int型就是4个byte,一个字母占2个byte。但是游戏中不可能把excel文件放进去(因为Excel本身就会占一部分额外的空间),也不可能把处理Excel的类库打包到程序,所以现在大多是对Excel进行读取然后将数据进行序列化并写入文件再打包,程序运行的时候直接读取数据文件在进行反序列化。

这样做有几个好处:1.节省了空间。2.把和游戏无关的操作放在了游戏之外。3.游戏开发过程中用起来也比较方便,因为反序列换后的数据就是自己定义的某个类型的一个变量。3.减少了前后端通讯传输的数据量。4.方便对数据进行加密。

其实这个过程的核心部分都是一次性的操作,只要实现一遍以后就可以重复使用。

流程


实现的流程大致可以分为三个部分:1.读取Excel文件。2.将读取的数据进行序列化并写入文件。3.反序列化。#4.加密

读取Excel

本来读取Excel是一件非常简单的事情,但是开始做才发现,对于C#来说Excel操作的类库很多,所以用哪个类库就成了一个问题,其实这些操作都是在游戏之外进行的类库的性能可以忽略,但是一般人肯定都喜欢用性能好一点的。

另外一个问题就相对比较重要了,很多Excel类库都是基于windows开发环境的,而且还需要安装office,换到其他平台就不支持,而且Unity是换平台游戏引擎,所以基于这几点,我最后选择了一个跨平台操作Excel的开源类库ExcelReader

using UnityEngine;
using UnityEditor;
using System.Collections;
using System;
using System.Collections.Generic;
using System.IO;
using Excel;
using System.Data; public class ExportExcel { [MenuItem("Frame/ExportExcel")]
public static void ExportExcelToBinary()
{ Dictionary<string, List<List<Property>>> DataMap = new Dictionary<string, List<List<Property>>>();
List<List<Property>> classes;
List<Property> properties; FileInfo info;
FileStream stream;
IExcelDataReader excelReader;
DataSet result; string[] files = Directory.GetFiles(Application.dataPath + "/EasyUI/ExcelFiles", "*.xlsx", SearchOption.TopDirectoryOnly); int row = , col = ; try
{
foreach (string path in files)
{
info = new FileInfo(path);
stream = info.Open(FileMode.Open, FileAccess.Read);
excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
result = excelReader.AsDataSet(); classes = new List<List<Property>>(); int rowCount = result.Tables[].Rows.Count;
int colCount = result.Tables[].Columns.Count; for (row = ; row < rowCount; row++)
{
properties = new List<Property>(); for (col = ; col < colCount; col++)
{
//string name = result.Tables[0].Rows[0][j].ToString();
//string value = result.Tables[0].Rows[i][j].ToString();
//string type = result.Tables[1].Rows[1][col].ToString();
//Debug.Log(result.Tables[0].Rows[0][col].ToString()+":"+result.Tables[0].Rows[row][col].ToString());
properties.Add(
new Property(
result.Tables[].Rows[][col].ToString(),
result.Tables[].Rows[row][col].ToString(),
result.Tables[].Rows[][col].ToString()
));
Debug.Log(result.Tables[].Rows[][col].ToString());
} classes.Add(properties);
} DataMap.Add(info.Name, classes);
excelReader.Close();
stream.Close();
}
}
catch(IndexOutOfRangeException exp)
{
Debug.LogError("数组下标超出范围!");
} }
}

先把数据读到这里面Dictionary<string, List<List<Property>>> DataMap;后面会讲怎么利用meta data来做映射,怎么序列化。

还有就是Excel文件是有格式要求的哦,文件名就是类名,第一个sheet是数据从第二行开始读。第二个sheet的第一行是字段名称,第二行是字段类型,第三行的第一列是预留的类名。如下图

还有一个Property类是为了以后映射和序列化使用的

using System;
public class Property { public string name; public string value; public string type;
public Property(string name,string value,string type)
{
this.name = name;
this.value = value;
this.type = type;
}
public Type GetType()
{
return null;
//todo..
}
}

看了很多帖子,比较有用的先给大家贴出来。http://www.mamicode.com/info-detail-494944.html , http://www.xuanyusong.com/archives/2429/ , http://www.cnblogs.com/shanyou/archive/2009/11/21/1607548.html

,加密:http://wenku.baidu.com/view/031ede00964bcf84b9d57b6e.html

本文固定链接:http://www.cnblogs.com/fly-100/p/4538975.html

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)的更多相关文章

  1. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

  2. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...

  3. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  4. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  5. excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全

    http://zhidao.baidu.com/link?url=pHZQvfWJzI-lQjl4uP86q4GLcpYHu4o-fdjiYegJS0Cy5HEq5oz0YrUye3iHjmv5CJ3 ...

  6. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  7. hbase使用MapReduce操作4(实现将 HDFS 中的数据写入到 HBase 表中)

    实现将 HDFS 中的数据写入到 HBase 表中 Runner类 package com.yjsj.hbase_mr2; import com.yjsj.hbase_mr2.ReadFruitFro ...

  8. sql之将一个表中的数据注入另一个表中

    sql之将一个表中的数据注入另一个表中 需求:现有两张表t1,t2,现需要将t2的数据通过XZQHBM相同对应放入t1表中 t1: t2: 思路:left join 语句: select * from ...

  9. 使用spark将内存中的数据写入到hive表中

    使用spark将内存中的数据写入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" st ...

  10. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

随机推荐

  1. Fragment管理

    Fragments 设计理念 在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI.例如:通讯应用程序(QQ),用户列表可以在 ...

  2. git分支综述

    对git不是很熟悉,有个问题要弄清楚一下. 假如远程仓库有 dev 和 master 两个分支,master 作为一个稳定版分支,可用于直接发布产品,日常的开发则 push 到 dev 分支,那我本地 ...

  3. [Big Data]Spark

    SPARK Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapRed ...

  4. 链接器工具错误 LNK1123

    由于新学C++变成,找不到人求教,所以这个问题困扰了我很久,今天终于找到终极解决方案了: 出处,此帖25楼: http://bbs.csdn.net/topics/390121452 终极解决方案:V ...

  5. 通过ionice和nice降低shell脚本运行的优先级

    对于一些运行时会造成系统满载的脚本, 例如数据库备份, 会影响当时其他服务的响应速度, 可以通过ionice和nice对其IO优先级和CPU优先级进行调整例如降低"/usr/local/bi ...

  6. html5 canvas 五子棋游戏

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. HDU 4044 GeoDefense

    树形DP,和背包差不多.dp[now][x]表示now这个节点的子树上,花费为x的时候,获得的最大防御能力(保证敌方HP<=0) #include<cstdio> #include& ...

  8. Android 5.0之前屏幕截图的方法

    截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...

  9. MongoDB 3.0 WiredTiger Compression and Performance

    MongoDB3.0中的压缩选项 在MongoDB 3.0中,WiredTiger为集合提供三个压缩选项: 无压缩 Snappy(默认启用) – 很不错的压缩,有效利用资源 zlib(类似gzip) ...

  10. object - c 在URL中截取特定参数的值

    #pragma mark - 获取url特定的参数 -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSE ...