主要介绍 为什么要规范化地读取外部文件,四种读取外部资源的方式,两个读取外部资源的类(Resources与WWW)
一、为什么要规范化地读取外部文件
最直接但不是很正确的方法是,在Assets的目录下新建一个文件夹(如FileName),然后将文件(如Text.xml)存放在该文件夹下。在代码中写:
using System.Xml.Linq
XElement testxml=XElement .Load("Assets/FileName/Text.xml");
testxml.ToString();
这种方式确实可以在Unity中读取到文件,也可以发布到PC上运行,但是如果发布到Android或者IOS上,就会出现找不到目录,或者不能正确读取文件数据。正确的做法是,根据你需要存放的数据的类型,建立特定的文件夹,并读取该文件夹中的数据。
在Unity编辑器中的资源路径有:
Application.dataPath:对应于项目的Assets文件夹
Application.sreamingAssetsPath:用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径
Application.persistentDatePath:系统路径,适合存一些持久化的数据
Application.temporaryCatchPath:系统路径,适合存一些临时数据的缓存目录
下面介绍特定的文件夹及对应的四种读取资源的方式。
二、四种读取外部资源的方式
1. Resources文件夹
Resources文件夹是Assets文件夹下一个默认隐式的文件夹,如果用户新建了同名的文件夹,就会覆盖原来的。这个文件夹只能动态读,不能动态写。它会随着项目打包被压缩与加密。
Resources文件下适合存放一些prefab资源,因为它在打包的时候回自动删除一些用不到的prefab,有利于精简压缩包。
如果Resources文件夹下有一个Text.xml,那么读取方式为:
Resources.Load("Text");
或者:GameObject instance=Instantiate(Resources.Load("Enemy",TypeOf(GameObject ))) as GameObject ;
2. StreamingAssets文件夹
同样是只读的保留文件夹。但是在打包时不被压缩与加密,只会原封不动地打入包中。适合存放二进制文件,只能用WWW类来读取。
如果StreamingAssets文件夹下有一个Text.xml,那么读取方式为:
string path = Application.sreamingAssetsPath+"/Text.xml"
WWW www=new WWW(path);
string s=www.text;
3. AssetBundle
这个不是一个文件夹,而是一种二进制文件类型,可以将prefab与二进制文件封装成AssetBundle文件,它不能更新脚本,但是如果prefab上挂的是本地脚本就能运行(除了本地脚本还有什么?),只能用www类加载该文件类型。
将Text.xml打包生成AssetBundle文件TextXML.bundle,将这个二进制文件放入StreamingAssets文件夹中。读取方式为:
string path = Application.sreamingAssetsPath+"/TextXML.bundle"
WWW www=new WWW(path);
www=WWW.LoadFormCatchOrDownload(path,0);
AssetBundle ab=www.assetBundle;
//以上都是和一般的读取StreamingAssets中读取文件是一样的,就是多了一句www=WWW.LoadFormCatchOrDownload(path,0);
//然后通过读取的ab读取原text文件
string path="text";
TextAsset text=ab.Load(path,typeof(TextAsset)) as TextAsset;//这个函数的语法和Resource一样
string s= text.ToString();
4. PersistentDatePath
运行时可读写,没运行时不能,无内容限制。
这个文件路径在iOS平台上是沙盒,在安卓平台上可以在ProjectSetting的Write Access中设置是沙盒还是SDcard。
三、两个读取外部资源的类(Resources与WWW)
1.Resources类
Resources类除了可以加载Resources文件夹中的数据资源的两个Load函数外,它还有一个比较常用的方法:
public static Object[] FindObjectOfTypeAll(Type type)
这个方法返回当前场景中所有符合Type类型的资源数组,这里的type可以是游戏对象,贴图,材质等等。
2. WWW类
www类是通过一个url获取资源,获取资源后可以通过www来访问资源,判断资源是否下载完毕(isDone),也可以向远程服务器发送GET与POST。当下载资源时,常常与协程配合使用
a.通过构造函数获取资源,会发送一个GET请求
WWW w= new WWW(string url);
b.利用LoadFormCatchOrDownload方法获取资源
WWW www=WWW.LoadFormCatchOrDownload(string url,int version,uint crc=0);
第二个参数表示版本号(猜测每二个AssetBundle的版本号不一样),第三个参数表示CRC-32校验,如果不为0,则传输需要校验,校验报错就会重新下载。
c. 利用WWWForm类实现POST请求
WWWForm form=new WWWForm();
form.AddField("score",100);
form.AddField("player","xiaoming");
WWW w= new WWW(url,form);
string s= w.text;
另外,POST与GET都是传输数据的,只是两种不同的方式,
POST是上传数据,数据会被加密,放在表单中,
GET是获取数据,数据被显示在url中,在?之后,以&相连,有本地缓存,且对长度有要求,
当然这只是http约定成俗的,你想反过来也行。
还有,csv其实就是文本文件