//?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」。
Play Asset Delivery Unity API 集成
================================
该 「Play Asset Delivery Unity API」 提供了请求资产包,下载管理,和访问资源的功能。「确保」首先将 Unity 插件添加到你的项目中。
你在 API 中使用的函数取决于你创建资产包的方式。
-
如果你使用 UI 配置 AssetBundles,请「选择插件配置的资产包」。
- 如果你使用 API 配置资产包,请选「择API 配置的资产包」。
你可以根据要访问的资产包的交付类型实施 API。这些步骤显示在以下流程图中。
检索 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
.
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时下热门知识点的学习资料。
部分文件: