Unity3D游戏开发之当游戏开发遇上Excel

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://blog.csdn.net/qinyuanpei

今天我们的话题是Excel,作为常用的办公软件的Excel相信大家都不陌生啦。可是如果我们认为Excel只是办公软件的话,那么这就不只是天真而是Out了。事实上Excel和游戏开发有着密切的联系,不知道大家还记不记得那款利用Excel开发出来的三国杀,这可能是Excel第一次以游戏开发的身份出现在大家面前吧。我们知道在游戏开发领域有一种工作叫做策划,就像在软件开发领域有一种工作叫做产品经理一样。而在诸多的策划工作中,数值策划是一个可以直接影响游戏进程的工作,因为数值策划体现了一个游戏在整体数值上的平衡,设计者需要维护好这样一个平衡,确保游戏外的玩家和游戏里的敌人面对的是同一个公平的虚拟世界。

例如《仙剑奇侠传四》这款游戏中,韩菱纱在游戏后期的速度可以说是完全打破了游戏的平衡性,因为韩菱纱本身的速度就比较快,再加上仙风云体术的加速效果完全对玄霄产生了戏剧性压制,导致在游戏结尾的Boss战中经常是韩菱纱出手N次后才挨到玄霄出手,我们知道韩菱纱的乾坤一掷每次消耗气15,可是因为韩菱纱的速度足够快,所以韩菱纱完全可以通过普通物理攻击快速地积满气进而施展乾坤一掷,这就是游戏的平衡性被打破了呀,更不要说这部游戏里最为经典的千方残光剑Bug了,这同样是游戏平衡性的问题,归根到底是紫英的这个技能在配置数据时出现了错误,这充分说明数据的正确合理与否是会对游戏产生重要影响的。

尽管我们可以使用Xml、Json、ini、数据库等存储形式来存储这些数据,可是毫无疑问的是,Excel是Window平台上最好的数据处理软件,因此数值策划更倾向于使用Excel来设计游戏中的数据,面对如此重要的数值策划工作,我们自然希望在解析Excel文件时不会出现错误,可是我们总不能指望着策划把Excel数据转换成我们能处理的数据类型吧,因此就有了博主今天的这篇文章,所以在今天的文章中我们主要的内容就是如何通过程序来解析Excel文件。

1、项目需求

最近博主一个朋友向我抱怨,说手头上有好几百个Excel工作表要处理,大概几十万条数据吧。原因是当时公司分配任务时交待不清,等到了向公司交接数据的时候,朋友忽然发现这些Excel文件的表格格式和公司规定的不一样啊。这可急坏了博主的这位朋友,博主的朋友只好不断地的复制、黏贴,因为这些数据是分布在不同的数据表里,朋友整天都忙得焦头烂额,可是即使这样效率还是得不到保证啊,朋友最后找到了博主这里,问我能不能编写程序帮他解决这个问题。因为平时经常与技术圈子里的朋友聊天,所以在博主印象里Excel的解析在游戏开发中还是较为常见的,而且博主知道对于微软的Office办公软件是可以通过VBA编程来实现某些功能的,可是因为博主一直在用国产的WPS,所以对于Excel的解析基本上是停留在一个概念性的认识上,可是朋友的忙不能不帮不是,所以博主决定借着这个机会好好研究下Excel文件的解析。

2、解决方案

因为博主在之前并没有过解析Excel文件的经历,所以博主就到Github上淘了些开源项目。和很多人爱逛天猫、淘宝的经历类似,如果你发现有一个人经常喜欢到Github上晃荡、喜欢关注技术类的博客或者资讯、经常再看PDF版的技术文档或书籍,请千万不要怀疑,这个人绝对是程序员。哈哈,好了,玩笑就此打住啊。经过博主对这些开源项目的简单分析和整理,目前,对Excel文件解析的解决方案主要有以下三种:

1、Microsoft.Office.Interop.Excel

第一种解决方案是基于微软提供的Office API,这组API以COM组件的形式给出,我们可以通过调用该API实现对Excel文件的解析。使用这组API非常简单,博主稍后会为大家给出一个示例代码。微软的Office API特点是使用起来方便,可以使用C#、Visual Basic等语言进行相关开发。可是这种解决方案的的缺点同样很明显,因为COM组件主要依赖于系统,因此使用COM组件需要在系统中注册,这将对代码的可移植性产生影响,而且受制于COM技术,这种解决方案只能运行在Windows平台上,无法实现跨平台,加之解析速度较慢,因此这种方案通常只适合在解析速度要求不高,运行环境为Windows平台的应用场景。

