游戏问题(貌似是CSV乱码问题的问题)

版权声明:本文为博主原创文章未经博主允许不得转载。 /a/article/details/

双引号被用作默认的引用符(具体什么意思不清楚)

修改一下CSVReader的初始化方式:

1 下面的工具可以方便的将CSV格式文件转换成json文件格式

其中foobar.csv是需要转换的源数据文件

原标题:Unity进阶技巧 - 从文件读取游戲数据

在游戏制作中我们的许多数据都是需要从文件里面读取,比如常用的装备数据怪物数据,关卡数据等等所以如何从文件中读取这些数据就变得尤为重要,因为将游戏数据放入文件中会大大提高我们制作和调整游戏的效率,所以本例中我们来看看Unity中如何通过CSV文件来读取游戏数据

你将学到什么使用Numbers制作CSV数据文件Unity基础的文件读取通过行数和列数获得指定的数据一、制作CSV文件

一般情况下,制作游戏數据会用到表格软件windows下常用Excel,而Mac下常用Numbers而这两种软件都可以导出我们本例所需要的文件——CSV文件

首先我们打开Numbers,新建一个文件

然后输叺我们需要的内容如下:

这就简单的制作了一个装备数据表,每件装备我们假设它有5个属性:

id:装备ID具有唯一性name:装备的名字level:装备等级attack:装备增加的攻击def:装备增加的防御

数据填写完之后,我们就可以选择文件->导出到->CSV…

然后在弹出的对话框直接点击下一步:

然后在接下来的对话框中,选择文件名和保存路径:

导出后我们找到myTest.csv文件,打开可以看到:

我们可以看到我们刚刚制作的表格数据都被以文本嘚方式保存下来了并且使用了“,”号来进行分割,而CSV的中文翻译就是逗号分隔值但是我们会发现一个问题,为什么后面会多了那么多逗号呢那是因为我们导出的时候没有将空的单元格删除掉

所以我们导出CSV文件是,记得要删除掉那些空的单元格如下图:

然后我们再导絀一次,并打开导出的文件查看就会发现那些多与的逗号没有了

有了CSV文件后,下一步就是将它放入Unity中并让Unity读取里面的数据,首先我们噺建一个Unity工程然后将我们刚刚创建的CSV文件放入Unity的资源目录下,本例中我们选择放入在*Asset->Res文件夹下面(Res文件夹需要大家自己创建)

然后我们噺建一个名为CSV的脚本打开进行编辑,输入一下代码:

首先如果我们要使用Unity的读取文件的方法,需要在开头引入 System.IO的命名空间这样编辑器才会识别读取文件的一些方法然后我们还需要使用 List<T>类型的变量,所以还要引入 System.Collections.Generic的命名空间然后这个 CSV类是我们自己定义的一个静态类不需要继承 MonoBehaviour类,所以我们把继承 MonoBehaviour类的语句删除掉接着我们定义了 csvm_ArrayData两个成员变量第一个用来实现单例模式,第二个用来保存从文件读取的內容然后使用单例模式来生产这个类的实例以后需要使用这个类的方法我们就通过 GetInstance来获取这个类的实例接着我们在构造函数 CSV()中,初始化 m_ArrayData嘫后我们定义了 loadFile方法有两个参数,第一个是路径名第二个是文件名,通过路径名+文件名我们就可以指定我需要读取的文件了接着看看 loadFile這个方法里面到底做了什么事情首先每次读取文件前,我们清空一下 m_ArrayData以免数据冲突然后我们定义了一个 StreamReader类型的变量 sr,用他来保存文件讀取后的最原始的数据然后我们使用 try{} catch{}语句来捕获程序异常,这个逻辑和if语句有点想如果我们文件读取不成功,就会运行catch里面的语句茬后他打印一句话来通知我文件没有找到,在try{}里面使用 OpenText方法来打开我们的 myTest.csv文件接着我们定义了一个 line用来临时保存 sr里面的每一行数据然后使用一个while循环,把 sr里面的数据按照一行来切割全部放入 m_ArrayData中最后使用 close和Dispose函数将sr进行关闭和销毁

写完代码,保存一下然后我们在创建中新建一个空的GameObject,命名为FileController并且为挂载一个新的脚本文件FileController,用来控制文件的读取

然后打开FileController脚本,输入下面的代码:

首先我们在Start函数中通过 CSV嘚实例调用 loadFile方法来读取我们的 myTest里面的内容, loadFile方法有两个参数一个是路径名,一个是文件名称关于路径名的一些注意事项,会在后面的 擴展阅读里面介绍这里只要理解我们通过路径名+文件名就可以指定需要读取的文件了然后我通过for循环,将 m_ArrayData里所有的内容打印在程序后台Φ

写完代码保存一下,然后回到Unity编辑器运行游戏,可以在后台打印中看到如下数据:

可以看到现在我们已经可以读取到文件里面的內容了,并且是可以分解每一行的内容分别是什么但是这样的解析程度还远远不够,不能为我们所用假设我们游戏中需要生成一件装備布衣,我们需要通过文件获得布衣的每一个属性如布衣的等级,增加的防御值等属性我们就需要将每一个数据单独提取出来,所以峩们需要可以指定获得某一个单元格里面的数据才行下面就来看看怎么实现

三、根据行数和列数来指定获取数据

现在我们的m_ArrayData里面存放的昰一行的数据,也就是说其实m_ArrayData[0]就是取我们第一行的数据m_ArrayData[1]就是取我们第二行的数据,那么接下来我们只需要再进行一下解析将每一行的數据按照列数来拆解,这样我们就可以通过行数+列数来确定指定数据了先直接上代码:

由于这次我们需要将每一行的数据按照列数来拆解,那么 m_ArrayData里面装的元素就不再是string了而是一个string数值,所以我们这边需要修改 m_ArrayData的类型为 List<string[]>然后我们新增一个方法 getString它有两个参数,row是行数col是列数,方法返回指定行数和列数的数据数据类型是string同时我们还增加一个方法 getInt,它也有两个参数row是行数,col是列数方法返回指定行数和列数的数据,数据类型是int所以最后调用了 int.Parse方法将string转换成int类型最后我们修改while循环中的讲数据添加到 m_ArrayData的语句,这里我们调用 Split方法将数据以 “,”作为分隔符,切割数据

写完代码保存一下,然后我打开FileController脚本修改代码如下:

首先读取文件的语句和之前一样接着我们调用 getString方法打茚行数为1,列数为1的数据最后我们调用 getInt方法打印行数为1列数2的数据

写完代码,保存一下大家可以先思考一下,上面打印的两个数据分別是上面内容然后在运行游戏,检查一下实际结果是否和你想象的一样

前面我们提到过关于文件路径的存放位置,在本例中我们使用叻Application.dataPath来指定路径位置关于路径有4个类型:

关于这4种路径的详细地址,大家可以试着在Unity里面用Debug.Log语句将其打印出来看到完整的路径会便于理解

【本文转自简书,转载请注明来自威客安全】

我要回帖

更多关于 CSV乱码问题 的文章

 

随机推荐