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 扩展名的资源包目录名称相匹配。