Unity Addressables 使用说明(四)分发远程内容(Distribute Remote Content)

概述

远程分发内容可以减少应用程序的初始下载大小和安装时间。你还可以更新远程分发的资源,而无需重新发布应用程序或游戏。

当你将远程 URL 分配为 Group 的加载路径(Load Path)时,Addressables 系统会从该 URL 加载组中的资源。当你启用Build Remote Catalog选项时,Addressables 会在 Remote Catalog 中查找任何远程资源的地址,使你可以对 Addressable 资源进行更改,而无需强制用户更新和重新安装整个游戏或应用程序。

enabling remote distribution 后,你可以通过两种方式构建内容:

  1. 使用New Build > Default Build Script进行 content build :构建所有内容包和目录。在准备发布或更新完整应用程序时,总是先执行完整构建,然后再重新构建 Player 。
  2. 使用Update a Previous Build脚本进行 Content Update Builds :构建所有内容包和目录,但设置 Remote Catalog ,使已安装的应用程序只需下载更改的包。运行 Check for Content Update Restrictions 工具以识别更改并在构建更新之前准备你的组。

在进行完整构建或更新构建后,你必须将 Remote Catalog 、目录哈希文件和远程包上传到你的托管服务。

请参阅 Remote content profiles 以获取有关设置 Addressables 配置文件的提示,以帮助你开发、测试和发布远程内容。

自定义 URL 评估

在某些情况下,你可能需要在运行时自定义资源(通常是 AssetBundle)的路径或 URL。最常见的例子是创建签名(signed) URL。另一个例子是动态主机确定(dynamic host determination)。

有关更多信息,请参见 ID transform function

启用远程分发(Enable Remote Distribution)

要启用内容的远程分发,你必须启用 Remote Catalog 并设置包含你希望远程托管资源的组。

启用 Remote Catalog (Enabling the remote catalog)

Addressable Asset SettingsInspector中启用 Remote Catalog (Window > Asset Management > Addressables > Settings)。

  • Build Remote Catalog: Enabled
  • Build & Load Paths: 设置为 remote

目录及其附带的哈希文件将构建到 Build Path 设置指定的文件夹中。你必须上传这些文件,以便它们可以在 Load Path 设置指定的 URL 上访问。除非你有具体的理由不这样做,否则使用 Remotelocation ,以便目录和远程包从相同的路径构建和加载。

设置远程组(remote group)

要设置一个组,使其中的资源可以远程托管,将 Build & Load Paths 设置为 Remotelocation 。

如果你计划在发布应用程序的完整重建之间发布内容更新,请根据你预期更新组内容的频率 设置 Update Restriction 值。

  • 对于生成较大包且你不预期更改组中大多数资源的组,选择 Cannot Change Post Release 。如果你更改了此设置下的组中的资源,Addressables 工具会将更改的资源移动到一个新组进行更新。已安装的应用程序只会下载新包。
  • 对于包含你预期频繁更改的资源的组,选择Can Change Post Release。如果你更改了此设置下的组中的资源,包含这些资源的包将作为一个整体重新构建,并将被已安装的应用程序重新下载。为了减少更新后需要下载的数据量,尽量保持此设置下生成的包尽可能小。

有关更新远程内容的更多信息,请参阅 Content Update Builds

高级选项部分包含一些影响远程托管和下载( remote hosting and downloads)的选项,但不必启用远程托管。有关更多信息,请参阅 Advanced Options

远程内容配置文件(Remote Content Profiles)

Profile 定义了变量,这些变量可用于设置本地和远程内容的构建和加载路径。

在远程分发内容时,你通常需要根据构建的目的设置不同的 URL(加载路径)。以下是一些常见的情况:

为测试一般游戏玩法和功能的构建

在开发初期或需要在没有访问主机的情况下进行测试时,你可能会发现将所有内容视为本地内容是方便的。在这种情况下,使用Built-In位置设置localremote配置文件变量。

为本地托管(local hosting)的构建

稍后,当你在本地网络(或本地主机)上设置主机时,需要更改远程组的加载路径以反映主机的 URL 。例如,如果使用 [Editor Hosting],则使用 Editor Hosting 位置设置远程配置文件变量。

