1、什么是AssetBundle
2、AssetBundle的打包流程
3、AssetBundle的加载与卸载
(1)同步加载
//加载ab包,*一个包只能加载一次,加载两次会报错
AssetBundle ab1 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "ab1");
//加载ab包里的资源
GameObject gameObject;
//参数:资源名,*避免使用,同名资源不同类型分不清
gameObject = ab.LoadAsset("Cube") as GameObject;
gameObject = ab1.LoadAsset("Cube", typeof(GameObject)) as GameObject;
gameObject = ab1.LoadAsset<GameObject>("Cube");
Instantiate(gameObject);
(2)异步加载
StartCoroutine(LoadABRes("ab2", "Sphere"));
IEnumerator LoadABRes(string ABName, string ResName) {
//加载包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return abcr;
//加载资源
AssetBundleRequest abr = abcr.assetBundle.LoadAssetAsync(ResName, typeof(GameObject));
yield return abr;
Instantiate(abr.asset);
}
(3)AB包依赖
ab1包中cube使用了ab2包中的材质,只加载ab1包会导致材质丢失,所以需要一起加载
//方法一,知道依赖包在哪直接加载
AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "ab2");
//方法二,通过主包获取依赖信息
//主包
AssetBundle abMain = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "StandaloneWindows");
//加载主包内文件
AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//获取ab1的依赖信息,参数为包名
string[] strs = abManifest.GetAllDependencies("ab1");
//循环加载对应依赖包
for (int i = 0; i < strs.Length; i++) {
AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + strs[i]);
}
(4)AB包卸载
//卸载AB包,参数为是否删除已创建在场景中的游戏物体
ab1.Unload(false);