Play 资源交付 (PAD) 是 Google Play 应用商店的一项功能,可用于交付大于 150MB 的应用程序。PAD 使用资源包而不是 APK 扩展文件 (OBB) 来存储附加资源(例如纹理、声音和网格)。Google 在 Google Play 上托管和提供资源包,这意味着您无需创建内容分发网络来向用户发送应用程序资源。有关 PAD 的更多信息,请参阅 Android 的 Play 资源交付 (Play Asset Delivery)。
重要:PAD 仅适用于 Google Play 应用商店。如果您有一个大型的应用程序,并希望支持其他数字分发服务,请使用 APK 扩展文件 (OBB)。
要使用 Play 资源交付,您需要设置您的项目以构建 Android 应用包 (Android App Bundle) 并拆分应用程序二进制文件。
要配置 Unity 以构建 Android 应用包,请执行以下操作:
要配置 Unity 以拆分应用程序二进制文件:
现在,当您构建您的应用程序时,Unity 会生成一个 Android 应用包,其中包含您的应用程序拆分为基础模块 (base module) 和资源包。
除了 Unity 自动生成的资源包,您还可以创建自己的自定义资源包。当您需要控制资源包所含的内容时,这很有用。Unity 将您的自定义资源包添加到最终的 Android 应用包中。有关自定义资源包以及如何设置它们的更多信息,请参阅自定义资源包。
资源包具有下载大小限制。为了解决这个问题,Unity 会根据附加资源的大小更改其生成资源包的方式:
install-time
交付模式 (delivery mode) 的资源包中。如果您不创建任何自定义资源包,这意味着设备会在应用程序安装过程中下载资源包,并且当用户首次启动应用程序时,所有资源都可用。install-time
交付模式,为较小的资源包指定 fast-follow
交付模式。注意: 如果这些资源包中的任何一个大于 Google Play 应用商店允许的上传限制,Unity 会显示警告但不会使构建失败。此外,Unity 会单独检查资源包的大小,并且不会对自定义资源包执行大小验证。这意味着,如果自定义资源包和 Unity 生成的资源包的组合对于 Google Play 应用商店来说太大,Unity 不会显示警告或错误。
对于 Unity 自动生成的资源包,Unity 不支持更改交付模式。如果您想更改资源包的交付模式,请使用您的资源创建自定义资源包。
Unity 提供了在运行时管理资源包的 API。它们使用 Google 的 PlayCore API,这意味着它们具有与 PlayCore 相同的限制,并且无法管理 install-time
资源包。使用 PlayCore API 还意味着您的应用程序需要 PlayCore 插件。如果您的项目含有资源包,无论是自定义资源包还是 Unity 生成的资源包,Unity 都会自动将 PlayCore 依赖项添加到应用程序的清单中。
您下载资源包并访问其资源的方式取决于资源包的交付方式。有三种资源包交付模式:
install-time
:当设备安装应用程序时,Google Play 会自动下载 install-time
资源包。Google Play 将这些资源包视为基础应用程序的一部分,终端用户必须卸载整个应用程序才能卸载这些资源包。PlayCore API 不处理 install-time
资源包,这意味着您无法对 install-time
资源包检查状态、请求下载或删除。除了 Unity 生成的 install-time
资源包中的流媒体资源,您也不能直接访问这些资源包内的资源。要访问流媒体资源,请使用 Application-streamingAssetsPath 获取流媒体资源位置的路径,然后使用 UnityWebRequest 访问该路径中的资源。如果您创建自定义资源包,则无法使用标准文件 API 访问其中的资源。而应使用 Android 的 AssetManager APIs。fast-follow
:Google Play 在安装应用程序后自动开始下载 fast-follow
资源包。但是,应用程序首次启动时可能并非所有 fast-follow
资源包都可用。要检查状态并下载 fast-follow
资源包,请参见下文。on-demand
:Google Play 不会自动下载 on-demand
资源包。您必须手动开始下载。有关如何执行此操作的信息,请参见下文。有关交付模式的更多信息,请参阅交付模式。
如果您的应用程序使用 fast-follow
或 on-demand
资源包,则设备必须先下载这些资源包,然后应用程序才能访问其中的资源。要检查资源包的状态并下载(如果它们不在设备上),您必须首先知道每个资源包的名称。要获取 Unity 生成的资源包的名称,请调用 AndroidAssetPacks.GetCoreUnityAssetPackNames。由于没有运行时 API 来获取自定义资源包,您必须自己对其进行跟踪。自定义资源包的名称在构建时设置;它是目录的名称。
获得资源包的名称后,要检查每个资源包的状态,请传入资源包名称调用 AndroidAssetPacks.GetAssetPackStateAsync。这将返回您查询的资源包的状态,您可以根据结果确定是否需要下载资源包。如果您想快速查询每个 Unity 生成的资源包的状态,您可以使用 AndroidAssetPacks.coreUnityAssetPacksDownloaded。这很有用,因为在加载第一个场景以外的任何场景或尝试访问 Unity 处理的其他资源之前,您必须确保每个 Unity 生成的资源包都可用。
对于您需要下载的每个资源包,传入资源包名称调用 AndroidAssetPacks.DownloadAssetPackAsync。在下载资源包时,请监控下载状态,因为下载可能会暂停或失败。有两种方式可以做到这一点:
如果要控制特定资源包中包含哪些非代码资源,可以创建自定义资源包。与 Unity 生成的资源包不同,您可以为自定义资源包设置交付模式。如果您创建自定义资源包,请注意 Google Play 应用商店对资源包的大小和数量限制。有关限制的信息,请参阅下载大小限制。
要创建自定义资源包,请创建一个名称以 .androidpack 结尾的目录。您可以将此目录放在项目的 Assets 目录或任何子目录中的任何位置。例如,要创建一个名为 MyAssets1 的自定义资源包:
on-demand
,这意味着如果您不更改交付模式,需要在运行时手动下载资源包。有关如何执行此操作的信息,请参阅在运行时管理资源包。apply plugin: 'com.android.asset-pack'
assetPack {
packName = "MyAssets1"
dynamicDelivery {
deliveryType = "fast-follow"
}
}
这将交付模式设置为 fast-follow
,这意味着 Google Play 在安装应用程序后会自动下载资源包。有关此文件格式的信息,请参阅集成资源交付 (Integrate asset delivery)。
注意:您在 build.gradle
文件中指定的 packName 应与您设置的不带 .androidpack 扩展名的资源包目录名称相匹配。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.