Unity热更新之Addressables——配置与打包(贰)

目录

目录

三、配置相关

(一)Profile 概述窗口配置

1、概述

用于配置Addressables打包和加载AB包的一些变量。

这些变量定义了保存/加载AB包的路径,也可以自己添加变量

2、Profiles窗口位置

  • Window -> Asset Management -> Addressables -> Profiles
  • AddressableAssetSettings打开
  • Addressables Groups窗口打开

3、参数讲解

image-20260204164053987

右侧默认参数:

  • BuildTarget:构建目标平台,默认就是你激活的平台
  • Local BuildPath:本地构建路径,默认在Library库文件夹中
  • Local LoadPath:本地加载路径
  • Remote BuildPath:远程构建路径
  • Remote LoadPath:远程加载路径

默认情况下,不需要修改本地构建和加载路径的默认值。而且针对不同平台的内容,可以通过多个配置文件。

创建:(左上角create)

  • Profile:概述文件
  • Variable:变量
  • Build Load Path Variables:构建加载路径变量

4、变量语法

上面的路径中,会发现有[]也有{},下面讲解含义:

  • []:包裹变量,打包构建时计算方括号内的内容

    • 如使用自己的变量[BuildTarget],使用其他脚本变量[UnityEditor.EditorUserBuildSettings.activeBuildTarget]
  • {}:包裹变量,运行时计算大括号包裹内容

    • 如使用其他脚本变量{UnityEngine.AddressableAssets.Addressables.RuntimePath}
  • 方括号和大括号使用的变量必须是静态变量或属性

  • 游戏运行时,无法使用UnityEditor编辑器命名空间下的内容

(二)AddressableAssetSettings 可寻址资源数据配置

1、配置文件概述

导入Addressables包之后,会创建一些配置文件,本质都是ScriptableObject的数据配置文件。

这些配置文件可以进行设置,影响打包方式等相关内容

image-20260204170934598

  • AddressableAssetsData文件夹(可寻址资源数据)
    • AssetGroups文件夹:存放资源组配置文件,每创建一个组就会多一些相关配置文件
    • AssetGroupTemplates文件夹:资源组模板,资源的一些默认设置
      • Packed Assets:打包资源数据配置
    • DataBuilders文件夹:(数据生成器,不同模式下,资源打包使用的方式)
      • BuildScriptFastMode:构建脚本快速模式
      • BuildScriptPackedMode:构建脚本打包模式
      • BuildScriptPackedPlayMode:构建脚本打包播放模式
      • BuildScriptVirtualMode:构建脚本虚拟模式
    • AddressableAssetSettings:可寻址资源设置,本节的重点
    • DefaultObject:默认对象

2、AddressableAssetSettings参数讲解

image-20260204171659466

  • Profiles(概述):选择和管理Profile配置文件

  • Diagnostics(诊断):

    • Send Profiler Event:启用分析器事件,可在Event Viewer窗口查看相关信息
    • Log Runtime Exceptions:记录运行时加载相关的异常
  • Catalog(目录):

  • Player Version Override:重写用于指定远程目录名的时间戳,不设置默认用时间戳作为远程目录名

  • Compress Local Catalog:在压缩的AssetBundle文件中生成目录,可压缩大小,但会增加生成和加载时间

  • Optimize Catalog Size**(Unity2022好像没看到这个)**:通过为内部ID创建查找表,减少目录大小,但会增加加载目录的时间

  • Build Remote Catalog:勾选后可以构建远程目录

  • Only update catalogs manually: 启用后,禁用在可寻址系统运行时自动检查更新远程目录。需要手动操作

  • Update a Previous Build:

    • Check for Update Issues:是否在升级过程中执行内容更新限制检查,并指定该检查结果的处理方式
    • Content State Build Path:设置默认构建脚本生成的内容状态文件的路径
  • Downloads:

    • Custom certificate handler:用于自定义证书处理的类
    • Max Concurrent Web Requests:系统对超过此限制的任何请求进行队列处理
    • Catalog Download Timeout:等待目录文件下载的时间为多少秒
  • Build:

    • Build Addressables on Player Build:选择 Unity 在执行玩家程序打包的过程中,以何种方式构建可寻址资源
    • Ignore Invalid/Unsupported Files in Build:启用后,忽略生成中无效不受支持的文件,而不是中止生成
    • Unique Bundle IDs:唯一约束ID,是否为每个构建中的包生成一个唯一的名称
    • Contiguous Bundles:连续捆绑,生成更高效的捆绑包布局。如果有Addressables 1.12.1或更早版本生成的捆绑包,请禁用此选项以最小化捆绑包更改
    • Non-Recursive Dependency Calculation:非递归依赖计算,不使用递归计算依赖项
    • Shader Bundle Naming Prefix:着色器包命名前缀
    • MonoScript Bundle Naming Prefix:Mono脚本包命名前缀
    • Strip Unity Version From AssetBundles:从AssetBundles中剥离Unity版本,决定是否从包头中删除版本信息
    • Disable Visible Sub Asset Representations:禁用可见子资源,如果您不直接使用子对象(Sprite、子网格等),则启用此选项可以提升构建时间
  • Build and Play Mode Scripts(构建和编辑器模式脚本):就是决定进入Play Mode时,Addressable系统如何加载资产,在上面讲过的DataBuilders文件夹下找到相关配置可以进行关联。这也是Addressables Groups窗口的Play Mode Scripts选项和Build选项的内容。

  • Asset Group Templates(资源组模板):创建的模板需要添加到该列表才能使用,默认有一个模板,包含默认构建脚本使用的模式,可以在AssetGroupTemplates文件夹中找到

  • Initialization Objects:初始化对象列表

  • Cloud Content Delivery:Unity 官方托管的云服务相关

