Version: 2021.2
对 APK 扩展文件 (OBB) 的支持
Graphics for Android

Play 资源交付

Play 资源交付 (PAD) 是 Google Play 应用商店的一项功能,可用于交付大于 150MB 的应用程序。PAD 使用资源包而不是 APK 扩展文件 (OBB) 来存储附加资源(例如纹理、声音和网格)。Google 在 Google Play 上托管和提供资源包,这意味着您无需创建内容分发网络来向用户发送应用程序资源。有关 PAD 的更多信息,请参阅 Android 的 Play 资源交付 (Play Asset Delivery)

重要:PAD 仅适用于 Google Play 应用商店。如果您有一个大型的应用程序,并希望支持其他数字分发服务,请使用 APK 扩展文件 (OBB)

使用 Play 资源交付

要使用 Play 资源交付,您需要设置您的项目以构建 Android 应用包 (Android App Bundle) 并拆分应用程序二进制文件。

要配置 Unity 以构建 Android 应用包,请执行以下操作:

  1. 打开 Build Settings(菜单:File > Build Settings)。
  2. Platform 中,选择 Android
  3. 如果启用了 Export Project,则启用 Export for App Bundle。否则,启用 Build App Bundle (Google Play)

要配置 Unity 以拆分应用程序二进制文件:

  1. 打开 Player Settings(菜单:Edit > Project Settings,然后选择 Player)。
  2. 选择 Android settings 选项卡并打开 Publishing Settings 部分。
  3. 启用 Split Application Binary

现在,当您构建您的应用程序时,Unity 会生成一个 Android 应用包,其中包含您的应用程序拆分为基础模块 (base module) 和资源包。

  • 基础模块:包含可执行文件(Java 和本机文件)、插件、脚本以及第一个场景的资源。第一个场景的构建索引 (build index) 为 0。
  • 资源包:包含其他所有内容,包括所有剩余的场景、资源和流媒体资源。有关 Unity 在构建时生成的资源包的更多信息,请参阅生成的资源包

除了 Unity 自动生成的资源包,您还可以创建自己的自定义资源包。当您需要控制资源包所含的内容时,这很有用。Unity 将您的自定义资源包添加到最终的 Android 应用包中。有关自定义资源包以及如何设置它们的更多信息,请参阅自定义资源包

生成的资源包

资源包具有下载大小限制。为了解决这个问题,Unity 会根据附加资源的大小更改其生成资源包的方式:

  • 如果额外的资源占用的存储空间少于 1GB,Unity 会将所有内容打包到一个带有 install-time 交付模式 (delivery mode) 的资源包中。如果您不创建任何自定义资源包,这意味着设备会在应用程序安装过程中下载资源包,并且当用户首次启动应用程序时,所有资源都可用。
  • 如果额外的资源占用的存储空间多于 1GB,Unity 会将所有流媒体资源打包到一个资源包中,并将所有其他资源打包到另一个资源包中。Unity 为较大的资源包指定 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-followon-demand 资源包,则设备必须先下载这些资源包,然后应用程序才能访问其中的资源。要检查资源包的状态并下载(如果它们不在设备上),您必须首先知道每个资源包的名称。要获取 Unity 生成的资源包的名称,请调用 AndroidAssetPacks.GetCoreUnityAssetPackNames。由于没有运行时 API 来获取自定义资源包,您必须自己对其进行跟踪。自定义资源包的名称在构建时设置;它是目录的名称。

获得资源包的名称后,要检查每个资源包的状态,请传入资源包名称调用 AndroidAssetPacks.GetAssetPackStateAsync。这将返回您查询的资源包的状态,您可以根据结果确定是否需要下载资源包。如果您想快速查询每个 Unity 生成的资源包的状态,您可以使用 AndroidAssetPacks.coreUnityAssetPacksDownloaded。这很有用,因为在加载第一个场景以外的任何场景或尝试访问 Unity 处理的其他资源之前,您必须确保每个 Unity 生成的资源包都可用。

对于您需要下载的每个资源包,传入资源包名称调用 AndroidAssetPacks.DownloadAssetPackAsync。在下载资源包时,请监控下载状态,因为下载可能会暂停或失败。有两种方式可以做到这一点:

自定义资源包

如果要控制特定资源包中包含哪些非代码资源,可以创建自定义资源包。与 Unity 生成的资源包不同,您可以为自定义资源包设置交付模式。如果您创建自定义资源包,请注意 Google Play 应用商店对资源包的大小和数量限制。有关限制的信息,请参阅下载大小限制

要创建自定义资源包,请创建一个名称以 .androidpack 结尾的目录。您可以将此目录放在项目的 Assets 目录或任何子目录中的任何位置。例如,要创建一个名为 MyAssets1 的自定义资源包:

  1. 转到您要在其中创建资源包的目录。这可以直接在 Assets 或类似 Assets/CustomAssetPacks 的子目录中。
  2. 创建一个新目录并将其命名为 MyAssets1.androidpack。要将任何资源添加到资源包,请将它们放在此文件夹中。注意:Unity 在构建中不包含空的资源包。此外,资源包名称必须以字母开头,并由英文字母数字字符或下划线组成。
  3. 默认情况下,交付模式为 on-demand,这意味着如果您不更改交付模式,需要在运行时手动下载资源包。有关如何执行此操作的信息,请参阅在运行时管理资源包
  4. 要使用不同的交付模式,请在自定义资源包目录中创建一个名为 build.gradle 的文件。将以下内容粘贴到文件中:
apply plugin: 'com.android.asset-pack'
assetPack {
    packName = "MyAssets1"
    dynamicDelivery {
        deliveryType = "fast-follow"
    }
}

这将交付模式设置为 fast-follow,这意味着 Google Play 在安装应用程序后会自动下载资源包。有关此文件格式的信息,请参阅集成资源交付 (Integrate asset delivery)

注意:您在 build.gradle 文件中指定的 packName 应与您设置的不带 .androidpack 扩展名的资源包目录名称相匹配。

对 APK 扩展文件 (OBB) 的支持
Graphics for Android