2、ExcelReader

第二种解决方案得益于OpenOffice标准,OpenOffice标准可以让我们使用一种标准来解析和处理Excel文件而无需关注Excel文件是来自微软的Misrosoft Office、金山的WPS还是其它的办公软件。如果说第一种解决方案是Windows平台上解析Excel文件的选择之一,那么ExcelRead就是跨平台目标下解析Excel文件的首选方案。尤其像Unity3D这样的跨平台解决方案下,选择一个跨平台的类库或者组件能够保证我们的游戏在各种平台下稳定地运行,所以ExcelRead是博主向大家推荐的一个跨平台的Excel解析方案。

3、FastExcel

第三种解决方案FastExcel是博主在解决博主的这位朋友的问题时所采取的方案。FastExcel是一个在开源世界里比较著名的Excel读写的类库,因此使用这个类库可以得到较为广泛的社区支持,而且在FastExcel这个项目的源代码中,作者为我们提供了使用FastExel进行Excel解析的相关示例,具有较高的参考价值,基本上可以在这个示例的基础上写出可以运行的代码。根据示例代码的运行结果使用FastExcel单独读写100000行数据基本上维持在3~4秒,读写速度还是蛮快的。不过FastExcel使用的是迭代器和Linq to Xml来读取Excel文件的,所以当数据表中存在空白单元格时,读写的时候会比较诡异,这一点希望大家注意。

3、工程案例

既然今天的主题是Unity3D游戏开发,所以无论我们在前面提出了什么样的解决方案,最后我们都要落实到游戏开发上,所以最后和大家分享的是一个Unity3D配合ExcelReader实现Excel解析的简单案例。为什么要选择ExcelReader呢?因为ExcelReader是一个跨平台的解决方案。好了,下面我们一起来学习这个案例:

using UnityEngine;
using System.Collections;
using System.IO;
using Excel;
using System.Data;

public class ExcelScripts : MonoBehaviour
{

    void Start ()
    {
        FileStream m_Stream=File.Open(Application.dataPath +
            "\\Excel\\UserLevel.xlsx",FileMode.Open,FileAccess.Read);
        //使用OpenXml读取Excel文件
        IExcelDataReader mExcelReader=ExcelReaderFactory.CreateOpenXmlReader(m_Stream);
        //将Excel数据转化为DataSet
        DataSet mResultSets=mExcelReader.AsDataSet();
        //读取行数
        int rowCount=mResultSets.Tables[0].Rows.Count;
        //逐行读取,从第一行读以跳过表头
        for(int i=1;i<rowCount;i++)
        {
            //将读取的Excel数据转化成数据实体
            UserLevel mUser=new UserLevel();
            mUser.Name=mResultSets.Tables[0].Rows[i][0].ToString();
            mUser.Level=mResultSets.Tables[0].Rows[i][1].ToString();
            mUser.Description=mResultSets.Tables[0].Rows[i][2].ToString();
            mUser.Skill=mResultSets.Tables[0].Rows[i][3].ToString();
            //输出Debug信息
            Debug.Log(mUser.ToString());
            //ADD:更多逻辑
        }
    }

    //定义一个数据实体类UserLevel
    private class UserLevel
    {
        private string m_Name;
        public string Name
        {
          get { return m_Name;}
          set { m_Name = value;}
        }

        private string m_Level;
        public string Level
        {
          get { return m_Level;}
          set { m_Level = value;}
        }

        private string m_Description;
        public string Description
        {
          get { return m_Description;}
          set { m_Description = value;}
        }

        private string m_Skill;
        public string Skill
        {
          get { return m_Skill;}
          set { m_Skill = value;}
        }

        public override string ToString()
        {
            return string.Format("Name={0}&Level={1}&Description={2}&Skill={3}",
                           m_Name,m_Level,m_Description,m_Skill);
        }
    }
}

好了,这就是今天这篇文章的全部内容了,希望大家喜欢!

时间: 2024-11-03 03:26:07

Unity3D游戏开发之当游戏开发遇上Excel的相关文章

Unity3D游戏开发之虚拟现实项目开发流程

Unity3D游戏开发之虚拟现实项目开发流程 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一.系统设计与资料的收集与整理 1.              与项目投资单位沟通并进行系统设计: 2.              收集整理规划图.效果图.现场照片: 3.              拍摄比干文化及景区介

