热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity进阶从文件读取游戏数据

Unity新手入门进阶之路(群内各种入门资源资料大神):721559786(加群下载插件资源学习资料)             

Unity新手入门进阶之路(群内各种入门资源资料大神):721559786 (加群下载插件资源学习资料)

                                           《Unity进阶 - 从文件读取游戏数据》

前言

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


你将学到什么?

  • 使用Numbers制作CSV数据文件
  • Unity基础的文件读取
  • 通过行数和列数获得指定的数据

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

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

                                                     《Unity进阶 - 从文件读取游戏数据》

新建一个Numbers文件


然后输入我们需要的内容,如下:
《Unity进阶 - 从文件读取游戏数据》

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

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

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


《Unity进阶 - 从文件读取游戏数据》

然后在弹出的对话框,直接点击下一步:
《Unity进阶 - 从文件读取游戏数据》





然后在接下来的对话框中,选择文件名和保存路径:
《Unity进阶 - 从文件读取游戏数据》



导出后,我们找到myTest.csv文件,打开可以看到:
《Unity进阶 - 从文件读取游戏数据》

**myTest.csv**文件内容


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




《Unity进阶 - 从文件读取游戏数据》





所以我们导出CSV文件是,记得要删除掉那些空的单元格,如下图:
《Unity进阶 - 从文件读取游戏数据》







然后我们再导出一次,并打开导出的文件查看,就会发现那些多与的逗号没有了
《Unity进阶 - 从文件读取游戏数据》






二、读取CSV文件

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


《Unity进阶 - 从文件读取游戏数据》





然后我们新建一个名为CSV的脚本,打开进行编辑,输入一下代码:
《Unity进阶 - 从文件读取游戏数据》




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


  • 然后我们还需要使用List类型的变量,所以还要引入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,用来控制文件的读取。



《Unity进阶 - 从文件读取游戏数据》







然后打开FileController脚本,输入下面的代码:
《Unity进阶 - 从文件读取游戏数据》


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


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

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


《Unity进阶 - 从文件读取游戏数据》





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

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


《Unity进阶 - 从文件读取游戏数据》

  • 由于这次我们需要将每一行的数据按照列数来拆解,那么m_ArrayData里面装的元素就不再是string了,而是一个string数值,所以我们这边需要修改m_ArrayData的类型为List


  • 然后我们新增一个方法getString,它有两个参数,row是行数,col是列数,方法返回指定行数和列数的数据,数据类型是string


  • 同时我们还增加一个方法getInt,它也有两个参数,row是行数,col是列数,方法返回指定行数和列数的数据,数据类型是int,所以最后调用了int.Parse方法将string转换成int类型


  • 最后我们修改while循环中的讲数据添加到m_ArrayData的语句,这里我们调用Split方法,将数据以 “,” 作为分隔符,切割数据

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


《Unity进阶 - 从文件读取游戏数据》

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

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


《Unity进阶 - 从文件读取游戏数据》

《Unity进阶 - 从文件读取游戏数据》

扩展阅读



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

  • Application.dataPath:该路径指向我们Unity编辑器的Asset文件夹
  • Application.persistentDataPath:该路径指向iOS和的沙盒路径
  • Application.streamingAssetsPath:streamingAsset文件夹路径,在任何平台都可以通过这个路径读取到文件夹里的内容
  • Application.temporaryCachePath:临时数据文件路径

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


简书@
Zui


推荐阅读
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
xuyuankeji_954
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有