关于资源加载问题要讲到 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类来下载。