Unity3D研究院之详解游戏开发音频的播放

游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放还可以分为两种,一种为游戏音乐,另一种为游戏音效.前者适用于较长的音乐,如游戏背景音乐.第二种试用与比较短的游戏音乐,如开枪,打怪 时“砰砰”一瞬间播放的游戏音效.今天MOMO将用下面的例子带盆友们去剖析Unity3D游戏音乐与音效的播放. Unity3D游戏引擎一共支持4个音乐格式的文件 .AIFF  适用于较短的音乐文件可用作游戏打斗音效 .WAV  适用于较短的音乐文件可用作游戏打斗音效 .MP3  适用于较长的音乐文件可用作游戏背

[Unity3D]Unity3D游戏开发之塔防游戏项目讲解(上)

喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei 转载请注明出处,本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/42394949 ?? 大家好,我是秦元培.我参加了CSDN2014博客之星的评选,欢迎大家为我投票,同时希望在新的一年里大家能继续支持我的博客! 作为2015年的第一篇博客,博主首先想要感谢各位朋友的鼓励和支持,在新的一年里,博主将努力为大家分享更多.更好

三年一个人使用虚幻引擎(UDK)开发的一个游戏心路

三年一个人使用虚幻引擎(UDK)开发的一个游戏心路 转载   出处来源http://mobile.51cto.com/news-488590.htm 对于我个人来说,完成她的意义不仅在与完成了一个儿时的愿望,也是一次战胜自我的旅程,3年的时光,经历了种种变荡.最终,通过压榨自己的业余时光,学习新语言,新游戏平台,3D建模,3D动画,美工,音效,FLASH,各种配置. 作者:来源:CocoaChina|2015-08-18 09:57 收藏 分享 这个游戏没有做任何宣传(这个帖子算是第一个吧),其

《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)

注意:本系列教程为长篇连载无底洞,半路杀进来的朋友,如果看不懂的话,请从第一章开始看起,文章目录请点击下面链接. http://blog.csdn.net/lufy_legend/article/details/8888787 一,内容预览 算起来,游戏脚本系列文章已经很久没更新了,虽然该系列文章更新缓慢,但是确实还是能够帮到一些朋友,前段时间,仅仅因为做毕业设计通过邮件联系我的就有4位学生.有鉴于此,我还是挤点儿时间来继续慢慢更新一下了.另外,我想再声明一下,目前该脚本引擎还处在移植开发阶段,

Coco2d-x 塔防游戏“贼来了”之开发简档 之 二

原来的教程为<塔防游戏之贼来了>(这是我之前学习Cocos2d-x时候,看到的一个比较好的教程)原文地址目前只在泰然网看到,http://www.tairan.com/archives/6413 ,原作者为任珊.本文是基于这个教程,而编写的游戏开发简档,有了这些图表,你就可以轻松的开发出这款游戏了. 五游戏对象 游戏场景主要游戏对象. 游戏对象名称 对象特性 地图 地图上有一个瓦片图层,画出了一条路线.有一个对象图层,指出敌人的行进路线.一个触摸图层,指示该瓦片是块空地. 敌人 动态(播放动画

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架

教程里的案例我们是通过H5游戏引擎开发,目前H5的游戏引擎比较好用的是白鹭,不过对于新手来说白鹭的开发环境和工具使用过于复杂,这里推荐一个国内大神编写的游戏引擎:lufylegend. 直接在页面引入Js文件,就可以开发了,运行效率非常高效,语法是仿AS3语法,懂C#的人上手会很快. Lufylegend引擎具体的API和使用方法可以参考官网和论坛: http://www.lufylegend.com/api/zh_CN/out/classes/FPS.html 之前微信上有一款"怪兽必须死&q

Quick-Cocos2d-x初学者游戏教程(四) --------------- 开发初探(添加背景,标题,动作,按钮)

Quick-Cocos2d-x初学者游戏教程(四) 前面我们已经大概的讲解完了Quick的框架和代码结构,接下来,本章开始我们将正式进入到游戏的开发.当然在开发的过程中,如果遇到值得一提的知识点和概念,我们还是会为大家详细讲解的. 哈哈,这章的内容我加它为——开发初探,因为我们将先来实现一些基础的内容.本章将实现的效果如下图所示: 菜单场景 从前面章节讲解的的知识点中,我们知道每个新建的 Quick 项目里都已经默认创建好了一个 mainScene 场景,所以下面我们将利用这个现成的场景,把它改