3、重点总结

  • 概述配置:决定路径配置
  • 诊断:决定调试相关
  • 目录:决定目录后缀等内容
  • 内容更新:决定更新相关方案
  • 构建和编辑器模式脚本:决定测试方案
  • 资源组模板:决定创建组时的配置模板

(三)Packed Assets 打包资源配置

1、作用

确定如何处理组中的资源,如指定生成AB包的位置、包压缩,AB包加载等相关设置。简单来说就是指定AB包打包加载相关的规则

Packed Assets就是默认的资源组模板

2、参数讲解

image-20260204182812833

  • Build & Load Paths:构建和加载路径

  • Advanced Options:高级选项

    • Asset Bundle Compression:AB包压缩方式
      • Uncompressed:不压缩,包较大,不推荐
      • LZ4:压缩,相对LZMA大一点点,建议使用,用什么解压什么,内存占用低
      • LZMA:压缩最小,解压慢,用一个资源要解压所有
    • Include In Build:包含在构建中,是否在内容生成中包含此组中的资源。取消勾选则打包时不会打包该组内容
    • Force Unique Provider:强制唯一提供者,Addressable是否对此组使用资源提供程序类的唯一实例。如果有此组中的资产类型的自定义提供程序实现,并且这些提供程序的实例不能在组之间共享,则启用此选项。
    • Use Asset Bundle Cache:使用AB包缓存,是否缓存远程分发的包
    • Asset Bundle CRC:是否在加载前验证AB包的完整性
      • Disabled:永远不检查完整性
      • Enabled,Including Cached:检查完整性,包括缓存也检查
      • Enabled,Excluding Cached:检查完整性,但是不检查缓存的包
    • Use UnityWebRequest for Local Asset Bundle:加载AB包时,使用UnityWebRequestAssetBundle.GetAssetBundle而不是AssetBundle.LoadFromFileAsync
    • Request Timeout:下载远程包时超时的间隔时间
    • Use Http Chunked Transfer:下载包时是否使用HTTP/1.1块传输编码方法。 在2019.3+中被废弃和忽略
    • Http Redirect Limit:下载包时允许重定向的次数。无限制设置为-1
    • Retry Count:重试失败下载的次数
    • Include Addresses in Catalog:是否在目录中包含地址字符串(就是Addressable Name)。如果不使用则取消勾选来减小目录的大小。
    • Include GUIDs in Catalog:是否在目录中包含GUID字符串。您必须包含guid字符串才能使用资产参考(即AssetReferences类)。如果不使用则取消勾选来减小目录的大小。
    • Include Labels in Catalog:是否在目录中包含标签字符串(就是Label)。如果不使用则取消勾选来减小目录的大小。
    • Internal Asset Naming Mode:如何在内部命名目录中的资源(从AB包加载某个资源时,Unity在内部用什么名字去寻找它)
      • Full Path:全路径
      • FileName:文件名
      • GUID:资源的Guid字符串
      • Dynamic:Addressables根据组中的资源选择最小的内部名称
    • Internal Bundle Id Mode:确定如何构造资产绑定的内部ID(就是Unity在内部用什么 “名字” 来唯一标识一个AB包)
      • Group Guid:组的Guid
      • Group Guid Project Id Hash:组的ID和工程ID的哈希
      • Group Guid Project Id Entries Hash:组的ID和工程ID项的哈希
    • Cache Clear Behavior:确定安装的应用程序何时从缓存中清除AB包
      • Clear When Space Is Needed In Cache:在缓存中需要空间时清除
      • Clear When When new Version Loaded:加载新版本时清除
    • Bundle Mode:打包模式,如何将此组中的资产打包到包中
      • Pack Together:创建包含所有资产的单个包 。
      • Pack Separately:为组中的每个主要资产创建一个包。如精灵图片中的精灵图片被包装在一起。添加到组中的文件夹中的资源也打包在一起。
      • Pack Together by Label:为组内共享相同标签组合的资产创建一个包。
    • Bundle Naming Mode:如何构造AB包的文件名
      • Filename:文件名
      • Append Hash to Filename:将哈希附加到文件名
      • Use Hash of AssetBundle:使用AB包的哈希
      • Use Hash of FileName:使用文件名的哈希
    • Asset Load Mode:资源加载模式
      • Requested Asset And Dependencies:请求的资源和依赖项(请求什么就加载什么)
      • All Packed Assets And Dependencies:所有包中的资源和依赖项(请求后,就将对应包全部加载)
    • Asset Provider:资源提供者。当从这个组生成的AB包加载资源时,应该用哪一个加载器代码来执行加载操作。
      默认的就行了,除非自己写了一套自定义的加载逻辑
    • Asset Bundle Provider:AB包提供器。和Asset Provider类似,不过这个是负责把AB包从硬盘或网上加载到内存里。而上面的是从AB包加载资源。
  • Content Update Restriction:更新内容限制

    • Can Change Post Release:可以改变发行后内容,该模式不移动任何资源,如果包中的任何资源发生了更改,则重新构建整个包
    • Cannot Change Post Release:无法改变发布后内容,如果包中任何资源已经改变,则 [检查内容更新限制] 工具会将其移动到新组中。在进行更新构建时,从这个新组创建的AB包中的资产将覆盖现有包中的版本。