为 CDN 的构建

当接近生产阶段时,你可能会使用预发布服务器(staging server),然后是生产内容交付网络(CDN)。例如,如果使用 [Cloud Content Delivery] ,则使用Cloud Content Delivery位置设置Remote配置文件变量。

其他 Profile

即使在发布后,你也可能希望使用不同的主机 URL 进行 beta 测试或其他用途。

与其每次构建时手动配置构建和加载路径,不如创建不同的配置文件并适当地设置变量。然后,你可以在进行内容构建之前轻松切换配置文件,而无需担心路径配置错误。

如果使用脚本启动内容构建,则可以使用 Addressables API 为构建选择特定的配置文件。请参阅 Starting an Addressables build from a script

如果有复杂的 URL ,可以在配置文件变量中引用在构建时或运行时评估的静态字段或属性。例如,与其将 CCD ProjectID 作为字符串输入,你可以创建一个提供该信息的 Editor 类作为静态属性并引用它,如 CCDInfo.ProjectID。有关更多信息,请参阅 Profile variable syntax

[InternalIdTransformFunc](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/manual/TransformInternalId.html) 方法提供了处理复杂 URL 要求的额外方法。

Remote Content AssetBundle Caching

默认情况下,Addressables 构建生成的 AssetBundle 会在客户端设备上缓存。缓存的包只有在更新或从缓存中删除后才会再次下载。

更新的目录可以排除在旧版目录中存在的 bundle entry 。当这些条目被缓存时,它们的数据在设备上不再需要。

