开发阶段
创建AssetBundle文件
使用BuildPipeline类的BuildAssetBundle进行文件创建
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
BuildAssetBundleOptions
值 | 特点 |
---|---|
None | 使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。 |
UncompressedAssetBundle | 不压缩,包大,加载快 |
ChunkBasedCompression | 使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。 |
AssetBundle分组策略
1,把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
2,把需要同时加载的资源放在一个包里面
3,可以把其他包共享的资源放在一个单独的包里面
4,把一些需要同时加载的小资源打包成一个包
5,如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分 v1 v2 v3 unity3dv1 unity3dv2
上传创建好的AssetBundle到外部存储
将AssetBundle文件上传到远程服务器供已经开发好的应用或游戏进行下载和更新资源
运行阶段
下载AssetBundle文件
- 网上下载无需缓存:直接通过WWW对象实现
- 网上下载需要缓存:通过WWW的LoadFromCacheDownload静态方法处理
- 从本地文件或内存中直接下载:通过AssetBundle类的LoadFromFile,LoadFromFileAsync,LoadFromMemory,LoadFromMemoryAsync。
加载AssetBundle资源
方法 | 描述 |
---|---|
Object LoadAsset(string name); | 通过name来加载资源 |
AssetBundleRequest LoadAssetAsync(string name); | 与LoadAsset类似,读取时不会堵塞主线程 |
Object[] LoadAllAssets(Type type); | 从AssetBundle文件读取所有资源对象,type用来过滤返回的对象类型 |
AssetBundleRequest LoadAllAssetsAsync(); | 加载所有资源,不会堵塞主线程 |
加载Manifests文件可以处理资源的依赖
AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath); AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); string[] dependencies = manifest.GetAllDependencies("assetBundle"); foreach(string dependency in dependencies) { AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency)); }
AssetBundle的卸载
void Unload(bool unloadAllLoadedObjects);
unloadAllLoadedObjects的值 | 描述 |
---|---|
false | 卸载所有没用被使用的资源 |
true | 卸载所有资源,即使有资源被使用着 |