2026.6.7 - AB包学习(1)

发布时间:2026/7/7 2:54:51
2026.6.7 - AB包学习(1) 完成了什么分别用三种方式加载 AB 包中的资源普通同步加载最简单的用法直接加载单个 AB 包中的资源依赖加载处理 AB 包之间的依赖关系分两种写法异步加载运行时动态加载避免卡顿示例资源一个 AB 包里包含Bullet和Cylinder两个预制体。一、普通同步加载LoadPath Application.streamingAssetsPath; // 加载 AB 包文件 AssetBundle ab AssetBundle.LoadFromFile(LoadPath / model); // 从 AB 包中加载资源 GameObject go ab.LoadAssetGameObject(Bullet); GameObject go2 ab.LoadAssetGameObject(Cylinder); // 实例化到场景 Instantiate(go); Instantiate(go2);关键点LoadFromFile从磁盘文件加载 AB 包同步执行会卡主线程LoadAssetT从已加载的 AB 包中获取指定名称的资源适合启动时加载配合 Loading 界面或小文件二、依赖加载当 AB 包之间有依赖关系时比如model包引用了material包里的材质需要先加载所有依赖包否则资源会丢失材质或贴图。写法一加载全部依赖简单粗暴// 加载主包Manifest 包 AssetBundle abMain AssetBundle.LoadFromFile(LoadPath / StandaloneWindows); // 获取 Manifest AssetBundleManifest abManifest abMain.LoadAssetAssetBundleManifest(AssetBundleManifest); // 获取所有 AB 包名称 string[] depNames abManifest.GetAllAssetBundles(); // 全部加载 foreach (string depName in depNames) { AssetBundle.LoadFromFile(LoadPath / depName); }适用场景资源数量少、不在乎加载时间。写法二只加载指定包的依赖推荐// 获取 model 这个包依赖了哪些包 string[] deps abManifest.GetAllDependencies(model); // 只加载这些依赖 foreach (string depName in deps) { AssetBundle.LoadFromFile(LoadPath / depName); }适用场景AB 包数量多只想加载当前需要的包及其依赖节省内存。两种写法的区别GetAllAssetBundlesGetAllDependencies加载范围所有 AB 包指定包的依赖内存占用大小适用场景小项目、全量预加载大项目、按需加载三、异步加载运行时加载资源不想卡主线程就用异步。IEnumerator ABAsyncLoad(string path) { // 异步加载 AB 包文件 AssetBundleCreateRequest abAsync AssetBundle.LoadFromFileAsync(path); yield return abAsync; // 等待加载完成主线程不卡 AssetBundle bundle abAsync.assetBundle; if (bundle null) { Debug.LogError(Failed to find AssetBundle); yield break; } // 从包中同步加载资源此时包已在内存中速度很快 GameObject prefab bundle.LoadAssetGameObject(Bullet); if (prefab ! null) { Instantiate(prefab); } } // 调用 StartCoroutine(ABAsyncLoad(LoadPath / model));关键点LoadFromFileAsync返回AssetBundleCreateRequestyield return等待加载完成不阻塞主线程AB 包加载完成后内部资源的LoadAsset用同步方式即可因为文件已在内存中什么时候用异步场景推荐方式启动时加载同步反正有 Loading 界面运行时换武器、切场景异步不能卡玩家操作加载大文件10MB异步加载小配置文件同步四、卸载AssetBundle.UnloadAllAssetBundles(false);参数区别false只卸载 AB 包本身已加载的资源预制体、贴图等保留true连同所有已加载的资源一起卸载什么时候用切换场景时调用UnloadAllAssetBundles(true)彻底清理只想释放 AB 包内存但资源还要用用false五、总结加载方式方法特点同步加载LoadFromFile简单会卡主线程异步加载LoadFromFileAsync不卡主线程配合协程依赖加载GetAllDependencies按需加载依赖省内存卸载UnloadAllAssetBundles释放 AB 包内存