Unity 生成 Android App Bundle(aab) (一)
目前知道的生成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
插件下載:https://github.com/google/play-unity-plugins/releases
需要插件:com.google.android.appbundle和com.google.play.assetdelivery
區別:
使用插件界面創建資產包只能配置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是資產包的路徑
四、注意
每次執行"Build and Run",臨時apks都會存放在C盤,需手動刪除
C:\Users\wwm\AppData\Local\Temp\play-unity-build