注:现在版本是Prevent Updates(防止更新)参数,不勾选则代表Can Change Post Release(整包更新),勾选则代表Cannot Change Post Release(局部更新)

3、Add Schema按钮

Add Schema(添加模式) :你可以将任意数量的架构模式给一个组

  • Content Packing Loading:内容打包加载相关 (即上面讲解的参数)
  • Content Update Restriction:内容更新限制 (即上面讲解的参数)
  • Resources and Built In Scenes:在内置数据中显示哪些类型的内置资源(可以选择是否显示资源和内置场景)

可以通过继承AddressableAssetGroupSchema定义自己的架构模式

4、创建自定义组模板

Create -> Addressables -> Group Templates -> Blank Group Template

之后在Addressables Groups窗口创建组的时候就可以选择模板了

(四)Addressables Hosting 可寻址托管窗口

1、作用

一般的资源服务器需要搭建http服务器,才能进行资源上传和下载。

Unity为了简化本地测试的过程,提供了快捷搭建http服务器的工具——Addressables Hosting窗口,这样就可以将本机作为一台资源服务器,从而快速进行远程打包下载的测试

2、打开窗口

  • 方式一:Window -> Asset Management -> Addressables -> Hosting
  • 方式二:Addressables Groups窗口 -> Tools -> Window -> Hosting Services

3、创建

  • Local Hosting:本地托管,通过本机模拟加载相关内容 (一般选这个)
  • Custom Service:自定义服务

4、参数

image-20260204214032766

  • Service Name:服务器名称
  • Service Type(ID):服务器类型
  • Port:端口号(一般不自己设置,避免和其它应用产生冲突)
  • Upload Speed(kb/s):上载速度
  • Enable:是否启用,启用后会自动分配端口号
  • Hosting Service Variables:托管服务变量
    • Variable Name:变量名
    • Value:值,可以使用这些变量名来编辑Profiles窗口中的发布和加载相关路径
      如:http://[PrivateIpAddress]:[HostingServicePort]/[BuildTarget]

5、说明

如果这种方式使用时发现失效了,可以使用第三方快速搭建http服务器的工具,将本机模拟为远端服务器

