目前知道的生成aab的方式有:
一、使用Unity3d自带的方式
PS:小于150MB小游戏使用。超出150MB的aab无法上架google
二、使用google插件中Separate Base APK Asset(类似APK+OBB)
插件下载地址:https://github.com/google/play-unity-plugins/releases
这个是最方便的方式,类似unity提供的apk+obb方式,和obb一样把打好的asset bundle包放到StreamingAssets目录,勾选Separate Base APK Asset然后打包就行,不需要考虑超出150MB的问题。
步骤:
1、下载并导入插件com.google.android.appbundle
2、打开Asset Delivery Settings面板并勾选Separate Base APK Asset
3、点击Google--Build Android App Bundle/Build and Run
PS:我遇到的报错:您的 Android App Bundle 包含的 BundleConfig.pb 文件无效
错误原因:我们工程的asset bundle的粒度最小文件过多,导致打出的包上传google报错,经过几次删asset bundle包测试,发现aab文件里的BundleConfig.pb文件过大就会报错(测试是超过1MB都会报错),不得不放弃这种简单快捷的方式改用第三种方式种方式
BundleConfig.pb里包含了所有ab包信息
三、使用google插件中Play Asset Delivery Unity API
Play Asset Delivery Unity API有两种方式: 使用插件界面创建资源包 使用 API创建资源包
注意:这种方式asset bundle文件都不能放到了StreamingAssets目录了
官方提供的示例:https://developer.android.com/codelabs/unity-gamepad#0
区别:
使用插件界面创建资产包只能配置assetbundle,使用API创建资源包有个AssetPack的概念,里面也可以不包含assetbundle
使用插件界面创建资产包:
这种方式不推荐
1、asset bundle文件数量不能超过50
2、对于名称的要求:资产包名称必须以字母开头,并且只能包含字母、数字和下划线
我们的项目不符合这两个条件,所以最终使用API创建资源包
API创建资源包
官方给的示例demo,或者资源包打包配置说明和获取资源包接口说明很详细了
修改如下:
1、下载并导入插件
2、原本的StreamingAssets的资源拿出来单独放个文件夹,如果超过1g则分成两个文件夹,根据资源包打包配置说明设置1g的为InstallTime,其他为FastFollow(大小不能超过512)
ps:
1、简单直接分成两个资产包Aseet Pack是因为:上线项目,obb方式、所有都在StreamingAssets里、大小目前1.1g,所以也没考虑OnDemand
2、StreamingAssets里的资源原本是有文件夹目录的,分放到两个资产包文件夹里不能有相同路径,否则报错。比如:assetPack1/asset/a.ab、assetPack2/asset/b.ab
3、因为有OnDemand资产包,所以启动的时候检测下载、下载包体大小、下载进度、下载等,接口说明
4、修改assetbundle获取方式。接口说明
ps:
1、我们有很多上千lua文件和几千ab包,加载走的路径加载。按照给的接口方式加载会很慢,加载很耗时。后来改为还是按照路径走,路径根据资产包类型有些变化
www方式 | 非www方式 | |
原本的StreamingAssets | string.Format("jar:file://{0}!/assets/a.ab", Application.dataPath); | string.Format("{0}!assets/a.ab", Application.dataPath); |
InstallTime | string.Format("jar:file://{0}!/assets/{1}/a.ab", Application.dataPath,"assetpack"); | string.Format("jar:file://{0}!assets/{1}/a.ab", Application.dataPath,"assetpack"); |
OnDemand/FastFollow | string.Format("file://{0}/a.ab", assetPackFilePath); | string.Format("{0}/a.ab", assetPackFilePath); |
assetPackFilePath:这个路径会变,所以我在资源包下载完毕后,根据资产包里肯定会存在的一个资产调用PlayAssetPackRequest.GetAssetLocation() 获取 AssetLocation 对象,AssetLocation.Path是资产包的路径