UH1L2——AB包资源加载
UH1L2——AB包资源加载
本章代码关键字
1 | AssetBundle.LoadFromFile() //指定AB包文件路径,加载AB包 |
从AB包中加载资源
从AB包加载资源非常简单,先加载指定路径的AB包,然后从加载出来的AB包内加载资源即可
1 | //加载AB包 |
其中,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 | public Image img; |
其中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); |