四、资源打包(发布)加载

(一)资源打包加载理论

1、概念

资源打包指将可寻址资源打包到AssetBundle资源绑定包中。可寻址资源中资源一般以组为单位打包,最终AB包数量是基于资源组决定的。

打包AB包后,如何使用:

  • 发布游戏时将所有AB包作为原始资源打包(此时的作用仅仅是让单机游戏减小包体)
  • 将AB包放到远端服务器,发布游戏时只打包必备资源(减小包体、热更新)

2、资源打包模式

在Packed Assets那节中,高级设置参数的Bundle Mode讲过,配置每组的打包方式:

  • Pack Together:创建包含所有资产的单个包。
  • Pack Separately:为组中的每种类型资产创建一个包。
  • Pack Together by Label:为组内共享相同标签组合的资产创建一个包。

3、注意事项

  • 场景资源始终有自己单独的包:如果包中场景资源和普通资源一起,那么场景会单独分成一个包
  • 如果资源a和b在不同的组中,它们都引用了资源c,但是资源c不是可寻址资源,此时资源c就会分别打进a的包和b的包。这样就造成了重复,解决方案是将c作为可寻址资源,比如在c包。此时a包和b包依赖c包,Addressable会自动处理依赖问题
  • 合理对可寻址资源分组:同类型、同作用的放一起
  • 包(分组)的数量要合理布局,组过多或过大都不好

(二)资源打包加载

1、编辑器中加载资源的方式

在寻址资源设置那节已经讲过了:

  • Use Asset Database (fastest):使用资源数据库,不打AB包,直接使用本地文件夹中的资源

  • Simulate Groups (advanced):模拟组,不打AB包,通过ResourceManager从资产数据库加载资源,引入时间延迟,模拟远程资产绑定的下载速度和本地绑定的文件加载速度,就像通过AB包加载一样

  • Use Existing Build (requires built groups):正经的远端加载资源,必须打AB包,从AB包加载资源

2、本地资源发布

  • 所有组的加载和发布都选择本地路径:Local BuildPath、Local LoadPath
  • 使用默认设置,当发布应用程序(Build)时,会自动帮我们将AB包放入StreamingAssets文件夹中。
  • 如果手动修改了上面提到的路径,需要自己将内容放入StreamingAssets文件夹中。因此不建议修改默认的本地加载和构建路径

3、模拟远端发布资源

  • 将本机模拟为一台资源服务器(之前Addressables Hosting讲过)
  • 设置远端路径,修改后记得在AddressableAssetSettings中的Catalog下的Build Remote Catalog参数勾选,否则不会自动创建重要的相关目录文件。(新版本设置Remote LoadPath时,如果发现连接不上,试试后面不加上/[BuildTarget],设置基础URL即可)
  • 打包并测试

4、实际的远端发布资源

  • 远端电脑上搭建http服务器
  • 将打包的资源上传到对应服务器上

(三)资源更新

1、资源更新概念

当项目正是发布后,对于远程加载的资源,可以通过改变资源服务器上的AB包内容来达到更新游戏的目的。Addressable会自动判断更新的资源并加载最新内容。

2、内容更新限制回顾

之前在Packed Assets那节讲过,Content Update Restriction的两个参数:

  • Can Change Post Release:如果包中的任何资源发生了更改,则重新构建整个包 (整包更新)
  • Cannot Change Post Release:无法改变发布后内容,如果包中任何资源已经改变,则 [检查内容更新限制] 工具会将其移动到新组中。进行更新构建时,从这个新组创建的AB包中资产将覆盖现有包中的版本。(局部更新)

注:现在版本是Prevent Updates(防止更新)参数,不勾选则代表Can Change Post Release(整包更新),勾选则代表Cannot Change Post Release(局部更新)

3、整包更新

组设置为不勾选Prevent Updates,适用于大范围资源更新时使用,坏处是下载的内容比较大,比较耗时耗流量。

  • 更新内容时,不是点Build里的New Build,而是点击Update a previous Build(更新之前的构建)

4、局部更新

组设置为勾选Prevent Updates,局部更新指当族中资源变化时,单独为变化的资源生成AB包,使用改资源时Addressables会自动加载最新内容,相对整包更新更节约时间和流量

  • 同样更新内容时点击Update a previous Build,然后会弹出一个窗口,勾选需要更新的内容即可

image-20260206133822981