棋牌游戏永久网址【363050.com】

开元棋牌

开元棋牌

联系我们

电话:400-123-4567

手机:138-0000-0000

邮箱:admin@youweb.com

地址:广东省广州市天河区88号


哈希游戏

棋牌游戏- 棋牌游戏平台- APP下载【一】从Excel到数据

  • 作者:小编
  • 发布时间:2026-01-09 13:16:44
  • 点击:

  棋牌游戏大全,棋牌游戏app,棋牌游戏平台,棋牌娱乐,棋牌娱乐平台,棋牌,开元棋牌,斗地主,扑克游戏,麻将,德州扑克,牛牛,麻将糊了,掼蛋,炸金花,掼蛋技巧,抢庄牛牛,十点半,龙虎斗,21点,牌九

棋牌游戏- 棋牌游戏平台- 棋牌游戏APP下载【一】从Excel到游戏数据

  最近,我看到了暴雪RTS游戏《星际争霸2》最新的平衡改动,狼牙风风拳惨遭腰斩。显然,这又是暴雪爸爸某些可能从来不玩自己游戏的设计师拍拍脑袋想出来的主意,但是这很COOOOOOOOOOOOOOL不是吗?

  不仅仅是《星际争霸2》,无论是单机还是网游,其内容都是设计师的魔手揉捏成型的。在《全境封锁》掉落的一件属性极佳的机密装备,《流亡黯道》中经过精心搭配的一套Build,《Warframe》中集合的刷现金四天王,乃至是《媚肉之香》中辛苦打出的真·结局。无论是单机还是网游,其内容都由设计师们妙手调制的数据砌就,最后形成了多种多样的游戏世界,为玩家们带来丰富而精彩的体验。

  我们接触到的大多数游戏,其内部都有繁杂的数据作为支撑。提升自我、剧情进展、分支结局,这些令玩家们感到由衷喜悦的心流时刻,离不开严密数据的支撑。甚至在游戏设计中有一种叫做“Data-driven”的概念,遵循该概念设计游戏能令策划者能够更多地掌握游戏中的变量。

  对于绝大多数策划者而言,Excel或许是他们最常用的工具。这款Microsoft编就的强大电子表格工具即便在模仿者甚多的今天,依然有着不可替代的地位。但是对于程序开发者而言,将Excel内部林林总总的数据以恰当的方式转移到游戏当中,可不算个简单的问题。直接解析Excel并不是个好主意。且不说在解析Excel需要额外的类库,同等数据体量下,Excel文档本身的体积也过于庞大,读取效率不高。毕竟作为程序,我们关心的不是Excel提供的公式、插件、函数,而是最终形成的数据。

  既然如此,何不将将数据从Excel中剥离出来单独储存和载入呢?其好处是,体积小,执行效率高,而且与游戏逻辑关系被切割之后,更加方便加密。既然有着这么多的好处,我们来看看如何编写一个Unity中的Excel导出工具吧。

  正如如何把大象放进冰箱的问题一样,对于Excel工具我们也要先理清关键的步骤,到底要先做什么,在做什么。明析问题之后,写出来的程序才有条理,方便阅读。

  在结合了网上查阅的资料和公司现有的代码后,我决定做出这样的设计:首先,读取一张数据表,将其字段转化为一个数据类,并设计了载入的方法;其次将数据表中的数据转化为一张哈希表,并序列化成二进制文件;然后,为了方便读取数据,我们设计一个更抽象的类作为数据读取的入口。

  为了读取Excel,我选择了EPPlus类库。关于如何使用C#和EPPlus读写Excel,恕不多言,参阅参考资料即可。

  假设我们现在准备设计一款DND题材的游戏,而天才的设计师决定为游戏添加兼职惩罚,每有一个兼职职业,在每等级所需要的经验越多。那么他可能会设计出形如图1.1的表格。

  当一位有志于成长为能够变化为龙的武僧升级的时候,他或许会朝着16级武僧/4级战士/20级德鲁伊的道路潜行,当他试图从39级提升到40级时,他会因为有两个兼职职业,而被迫需求更多的经验来提升等级。

  那么,我们就明晰了一张经验表转化为代码时的形式。而对于形如图1.1的Excel文档,我们可能会希望在脚本中有某个数据类(Table_Exp)可调用其数据,其内部形式可能如下所示:

  于是我们明确了数据表的第一个部分——一张Excel表中的各个字段该如何转化为一个数据类中的字段。

  除此之外,我们还需要知道,一张表中究竟有多少个字段,有多少个记录,于是我们在数据类中还应该设计一个部分用于储存Excel表的名字、字段数等基本信息:

  常使用Excel的策划者知道,Excel提供了导出.csv文件的方法,.csv文件实际上就是将表格里的数据以字符串的形式全部导出的一种形式。而我们选择将每一行数据导出为一个字符串数组,然后把这些数组存入一个哈希表中保存起来,也就是常说的“序列化”。

  序列化指的是,对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

  我们有很多方法序列化这个哈希表,无论是保存为JSON也好,XML也好。为了方便,也是为了更好减少体积,我们将哈希表序列化为二进制文件。于是,步骤显而易见,在导出工具中,我们将字符串数组存入哈希表中序列化保存;在数据类运行的时候,通过一个静态方法将字符串数组反序列化为数据类,再存入数据类的哈希表中存放待调用。

  当然,有了单个的数据类之后,我们还是嫌使用起来有些麻烦。假如我们想要查询Exp表的时候,我们需要判断其是否已经载入数据,然后再视情况决定是直接返回目标Table_Exp元素还是进行载入后再返回。

  因此自然而然地,我们就会想要将这些操作封装在一个类中,这个类(假定为Datas)向外只开放查询的方法,其调用形式可能如下所示:

  于是我们将所有单独的数据类的加载和查询统一封装到一个Datas类中,可以提高代码的可维护性,其内部可能是这样的:

  于是,一个简单的Excel数据导出工具的雏形,就这样产生了。剩下的自然是水磨工夫,根据我们读取的数据,生成对应的方法,可以说是非常简单了。

  为此我们的工具代码可能会是如下所示,在ConvertExcel和ConvertDataTable两个方法里,将对数据进行统计,然后生成上述的代码:

  目前读取数据文件的方式是直接使用FileStream来读取,实际上后面应该为此接入资源管理框架的载入方法。

  如果表格文件过大,比如剧本类的表格,可能会导致卡顿。我想到的解决方法是将这些内容放到本地化的地方做,然后在表格里仅存放文本ID。

  目前,假使我们仅仅改动了表格的内容而没有改动其结构,也会对所有表进行一次导出。因此需要增加【仅仅导出数据】【仅仅导出XX表】的方法,加快速度。

  在工作两年之后,终于着手学习编写框架,乃至一个完整的游戏。这对于我来说是个很大的考验和锻炼,因此写作中若出现错漏恳请诸位——尤其是我冒昧邀请预览的前辈们——斧正。

  另外在写作中有意识地将文章划分为两个部分,第一个部分试图让不懂得编程的读者也能体会到游戏中存在该模块的必要性;另一个部分则面向有Unity或者C#经验的读者,写的会简略一些。希望这样做能使得文章可读性更高一些。

  至于源代码,我会在框架成型后再放出。而转载方面,还拿不定主意。啊——反正也没人看,到时候私信再说吧。