0
点赞
收藏
分享

微信扫一扫

Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪

//?Creates?an?AssetPackConfig?with?a?single?asset?pack,?named

//?examplePackName,?containing?all?the?files?in?path/to/exampleFolder.

var?assetPackConfig?=?new?AssetPackConfig();

assetPackConfig.AddAssetsFolder("examplePackName",

"path/to/exampleFolder",

AssetPackDeliveryMode.OnDemand);

//?Configures?the?build?system?to?use?the?newly?created?assetPackConfig?when

//?calling?Google?>?Build?and?Run?or?Google?>?Build?Android?App?Bundle.

AssetPackConfigSerializer.SaveConfig(assetPackConfig);

//?Alternatively,?use?BundleTool.BuildBundle?to?build?an?App?Bundle?from?script.

BuildBundle(new?buildPlayerOptions(),?assetPackConfig);

}

你还可以使用类中的静态 BuildBundle 方法Bundletool生成带有资产包的 Android App Bundle,给定 「BuildPlayerOptions」「AssetPackConfig」

Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪

Play Asset Delivery Unity API 集成

================================

「Play Asset Delivery Unity API」 提供了请求资产包,下载管理,和访问资源的功能。「确保」首先将 Unity 插件添加到你的项目中。

你在 API 中使用的函数取决于你创建资产包的方式。

  • 如果你使用 UI 配置 AssetBundles,请「选择插件配置的资产包」

  • 如果你使用 API 配置资产包,请选「择API 配置的资产包」

你可以根据要访问的资产包的交付类型实施 API。这些步骤显示在以下流程图中。

Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪

检索 AssetBundles

导入 Play Asset Delivery API 并调用该 RetrieveAssetBundleAsync()方法来检索 AssetBundle。

using?Google.Play.AssetDelivery;

//?Loads?the?AssetBundle?from?disk,?downloading?the?asset?pack?containing?it?if?necessary.

PlayAssetBundleRequest?bundleRequest?=?PlayAssetDelivery.RetrieveAssetBundleAsync(asset-bundle-name);

安装时交货

资产包配置为「install-time」在应用程序启动时立即可用。你可以使用以下命令从 AssetBundle 加载场景:

AssetBundle?assetBundle?=?bundleRequest.AssetBundle;

//?You?may?choose?to?load?scenes?from?the?AssetBundle.?For?example:

string[]?scenePaths?=?assetBundle.GetAllScenePaths();

SceneManager.LoadScene(scenePaths[path-index]);

快速跟进和按需交付

这些部分适用于「fast-follow」「on-demand」资产包。

检查状态

每个资产包都存储在应用程序内部存储的单独文件夹中。使用该 「isDownloaded()」 方法确定是否已下载资产包。

监控下载

查询PlayAssetBundleRequest 监控请求状态的 对象:

//?Download?progress?of?request,?between?0.0f?and?1.0f.?The?value?will?always?be

//?1.0?for?assets?delivered?as?install-time.

//?NOTE:?A?value?of?1.0?will?only?signify?the?download?is?complete.?It?will?still?need?to?be?loaded.

float?progress?=?bundleRequest.DownloadProgress;

//?Returns?true?if:

//???*?it?had?either?completed?the?download,?installing,?and?loading?of?the?AssetBundle,

//???*?OR?if?it?has?encountered?an?error.

bool?done?=?bundleRequest.IsDone;

//?Returns?status?of?retrieval?request.

AssetDeliveryStatus?status?=?bundleRequest.Status;

switch(status)?{

case?AssetDeliveryStatus.Pending:

//?Asset?pack?download?is?pending?-?N/A?for?install-time?assets.

case?AssetDeliveryStatus.Retrieving:

//?Asset?pack?is?being?downloaded?and?transferred?to?app?storage.

//?N/A?for?install-time?assets.

case?AssetDeliveryStatus.Available:

//?Asset?pack?is?downloaded?on?disk?but?NOT?loaded?into?memory.

//?For?PlayAssetPackRequest(),?this?indicates?that?the?request?is?complete.

case?AssetDeliveryStatus.Loading:

//?Asset?pack?is?being?loaded.

case?AssetDeliveryStatus.Loaded:

//?Asset?pack?has?finished?loading,?assets?can?now?be?loaded.

//?For?PlayAssetBundleRequest(),?this?indicates?that?the?request?is?complete.

case?AssetDeliveryStatus.Failed:

//?Asset?pack?retrieval?has?failed.

case?AssetDeliveryStatus.WaitingForWifi:

//?Asset?pack?retrieval?paused?until?either?the?device?connects?via?Wi-Fi,

//?or?the?user?accepts?the?PlayAssetDelivery.ShowCellularDataConfirmation?dialog.

default:

break;

}

大量下载

大于 150MB 的资产包可以自动下载,但只能通过 Wi-Fi 下载。如果用户未连接到 Wi-Fi,则PlayAssetBundleRequest状态设置为 AssetDeliveryStatus.WaitingForWifi 并暂停下载。在这种情况下,要么等待设备连接到 Wi-Fi,然后继续下载,要么提示用户批准通过蜂窝连接下载包。