当设备上有不需要的缓存数据时,你可以选择以下选项之一:

  • 要删除整个包缓存,请使用[Caching.ClearCache](https://docs.unity3d.com/2023.1/Documentation/ScriptReference/Caching.ClearCache.html)
  • 要随时移除不再引用的 cache entry ,请使用 [Addressables.CleanBundleCache](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.Addressables.CleanBundleCache.html)。通常在初始化 Addressables 后(请参阅 Customizing Addressables initialization )或加载其他目录后调用此函数(请参阅 Managing catalogs at runtime)。
  • 要在更新目录后自动调用[Addressables.CleanBundleCache](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.Addressables.CleanBundleCache.html),请在 [Addressables.UpdateCatalogs](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.Addressables.UpdateCatalogs.html#UnityEngine_AddressableAssets_Addressables_UpdateCatalogs_System_Boolean_System_Collections_Generic_IEnumerable_System_String__System_Boolean_)中使用参数 autoCleanBundleCache。请参阅 Checking for content updates at runtime 的示例脚本。

如果你为某个组禁用缓存,那么该组生成的远程包在下载后会存储在内存中,直到你卸载它们或应用程序退出。下次应用程序加载包时,Addressables 会再次下载它。

你可以通过 Group Inspector 中 Advanced Options 下的Use Asset Bundle Cache设置控制组生成的包是否被缓存。

有关 AssetBundle 缓存的更多信息,请参阅 AssetBundle compression 。Addressables 系统根据 group settings 设置[UnityWebRequests](https://docs.unity3d.com/2023.1/Documentation/ScriptReference/Networking.UnityWebRequest.html)用于下载 Addressable 包的缓存相关参数。

预下载远程内容(Pre-download remote content)

在某些情况下,你可能希望预先下载内容,以便将其缓存到磁盘上,从而在应用程序需要时能够更快地访问。你可以使用[Addressables.DownloadDependenciesAsync](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.AddressableAssets.Addressables.DownloadDependenciesAsync.html)方法来实现这一点。此方法将以后台任务的形式下载一个 Addressable 实体及其所有依赖项。

调用 Addressables.DownloadDependenciesAsync 方法会加载你传入的地址或标签的依赖项,通常是 AssetBundle。

此调用返回的[AsyncOperationHandle](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/api/UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle.html)结构体包含一个 PercentComplete 属性,你可以使用该属性来监控和显示下载进度。你也可以让应用程序等待内容加载完成。

PercentComplete

PercentComplete考虑到了由单个AsyncOperationHandle处理的底层操作的几个方面。有时进度的推进不是线性的,或者看起来不太线性。这可能是因为快速操作与耗时较长的操作被同等对待。

例如,假设你希望从远程位置加载一个需要相当长时间下载的 asset,并且它依赖于一个本地 bundle 作为依赖项,那么你会看到 PercentComplete 跳到 50% 后再继续。这是因为本地 bundle 可以比远程 bundle 更快地加载。然而,系统只知道需要完成两个操作。

如果你希望在下载之前询问用户的同意,可以使用 Addressables.GetDownloadSize 返回从给定地址或标签下载内容所需的空间。请注意,这会考虑到 Unity 的 AssetBundle 缓存中任何之前下载的 bundle。

尽管提前下载 assets 对你的应用程序有利,但在某些情况下你可能选择不这样做。例如:

  • 如果你的应用程序有大量的在线内容,并且你通常期望用户只会与其中的一部分内容互动。
  • 你的应用程序必须在线才能运行。如果你的应用程序的所有内容都在小 bundle 中,你可以选择按需下载内容。

与其使用百分比完成值来等待内容加载完成,你可以使用预加载功能来显示下载已经开始,然后继续进行。这种实现需要一个加载或等待屏幕来处理在 asset 需要时尚未完成加载的情况。

使用 Addressables 与 Cloud Content Delivery 配合

你可以将 Addressables 与 Unity Cloud Content Delivery (CCD) 结合使用来分发你的远程 Addressables 内容。

要设置 Addressable 资产以便与 CCD 配合使用,请按以下步骤操作:

配置 Profile 以包含 CCD URL

BuildPathLoadPath 变量存储在 Profiles 中,这些变量指定了 Addressables 系统创建构建 artifact 的位置以及在运行时查找资产的位置。配置远程路径以适应 CCD。除非有特定原因,否则保持本地路径为默认值。

  • 如果需要,可以在 Profiles Window 中为发布到 CCD 的构建创建一个新 Profile。在此 Profile 中配置远程路径变量,以便在正确的 URL 访问你的内容。
  • 你可以将远程 BuildPath 设置为一个方便的值。如果你有多个 Profiles,请考虑为每个 Profile 使用唯一的构建路径,以避免构建 artifacts 混在一起,尤其是当你从不同的远程 URL 托管它们时。
  • 将远程 LoadPath 设置为以下两个路径之一:
    • 如果你使用徽章发布内容:
https://(ProjectID).client-api.unity3dusercontent.com/client_api/v1/environments/(EnvironmentName)/buckets/(BucketID)/release_by_badge/(BadgeName)/entry_by_path/content/?path=
  • 如果你使用发布发布内容:
https://(ProjectID).client-api.unity3dusercontent.com/client_api/v1/environments/(EnvironmentName)/buckets/(BucketID)/releases/(ReleaseID)/entry_by_path/content/?path=
  • (ProjectID) 是你的 CCD 项目的 ID 字符串
  • (EnvironmentName) 是你项目的环境名称
  • (BucketID) 是项目中 CCD 桶的 ID 字符串
  • (ReleaseID) 是桶中特定发布的 ID
  • (BadgeName) 是特定 CCD 徽章的名称

有关如何创建和编辑 Profiles 的信息,请参见 Profiles

使用 Cloud Content Delivery Bundle Location 选项

如果你的项目设置为使用 CCD 服务,你可以将 Profile 的远程路径对设置为将内容发布到指定的桶和徽章。

此功能需要 Content Delivery Management API 包。

要设置 Profile 变量以使用 CCD bundle 位置,请执行以下步骤:

  • 打开 Profile 窗口(菜单:Window > Asset Management > Addressables > Profiles)。

  • 选择要更改的 Profile。

  • 将 Remote 变量更改为 Cloud Content Delivery Bundle Location。

  • 选择 Automatic(使用 CcdManager 设置)或 Specify the Environment, Bucket, and Badge 选项。CcdManager 是一个静态类,用于在运行时通知 Addressables 从哪个 Environment, Bucket 和 Badge 加载。

  • 如果选择 Automatic,请选择你希望使用的环境。

  • 如果选择 Specify,请选择你希望使用的环境。

  • 选择要使用的桶。如果没有桶,会出现一个窗口让你创建一个。

  • 选择徽章。

  • 在为 CCD 构建内容时,使此 Profile 成为活动 Profile。

    有关如何修改 Profiles 的信息,请参见 Profiles。

配置 Groups 以使用 CCD URL

在 Inspector 窗口中配置 Groups 以将 Remote 作为它们的 Build & Load Path。

有关如何修改 Groups 的信息,请参见 Groups。

构建、上传和发布 Addressable 内容

使用 CCD Dashboard/CLI

要生成并上传 Addressable 内容到你的 CCD 项目,请执行以下步骤:

  1. 将为 CCD 设置的 Profile 设置为活动 Profile。
  2. 构建你的 Addressables 内容。
    • 如果进行完整内容构建,请参见 Building your Addressable content。
    • 如果更新现有构建并修改了远程内容,请参见 Building for content updates。
  3. 使用 CCD dashboard 或命令行界面上传在远程构建路径中创建的文件。
  4. 使用 CCD dashboard 或命令行界面创建发布并更新徽章。

构建你的 Addressable 内容会生成一个内容目录(.json),一个哈希文件(.hash)和一个或多个 AssetBundle(.bundle)文件。将这些文件上传到对应于你 Profile 加载路径中 URL 的桶中。

如果你对本地内容进行了更改,则必须创建一个新的 Player 构建。

使用 CCD Management package

要生成、上传和发布 Addressable 内容到你的 CCD 项目,请执行以下步骤:

  1. 打开 Groups 窗口(菜单:Window > Asset Management > Addressables > Groups)。
  2. 使用 Build & Release 选项。

CCD Management 包将使用默认构建脚本行为生成 Addressable bundles。

然后,所有与通过下拉窗口连接到 CCD 桶和徽章的路径对关联的 Groups 将由管理包将其生成的 bundles 上传到那些远程目标。

最后,管理包将为这些远程目标创建发布并更新它们的徽章。

CcdManager

在设置项目 Profile 路径对并使用 CCD 时,有一个选项可以使用 Automatic。此选项利用 CcdManager 在运行时设置静态属性,以告知 Addressables 应从哪个 Environment、Bucket 和 Badge 加载资产。CcdManager 具有以下属性:EnvironmentName、BucketId 和 Badge。在 Addressables 初始化之前在运行时设置这些属性将告知 Addressables 查看 CCD 中的这些位置。有关环境、桶和徽章的更多信息,请参见 CCD organization

设置 CcdManager 属性的示例代码:

CcdManager.EnvironmentName = ENV_NAME;
CcdManager.BucketId = BUCKET_ID;
CcdManager.Badge = BADGE;

// Addressables 调用以加载或实例化资产

使用构建事件

CCD 提供了一种包装构建和上传服务的方法,以提供附加功能。

添加构建事件

你可以向 PreUpdate 和 PreBuild 事件链添加附加事件。

#if (UNITY_EDITOR && ENABLE_CCD)
using System.Threading.Tasks;
using UnityEditor.AddressableAssets.Build;

public class BuildHooks
{
    static void AddBuildHook()
    {
        CcdBuildEvents.PrependPreBuildEvent(PrintBucketInformation);
        CcdBuildEvents.PrependPreUpdateEvent(PrintBucketInformation);
    }

    static async Task<bool> PrintBucketInformation(AddressablesDataBuilderInput input)
    {
        UnityEngine.Debug.Log($"Environment: {CcdManager.EnvironmentName}");
        UnityEngine.Debug.Log($"Bucket: {CcdManager.BucketId}");
        UnityEngine.Debug.Log($"Badge: {CcdManager.Badge}");
        return true;
    }
}
#endif
禁用版本覆盖警告

如果你收到关于覆盖玩家版本的警告,并希望保持当前设置,可以通过删除相应的构建事件来禁用警告。

#if (UNITY_EDITOR && ENABLE_CCD)
using UnityEditor;
using UnityEditor.AddressableAssets.Build;

public class DisableBuildWarning
{
    static void DisableWarning()
    {
        CcdBuildEvents.OnPreBuildEvents -= CcdBuildEvents.Instance.VerifyBuildVersion;
        CcdBuildEvents.OnPreUpdateEvents -= CcdBuildEvents.Instance.VerifyBuildVersion;
    }
}
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值