以上是官方文档的说明,下面我详细说一下关于AssetBundle加载资源的过程:IEnumerator LoadAssetAsync(string url, int version)
{
while (!Caching.ready)
yield return null;
using (WWW www = WWW.LoadFromCacheOrDownload(url, version))
{
yield return www;
AssetBundle bundle = www.assetBundle;
//异步加载名为myObject的GameObject对象,返回AssetBundleRequest
AssetBundleRequest request = bundle.LoadAssetAsync("myObject", typeof(GameObject));
yield return request;
//获取加载的对象,并创建出来
GameObject obj = request.asset as GameObject;
Instantiate(obj);
bundle.Unload(false); //切记释放没用资源
}
}
//需要加载的资源名称,注意这个名称是打包时设置的AssetBundle名称
public string assetName;
//打包Assetbundle的主路径
public string localPath;
//打包时在主路径中生成的总的Manifest文件
public string manifestName;
//先加载总的AssetBundleManifest文件
WWW www = new WWW("file://" + localPath + manifestName); //加载主路径的Manifest
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.LogError(www.error);
}else
{
AssetBundle bundle = www.assetBundle; //获取AssetBundle
AssetBundleManifest manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); //获取总的AssetBundleManifest
bundle.Unload(false);
}
//然后获取所需资源的依赖资源
. string[] dps = manifest.GetAllDependencies(assetName.ToLower()); //assetName转换为小写,因为设置的AssetBundle名称自动转换成小写
Debug.Log("依赖资源的数目:"+ dps.Length);
AssetBundle[] dpsBundle = new AssetBundle[dps.Length]; //用于保存加载的依赖资源包AssetBundle
for (int i = 0; i < dpsBundle.Length; i++)
{
Debug.Log(dps[i]);
string dUrl = "file://" + localPath + dps[i];
using (WWW www = new WWW(dUrl))
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.LogError(www.error);
else
dpsBundle[i] = www.assetBundle;
}
}
//然后加载所需的资源
using (WWW www = new WWW("file://" + localPath + fileName.ToLower()))
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.LogError(www.error);
else
{
AssetBundle bundle = www.assetBundle;
//然后就可以通过资源包中所需的资源真正名称来获取资源对象了,例如获取名为Cube的游戏对象如下:
GameObject obj = bundle.LoadAsset<GameObject>("Cube");
if (obj != null)
{
Instantiate(obj); //创建对象
}
//如果资源包中存在场景,加载资源包中的场景方法如下:
//SceneManager.LoadScene("MyScene");
bundle.Unload(false);
}
}
//获取到所需的资源后,记得要释放掉内存中的依赖资源的AssetBundle
foreach (AssetBundle item in dpsBundles)
{
item.Unload(false);
}