11.Unity,在程序中读取外部文件资源

主要介绍 为什么要规范化地读取外部文件,四种读取外部资源的方式,两个读取外部资源的类(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其实就是文本文件

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值