关于资源加载问题要讲到 Resources、StreamingAssets、AssetBundle这三个类。
Resources:
它作为一个Unity3D的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中。其特点是:
- 只读,即不能动态修改。所以想要动态更新的资源不要放在这里。
- 会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。
- 主线程加载。
- 资源读取使用Resources.Load(资源名)。
StreamingAssets:
要说到StreamingAssets,其实和Resources还是蛮像的。同样作为一个只读的Unity3D的保留文件夹出现。不过两者也有很大的区别,那就是Resources文件夹中的内容在打包时会被压缩和加密。而StreamingAsset文件夹中的内容则会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件。下面也同样做一个简单的总结:
- 只读不可写。
- 主要用来存放二进制文件。
- Android平台下一般是通过过WWW类来读取。
实例
可以打包成APK在手机上测试 把unity里streamingAssetsPath目录下选定的文件拷贝到手机的目标位置。
string path = Application.streamingAssetsPath + "/white.png";//找到streamingAssetsPath目录下的文件 把路径返回
public void file()
{
StartCoroutine(Png());
}
IEnumerator Png()
{
WWW www = new WWW(path);
yield return www;
if (www.isDone)
{
string topath = Application.persistentDataPath + "/" + "white.png";//目标路径
File.WriteAllBytes(topath, www.bytes);//把文件数据写入
}
}
直接读取文件
public void file()
{
StartCoroutine(Png());
}
IEnumerator Png()
{
string path = Application.streamingAssetsPath + "/white.txt";//找到streamingAssetsPath目录下的文件 把路径返回
WWW www = new WWW(path);
yield return www;
if (www.isDone)
{
string readResult=www.text;//输出成字符串
}
}
AssetBundle
是把prefab或者二进制文件封装成AssetBundle文件(也是一种二进制)。但是也有硬伤,就是在移动端无法更新脚本。下面简单的总结下:
- 是Unity3D定义的一种二进制类型。
- 最好将prefab封装成AseetBundle,不过上面不是才说了在移动端无法更新脚本吗?那从Assetbundle中拿到的Prefab上挂的脚本是不是就无法运行了?也不一定,只要这个prefab上挂的是本地脚本,就可以。
- 使用WWW类来下载。