UH1L2——AB包资源加载

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
AssetBundle.LoadFromFile()                //指定AB包文件路径,加载AB包
assetBundle.LoadAsset() //从AB包中加载文件,通过名字加载(不推荐)
assetBundle.LoadAsset(, typeof()) //从AB包中加载文件,通过名字和类型加载(返回Object类型,需要as成对应的类型)
assetBundle.LoadAsset<>() //从AB包中加载文件,通过名字和泛型加载(热更新无法使用)
AssetBundle.LoadFromFileAsync() //异步加载AB包,返回AssetBundleCreateRequest
AssetBundleCreateRequest //AB包创建请求,可以在协程里返回它挂起协程,直到加载结束
assetBundleCreateRequest.assetBundle //AB包加载完毕后,可以通过它来获取AB包
assetBundle.LoadAssetAsync() //异步加载AB包中资源,返回AssetBundleRequest
AssetBundleRequest //AB包请求,可以在协程里返回它挂起协程,直到加载结束
assetBundleRequest.asset //从AB包中加载资源完毕后,可以通过它来获取资源
AssetBundle.UnloadAllAssetBundles() //卸载所有AB包。如果传入true还会一并卸载所有AB包中的资源
assetBundle.Unload() //卸载该AB包。如果传入true还会一并卸载该AB包中的所有资源

从AB包中加载资源

从AB包加载资源非常简单,先加载指定路径的AB包,然后从加载出来的AB包内加载资源即可

1
2
3
4
5
//加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//加载AB包中的资源
GameObject obj = ab.LoadAsset<GameObject>("Cube");
Instantiate(obj);

其中,AssetBundle.LoadFromFile​方法需要指定AB包所在的文件路径
这也是为何建议在打AB包时建议勾选拷贝到streamingAssetsPath文件夹的选项,
因为我们可以直接调用Application.streamingAssetsPath​来直接读取该文件夹下的文件

assetBundle.LoadAsset​有三种重载:

  • 直接输入名字,返回Object​类型的加载方法(不推荐,因为可能需要同名不同类型的资源)

    1
    GameObject obj = assetBundle.LoadAsset("Cube");
  • 输入名字再输入类型,返回Object​类型的加载方法(需要as​成我们需要的类型)

    1
    GameObject obj = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;
  • 输入泛型再输入名字,返回泛型的加载方法(很方便,但由于Lua不支持泛型而导致它无法用于热更新)

    1
    GameObject obj = assetBundle.LoadAsset<GameObject>("Cube");

注意!同一AB包不能重复加载,否则报错

异步加载AB包资源

AB包的异步加载需要用到协同程序

其中加载AB包和加载AB包中的资源都可以异步加载,也就是让协程挂起后等待加载完成后在继续执行协程内的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Image img;

void Start()
{
StartCoroutine(LoadABRes("head", "quanlity_0"));
}

IEnumerator LoadABRes(string ABName, string resName)
{
AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return assetBundleCreateRequest;
AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<Sprite>(resName);
yield return assetBundleRequest;
img.sprite = assetBundleRequest.asset as Sprite;
}

其中AssetBundleCreateRequest​是由AssetBundle.LoadFromFileAsync​返回的加载AB包请求,
yield return​它可以挂起协程直至加载完毕,加载完毕后,就可以通过assetBundleCreateRequest.assetBundle​来得到AB包

assetBundle.LoadAssetAsync​是异步加载其中的资源,
返回AssetBundleRequest​的加载资源请求,yield return​它可以挂起协程直至加载完毕
加载完毕后,就可以通过assetBundleRequest.asset​来得到加载的资源

卸载所有的AB包资源

卸载所有加载的AB包,参数为bool​类型,
如果传入ture​,则将会把所有的AB包中加载的资源一并也卸载了(很可能会造成场景贴图丢失等问题,因此一般传入false)

1
AssetBundle.UnloadAllAssetBundles(false);

卸载某个AB包资源

将该AB包卸载,如果传入ture​,则该AB包中加载的资源一并也卸载了(很可能会造成场景贴图丢失等问题,因此一般传入false)

1
assetBundle.Unload(false);