游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2332

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 4686|回复: 70

[士郎] Unity进阶技巧 - 从文件读取游戏数据

  [复制链接]  [移动端链接]
排名
3
昨日变化

6878

主题

7402

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
9877
威望
30
注册时间
2013-7-29
在线时间
3535 小时
最后登录
2018-10-18

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-5-17 15:16:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

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


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



一、制作CSV文件一般情况下,制作游戏数据会用到表格软件,windows下常用Excel,而Mac下常用Numbers,而这两种软件都可以导出我们本例所需要的文件——CSV文件
首先我们打开Numbers,新建一个文件。


1.png
新建一个Numbers文件

然后输入我们需要的内容,如下:
2.png
表格内容

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

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

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

3.png
然后在弹出的对话框,直接点击下一步:
4.png


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

导出后,我们找到myTest.csv文件,打开可以看到:
6.png
**myTest.csv**文件内容

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


7.png


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



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



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

10.png


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


  • 首先,如果我们要使用Unity的读取文件的方法,需要在开头引入System.IO的命名空间,这样编辑器才会识别读取文件的一些方法


  • 然后我们还需要使用List<T>类型的变量,所以还要引入System.Collections.Generic的命名空间


  • 然后这个CSV类是我们自己定义的一个静态类,不需要继承MonoBehaviour类,所以我们把继承MonoBehaviour类的语句删除掉


  • 接着我们定义了csv和m_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,用来控制文件的读取。


12.png



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

  • 首先我们在Start函数中,通过CSV的实例调用loadFile方法来读取我们的myTest里面的内容,loadFile方法有两个参数,一个是路径名,一个是文件名称,关于路径名的一些注意事项,会在后面的扩展阅读里面介绍,这里只要理解我们通过路径名+文件名就可以指定需要读取的文件了


  • 然后我通过for循环,将m_ArrayData里所有的内容打印在程序后台中



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

14.png


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


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


15.png
  • 由于这次我们需要将每一行的数据按照列数来拆解,那么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脚本,修改代码如下:


16.png



  • 首先读取文件的语句和之前一样

  • 接着我们调用getString方法打印行数为1,列数为1的数据

  • 最后我们调用getInt方法打印行数为1,列数2的数据

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

17.png
18.png


扩展阅读


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

  • Application.dataPath:该路径指向我们Unity编辑器的Asset文件夹
  • Application.persistentDataPath:该路径指向iOS和的沙盒路径
  • Application.streamingAssetsPath:streamingAsset文件夹路径,在任何平台都可以通过这个路径读取到文件夹里的内容
  • Application.temporaryCachePath:临时数据文件路径
关于这4种路径的详细地址,大家可以试着在Unity里面用Debug.Log语句将其打印出来,看到完整的路径会便于理解



简书@Zui


评分

参与人数 2鲜花 +3 收起 理由
chuhongbo + 1 很给力!
Vincher + 2 很给力!

查看全部评分

本帖被以下淘专辑推荐:

  • · I Like|主题: 85, 订阅: 8

跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

2初来乍到
125/150
排名
14102
昨日变化
7

0

主题

32

帖子

125

积分

Rank: 2Rank: 2

UID
237430
好友
0
蛮牛币
246
威望
0
注册时间
2017-8-14
在线时间
39 小时
最后登录
2018-6-29
发表于 2018-5-17 15:32:49 | 显示全部楼层

回复

使用道具 举报

排名
19741
昨日变化
7

0

主题

18

帖子

61

积分

Rank: 2Rank: 2

UID
281152
好友
0
蛮牛币
54
威望
0
注册时间
2018-5-14
在线时间
19 小时
最后登录
2018-10-16
发表于 2018-5-17 15:33:52 | 显示全部楼层
学习学习

回复

使用道具 举报

5熟悉之中
604/1000
排名
3652
昨日变化
27

2

主题

61

帖子

604

积分

Rank: 5Rank: 5

UID
137533
好友
0
蛮牛币
1427
威望
0
注册时间
2016-2-25
在线时间
159 小时
最后登录
2018-10-20
发表于 2018-5-17 16:14:26 | 显示全部楼层
进来看看先

回复

使用道具 举报

