一、AssetBundle的下载:把硬盘或者网络的文件读到内存一个区域,只是AssetBundle内存镜像数据块
下载方式:
1、//非缓存机制,所下载的资源文件不会被写入unity引擎的缓存区
WWW www = new WWW ("http://127.0.0.1:8080/My/AssetBundle/scene");,
2、//通过缓存机制下载的AssetBundle会被存储到unity的本地缓存区中
WWW www= WWW.LoadFromCacheOrDownload("http://127.0.0.1:8080/My/AssetBundle/scene",2);
3、//通过缓存机制下载的AssetBundle会被存储到unity的本地缓存区中
UnityWebRequest www = UnityWebRequest.GetAssetBundle (url,2,917173786);
二、AssetBundle的加载:将AssetBundle的内容加载到内存里,并实例化AssetBundle文件中的对象。
加载方式:
1、AssetBundle.LoadFromFile ();//同步加载
AssetBundle cubeBundle=AssetBundle.LoadFromFile(Application.dataPath+"/AssetBundle/bundle");
2、 AssetBundle.LoadFromFileAsync ();//异步加载
3、AssetBundle.LoadFromMemory ();
AssetBundle bd= AssetBundle.LoadFromMemory (File.ReadAllBytes(path));
4、AssetBundle.LoadFromMemoryAsync ();
5、ab.LoadAllAssets ();
6、ab.LoadAllAssetsAsync ();
7、 ab.LoadAsset ();
GameObject cube = bd.LoadAsset<GameObject> ("Cube");
8、ab.LoadAssetAsync ();
同步加载在主线程
异步加载在子线程,场景加载用此方式,减少卡顿,与主线程无关
三、AssetBundle的卸载
//释放AssetBundle文件的内存镜像,不包含load创建的Asset内存对象
ab.Unload (true);
//释放AssetBundle文件的内存镜像,并销毁所有load创建的Asset内存对象
ab.Unload (false);
四、实例
使用的下载方式: UnityWebRequest.GetAssetBundle()
使用的加载方式:ab.LoadAllAssets ();
//UnityWebReauest方式下载,然后从内存加载资源
public IEnumerator DownLoadFromServer(){
string url = "http://127.0.0.1:8080/My/AssetBundle/scene";
UnityWebRequest www = UnityWebRequest.GetAssetBundle (url,2,917173786);
//通过缓存机制下载的AssetBundle会被存储到unity的本地缓存区中
yield return www.Send ();
if (www.error != null) {
Debug.Log ("下载出错" + www.error);
yield return null;
}
//AssetBundle下载完成后,并不能直接使用,需要将AssetBundle加载到内存中,
//并且创建成具体的文件对象[AssetBundle的加载]
AssetBundle ab = DownloadHandlerAssetBundle.GetContent (www);
ab.LoadAllAssets ();
AsyncOperation a= SceneManager.LoadSceneAsync ("m_asset");
yield return a;
}
效果:将改脚本挂载到另一个场景的摄像机上,一定要联网,服务器打开,运行就会出现另外一个场景,即使项目中目前没这个场景或者场景已经改变
注:
在web player平台上发布的网页游戏默认缓存大小为50M
在PC客户端发布的游戏和在ios/Android平台上发布的移动游戏默认缓存大小为4G