主要讲Assetbundle的网络加载方式
之前所讲的都是AssetBundle.LoadFromFile的方法,这是直接从硬盘上加载,而且属于同步加载。
WWW.LoadFromCacheOrDownload
呵呵哒,这个方法现在已经弃用了。然而我用的是5.4的版本,还是可以用的。
解释一下方法里的参数,第一个url就是下载的路径,第二个version是指版本号,如果要下载的东西的版本和本地已存在的版本号一样那就用本地,如果不一样那就会从地址里下载到本地。
此方法应用的代码如下:
看完下面代码,可能会想为什么要用这方法而不是 using (WWW www = new WWW(url))的方法呢? ??using (WWW www = new WWW(url))方法也是可以使用的(亲测),但是官网解释的很清楚那就是LoadFromCacheOrDownload() must be used in place of "new WWW (url)" in order to utilize caching functionality.,为了处理缓存问题,而new WWW是不具备处理缓存的功能的。注意这个方法只能用来接收AssetBundles的文件不适合其他类型的缓存。
特别注意Note: URL must be '%' escaped. 路径里是不能使用%的。
using UnityEngine;
using System.Collections;
public class loadtest : MonoBehaviour {
public string url;
string PathA;
// Use this for initialization
private void Awake()
{
PathA = System.Environment.CurrentDirectory;
//因为测试是使用的本地路径,本地路径的斜杠是“\”所以需要用“/”来代替
if (PathA.Contains("\\"))
{
PathA = PathA.Replace("\\", "/");
}
url = "file://" + PathA + "/AllAssets/test.assetbundle";
Debug.Log(url);
}
IEnumerator LoadAssetsFun()
{
while (!Caching.ready)
yield return null;
var www = WWW.LoadFromCacheOrDownload(url,0);
yield return www;
if (!string .IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
yield return null;
}
AssetBundle myload = www.assetBundle;
if(myload==null)
{
Debug.Log("下载错误");
}
Object[] obj = myload.LoadAllAssets();
foreach (Object ass in obj)
{
Debug.Log(ass.name);
Instantiate(ass);
}
myload.Unload(false);
}
private void OnGUI()
{
Rect rect = new Rect(100f, 100f, 200f, 200f);
if (GUI.Button(rect, "Load"))
{
StartCoroutine(LoadAssetsFun());
}
}
}
UnityWebRequest
该方法为新版的方法,最推荐使用它来代替www的方法,因为该方法可以减小内存开销。
先用UnityWebRequest.GetAssetBundle进行下载,再用DownloadHandlerAssetBundle.GetContent(UnityWebRequest)获取AB对象
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class loadtest : MonoBehaviour {
public string url;
string PathA;
// Use this for initialization
private void Awake()
{
PathA = System.Environment.CurrentDirectory;
//因为测试是使用的本地路径,本地路径的斜杠是“\”所以需要用“/”来代替
if (PathA.Contains("\\"))
{
PathA = PathA.Replace("\\", "/");
}
url = "file://" + PathA + "/AllAssets/test.assetbundle";
Debug.Log(url);
}
IEnumerator LoadAssetsFun()
{
UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(url, 0);
yield return request.Send();
AssetBundle myload = DownloadHandlerAssetBundle.GetContent(request);
Object[] obj = myload.LoadAllAssets();
foreach (Object ass in obj)
{
Debug.Log(ass.name);
Instantiate(ass);
}
myload.Unload(false);
}
private void OnGUI()
{
Rect rect = new Rect(100f, 100f, 200f, 200f);
if (GUI.Button(rect, "Load"))
{
StartCoroutine(LoadAssetsFun());
}
}
}
标签:www,url,WWW,myload,Assetbundle,using,PathA,详解,加载 From: https://blog.51cto.com/u_8378185/5990717