2初来乍到
135/150
排名
17985
昨日变化
11

0

主题

59

帖子

135

积分

Rank: 2Rank: 2

UID
4602
好友
1
蛮牛币
6
威望
0
注册时间
2013-9-26
在线时间
46 小时
最后登录
2018-9-10
发表于 2018-5-17 17:51:49 | 显示全部楼层
thanks for this sharing

回复 支持 反对

使用道具 举报

5熟悉之中
842/1000
排名
5528
昨日变化
2

0

主题

436

帖子

842

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2732
威望
0
注册时间
2016-4-25
在线时间
166 小时
最后登录
2018-10-16
QQ
发表于 2018-5-17 18:52:31 | 显示全部楼层
支持一下,谢谢分享

回复 支持 反对

使用道具 举报

2初来乍到
111/150
排名
11936
昨日变化
10

0

主题

5

帖子

111

积分

Rank: 2Rank: 2

UID
281371
好友
0
蛮牛币
372
威望
0
注册时间
2018-5-15
在线时间
33 小时
最后登录
2018-8-12
发表于 2018-5-17 19:05:54 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1603/5000
排名
18504
昨日变化
12

4

主题

759

帖子

1603

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
63377
好友
0
蛮牛币
67
威望
0
注册时间
2014-12-24
在线时间
810 小时
最后登录
2018-10-19
发表于 2018-5-17 19:47:29 | 显示全部楼层
#在这里快很不错很撒很符合我温柔速回复#

回复 支持 反对

使用道具 举报

4四处流浪
499/500
排名
4296
昨日变化
46

0

主题

80

帖子

499

积分

Rank: 4

UID
276682
好友
0
蛮牛币
1125
威望
0
注册时间
2018-4-11
在线时间
97 小时
最后登录
2018-10-21
发表于 2018-5-17 19:51:33 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
2721/5000
排名
876
昨日变化
2

48

主题

724

帖子

2721

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
8268
威望
0
注册时间
2015-1-20
在线时间
835 小时
最后登录
2018-10-20
发表于 2018-5-18 00:54:34 | 显示全部楼层
很有帮助,感谢分享

回复 支持 反对

使用道具 举报

7日久生情
1912/5000
排名
4296
昨日变化
4

0

主题

1335

帖子

1912

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
267381
好友
6
蛮牛币
3205
威望
0
注册时间
2018-2-1
在线时间
257 小时
最后登录
2018-10-6
发表于 2018-5-18 08:13:52 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1392/1500
排名
1639
昨日变化
12

0

主题

402

帖子

1392

积分

Rank: 6Rank: 6Rank: 6

UID
87577
好友
0
蛮牛币
4643
威望
0
注册时间
2015-3-31
在线时间
240 小时
最后登录
2018-10-21
发表于 2018-5-18 08:24:13 | 显示全部楼层
too good too strong!

回复 支持 1 反对 0

使用道具 举报

5熟悉之中
806/1000
排名
4804
昨日变化
28

0

主题

284

帖子

806

积分

Rank: 5Rank: 5

UID
180321
好友
4
蛮牛币
673
威望
0
注册时间
2016-11-21
在线时间
240 小时
最后登录
2018-10-19
发表于 2018-5-18 09:10:48 | 显示全部楼层
刚看完你的新闻又来看你的技术贴,一天更新这么多文字,也是很厉害了

回复 支持 反对

使用道具 举报

4四处流浪
370/500
排名
6717
昨日变化
4

2

主题

102

帖子

370

积分

Rank: 4

UID
280625
好友
0
蛮牛币
568
威望
0
注册时间
2018-5-10
在线时间
83 小时
最后登录
2018-10-13
发表于 2018-5-18 09:26:05 | 显示全部楼层
感谢分享~~~~~~~~~~

回复

使用道具 举报

7日久生情
2202/5000
排名
1377
昨日变化
2

11

主题

312

帖子

2202

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
159103
好友
6
蛮牛币
6357
威望
0
注册时间
2016-8-29
在线时间
975 小时
最后登录
2018-10-8

活力之星锦衣玉食

发表于 2018-5-18 09:37:25 | 显示全部楼层
学习到了  真心不错的分享

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表