if(bundleRequest.Status?==?AssetDeliveryStatus.WaitingForWifi)?{

var?userConfirmationOperation?=?PlayAssetDelivery.ShowCellularDataConfirmation();

yield?return?userConfirmationOperation;

switch(userConfirmationOperation.GetResult())?{

case?ConfirmationDialogResult.Unknown:

//?userConfirmationOperation?finished?with?an?error.?Something?went

//?wrong?when?displaying?the?prompt?to?the?user,?and?they?weren't

//?able?to?interact?with?the?dialog.?In?this?case,?we?recommend

//?developers?wait?for?Wi-Fi?before?attempting?to?download?again.

//?You?can?get?more?info?by?calling?GetError()?on?the?operation.

case?ConfirmationDialogResult.Accepted:

//?User?accepted?the?confirmation?dialog?-?download?will?start

//?automatically?(no?action?needed).

case?ConfirmationDialogResult.Declined:

//?User?canceled?or?declined?the?dialog.?Await?Wi-Fi?connection,?or

//?re-prompt?the?user.

default:

break;

}

}

取消请求(仅限按需)

如果需要在 AssetBundles 加载到内存之前取消请求,请调用 对象AttemptCancel() 上的方法 PlayAssetBundleRequest:

//?Will?only?attempt?if?the?status?is?Pending,?Retrieving,?or?Available?-?otherwise

//?it?will?be?a?no-op.

bundleRequest.AttemptCancel();

//?Check?to?see?if?the?request?was?successful?by?checking?if?the?error?code?is?Canceled.

if(bundleRequest.Error?==?AssetDeliveryErrorCode.Canceled)?{

//?Request?was?successfully?canceled.

}

异步请求资产包

在大多数情况下,你应该使用 Coroutines异步请求资产包并监控进度,如下所示:

private?IEnumerator?LoadAssetBundleCoroutine(string?assetBundleName)?{

PlayAssetBundleRequest?bundleRequest?=

PlayAssetDelivery.RetrieveAssetBundleAsync(assetBundleName);

while?(!bundleRequest.IsDone)?{

if(bundleRequest.Status?==?AssetDeliveryStatus.WaitingForWifi)?{

var?userConfirmationOperation?=?PlayAssetDelivery.ShowCellularDataConfirmation();

//?Wait?for?confirmation?dialog?action.

yield?return?userConfirmationOperation;

if((userConfirmationOperation.Error?!=?AssetDeliveryErrorCode.NoError)?||

(userConfirmationOperation.GetResult()?!=?ConfirmationDialogResult.Accepted))?{

//?The?user?did?not?accept?the?confirmation?-?handle?as?needed.

}

//?Wait?for?Wi-Fi?connection?OR?confirmation?dialog?acceptance?before?moving?on.

yield?return?new?WaitUntil(()?=>?bundleRequest.Status?!=?AssetDeliveryStatus.WaitingForWifi);

}

//?Use?bundleRequest.DownloadProgress?to?track?download?progress.

//?Use?bundleRequest.Status?to?track?the?status?of?request

Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪

.

yield?return?null;

}

if?(bundleRequest.Error?!=?AssetDeliveryErrorCode.NoError)?{

//?There?was?an?error?retrieving?the?bundle.?For?error?codes?NetworkError

//?and?InsufficientStorage,?you?may?prompt?the?user?to?check?their

//?connection?settings?or?check?their?storage?space,?respectively,?then

//?try?again.

yield?return?null;

}

//?Request?was?successful.?Retrieve?AssetBundle?from?request.AssetBundle.

AssetBundle?assetBundle?=?bundleRequest.AssetBundle;

其他 Play Core API 方法

以下是你可能希望在应用中使用的一些其他 API 方法。

检查下载大小

通过对 Google Play 进行异步调用并设置操作完成时的回调方法来检查 AssetBundle 的大小:

public?IEnumerator?GetDownloadSize()?{

PlayAsyncOperation<long>?getSizeOperation?=

PlayAssetDelivery.GetDownloadSize(assetPackName);

yield?return?getSizeOperation;

if(operation.Error?!=?AssetDeliveryErrorCode.NoError)?{

//?Error?while?retrieving?download?size.

}?else?{

//?Download?size?is?given?in?bytes.

long?downloadSize?=?operation.GetResult();

}

}

移除 AssetBundles

你可以删除当前未加载到内存中的快速关注和按需 AssetBundle。进行以下异步调用并设置完成时的回调方法:

PlayAsyncOperation<string>?removeOperation?=?PlayAssetDelivery.RemoveAssetPack(assetBundleName);

removeOperation.Completed?+=?(operation)?=>

{

if(operation.Error?!=?AssetDeliveryErrorCode.NoError)?{

//?Error?while?attempting?to?remove?AssetBundles.

}?else?{

//?Files?were?deleted?OR?files?did?not?exist?to?begin?with.

}

};

测试

==

在 Unity Editor 中,选择Google > Build and Run。

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:
Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪
Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪
Android 打包AAB PAD(Unity篇),2021年Android技术下半场在哪

举报

相关推荐

0 条评论