【Unity 笔记】文件的写入与读取(2)
2014-12-10 19:13
513 查看
引言:
上篇写了关于怎么用文件流的方式来读写文件,这篇介绍下在unity下怎么利用Reasource.load读取存在本地的文件,只能读哦~原理:
无论是Prefab还是其他的如文本文件之类的都可以利用Reasource.load()这个函数来获取,里面可以传两个参数,一个是路径,另一个是类型,当然也可以只传路径就可以。在unity中可以通过TextAsset这个类来获得文本里的内容,TextAsset这个类里面有一个text变量,可以将.txt的内容转为一个字符串,之后便可以对字符串进行切割,然后便可以得到我们想要的数据结构了。步骤:
首先需要创建一个txt文本:新建一个Excel表格,将我们需要的数据利用表格来排列,类似一个矩阵形式的数据,然后将表格另存为unicode编码格式的.txt文本文件,命名最好不要有中文。将文本文件拖入unity的project资源目录:要是新建的工程的Assets目录下没有Reasources这个文件夹,则新建一个文件夹,命名为Reasources,将文本拖入这个文件夹里面;或者再新建一个子文件夹,拖入子文件夹里面,记得不要有中文哈。
读取。
代码:
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; public class FileOperate : MonoBehaviour { public class ReadByAssetText { private string[][] m_strDatas; public ReadByAssetText(string assetPath)//构造函数,参数为数据表的地址 { LoadText(assetPath); } public string[][] StrDatas//外部访问,获得一个string类型的二维数组,存储数据表信息 { get{ return m_strDatas; } set{ if(m_strDatas==null) Debug.LogWarning("Load file occur error or file is null !"); } } private void LoadText(string asset_path) { TextAsset textAsset = Resources.Load (asset_path)as TextAsset; string strAsset = textAsset.text; string [] strLines = strAsset.Split (new char[]{'\n'}); m_strDatas=new string[strLines.Length-1][]; for(int i=0;i<strLines.Length-1;i++) { m_strDatas[i]=strLines[i].Split(new char[]{'\t'}); int t_column=m_strDatas[i].Length;//去掉\r回车字符 string t_str=m_strDatas[i][t_column-1]; t_str=t_str.Substring(0,t_str.Length-1); m_strDatas[i][t_column-1]=t_str; } } } void Start() { ReadByAssetText myassettext = new ReadByAssetText ("DataForm/testxxx"); string [][] temp = myassettext.StrDatas; Debug.Log (temp[0][0]); } }
代码分析:
这个代码我用了一个ReadByAssetText类进行了简单的封装了(这算不算封装呢),利用了一个构造函数,在new一个对象时进行初始化调用。要是不理解构造函数的童鞋自己去查查资料吧~关于{get;set}也是哦。接下来就是此代码的核心部分了,也就是LoadText这个函数。新建一个TextAsset对象读取Load下来的内容,然后新建一个字符串,将此文本全部内容变为一个长长的字符串,接下来就是对这个字符串strAsset进行分割存储了。新建两个字符串数组,一个一维数组strLines[],一个二维数组m_strData[][],一维数组用来存储每行的数据,二维数据用来存储最后完全切割好的数据。再此之前,我们必须要了解string.split()这个函数的作用。split是对字符串进行切割,通过自己特定的字符,例如a,b,c..或者转义字符如\n,\t,\r,\a...,以这些字符为界,将一个字符串分割为多个字符串。比如这次我们用到的就是\n,\t,和\r啦,注意split返回值是字符串数组呀~要是不太清楚split的朋友们可以百度下,这里也有个参考。最后要注意的是要去掉每一个的最后一个字符串的最后一位字符,因为它包含了多余的转义字符\r,其实一般的文本的最后一个数据都是包含了换行和回车的,换行是转到第二行,回车是回到这一行的最前面,所以是同时包含了回车和换行的。仔细看看代码就能很好的理解啦=,=
注意事项:
文本文件一定要是unicode或者UTF-8编码格式的,否则会读不出来。最好是利用表格进行存数据,自己直接在文本文件里写的话可能某些转义字符会比较不清楚。Resource,load()传的路径名不能包含后缀名,比如.txt是不能加上的。
进行行分割后,因为最后一个\n后面的空的数据也是存入了字符串数组的,所以实际有用的数组的长度比存入的要少一位。
在进行列分割后,注意最后一个数据是包含了两个转义字符的,一个是换行\n,一个是回车\r,前一次操作虽然将\n去掉了,但是没有去掉\r,切记切记,否则进行字符串比较的时候会出错的哦。
多余的话:
感觉这次blog的排版比第一次好多了感觉,虽然不能预览,但是花的时间明显少了,让人郁闷的就是写个blog还要审核,也木有办法。话说虽然这是几个月之前的东西了,但是上次没有把为什么最后一个字符串会有两个转义字符弄清楚,于是今天花了大把时间去纠结这个问题,由于不知道到底是什么字符,转义字符debug出来又是空的,最后我竟然是将最后一个字符存入一个char类型的变量,然后与各种转义字符进行比较,我去查有哪些转义字符,各种不对,突然看到一个回车字符,立马就对了,当时我还纳闷,查了一下回车和换行的区别,才第一次知道回车是回到此行的最开头,顿时恍然大悟。。。白白呆了将近4年的时光啊!想当年第一次学C语言的时候,那老师也是一直把回车换行两个功能说成回车,我也一直没弄明白回车是咋回事,还以为回车就是换行呢,噢噢噢,逗逼的时光也快木有了,学硬件而工作转软件的我也得付出更多才能生存呀,共勉之!相关文章推荐
- 【Unity 笔记】文件的写入与读取(2)
- 【Unity 笔记】文件的写入与读取(1)
- 【Unity 笔记】文件的写入与读取(1)
- PHP学习笔记(5)有规律大文件的读取和写入
- php学习笔记--高级教程--读取文件、创建文件、写入文件
- 跨平台Unity Excel 文件读取和写入
- Unity_ini配置文件应用(用于读取或写入程序设置)
- Hadoop学习笔记——1.java读取Oracle中表的数据,创建新文件写入Hdfs
- unity 在指定目录创建文件/读取文件/在文件内写入字符串
- C#笔记 通用文件的读取之二——XML文件的读取与写入
- Python 创建、读取和写入文件以及yield关键字- 千月的python linux 系统管理指南学习笔记(14)
- php笔记之:有规律大文件的读取与写入的分析
- c++学习笔记—c++对txt文件的读取与写入
- [学习笔记]Java文件IO操作------实现对文件的读取与写入
- C#笔记 通用文件的存取之二——XML文件的读取与写入
- 【Java学习笔记】基础知识学习17【文件文本读取写入】
- Hadoop Core 学习笔记(二) lzo文件的写入和读取
- Jsoup学习笔记9:Jsoup 解析saz文件,读取其中的htm文件到字符串,提取字符串中的数据写入csv文件中
- c++学习笔记—c++对txt文件的读取与写入
- Unity Excel 文件读取和写入