Sue 发表于 2024-8-2 09:38

Unity - Addressables项目总结(一):基础工作流

有段时间没更新了,比来到了新项目,前期使用Addressables临时进行资源打点。需要对资源从打包、发布、运行时进行全面完善,中间遇到一些坑,也有不少难以理解的使用方式,在此做个记录。
一、综述 & Start

1.1 综述

Unity默认的资源打包发布方式是AssetBundle,Addressables在AssetBundle的基础上,措置了资源在项目整个流程中的打点。具体涉及资源打包、加载与卸载以及热更。传统的AssetBundle对于资源打点来说相对繁琐,主要表此刻以下几个方面:

[*]资源打包的冗余问题
[*]资源打包的方式不直不雅观
[*]中间有很多细节(比如资源进首包,需要将ab包放到StreamingAssets目录下,再移除以避免Unity从头加载)
[*]资源依赖的问题
[*]资源热更新方案(增量更新、文件对比、资源下载状态……)
[*]同步与异步资源加载
[*]内存~Profiler
[*]...
对于斗劲成熟的项目来说,凡是已经有一套完善的东西链,可能对于部门打包法式不太直不雅观便利,但整体流程较为完善,一般也不用考虑Addressables。如果是在项目前期,Addressables可能是一个不错的东西,其功能特性如下:

[*]提供GUI的方式对资源打包进行打点,不需要频繁改削打包代码,对资源打点更加便捷
[*]提供了加载实体AB包的开发模式,能够模拟真机的资源加载方式
[*]资源依赖措置(打包、加载)
[*]傻瓜式的资源查询、更新方式(优劣参半),随用随下
[*]打包检测东西
1.2 Start

(1)安装


(2)拉取Package到当地
在Package Manager中拉取的内容是无法改削的,若需要改削源码,则需要将Cache文件夹中的缓存放到Package(包罗依赖package)


(3)标识表记标帜资源:将资源或文件夹放入对应Group即可


(4)配置Profile


只需要配置远端路径(Http处事可使用Addressables自带的Host Services,但建议使用HFS便利测试)
(5)发布资源


Addressbales提供了两种资源发布模式:全量发布;增量发布
(6)选择Play Mode & Start


fastest模式通过AssetDatabase加载资源,Editor下不需要发布资源。Existing Build会真实得加载AB包,Editor下需要打包资源。
// 下载preload1资源
Addressables.DownloadDependenciesAsync(”preload1”);

// 加载key
Addressables.LoadAssetAsync(”Cube”);二、Settings

2.1 AssetGroup

Addressbales以GUI的方式较为便捷得对资源进行分组打包揽理。默认每个分组的资源文件存在于AddressableAssetsData/AssetGroups目录下,分组可以使用不异策略对资源批量打点。




选中Group可以看到其属性面板。Build & Load Paths定义Group的打包与加载路径,该路径可在Profile中改削。包体分为当地包与长途包。


Group提供三种压缩方式:无压缩、LZ4、LZMA。LZ4包体大小中等,解压较快,可以只解压部门资源;LZMA包体较小,但解压资源较慢,只能将资源全部解压。凡是选择LZ4。



[*]Include in Build是指构建时是否包罗此Group。
[*]Force Unique Provider自定义的Provider实现,则需要勾选,自定义Provider(不在组间共享)。
[*]Use Asset Bundle Cache暗示是否缓存下载的AB包,不缓存的话每次都要下载。
[*]Asset Bundle CRC暗示加载资源时是否进行CRC校验文件准确性。
[*]Use UnityWebRequest - 暗示使用UnityWebRequestAssetBundle.GetAssetBundle接口代替AssetBundle.LoadFromFileAsync接口去加载当地资源。不建议勾选



[*]Request Timeout:链接超时后,进行Abort操作。此处暗示超时的second
[*]Use Http Chunked Transfer(在Unity2019.3+已经被废弃,不建议勾选)
[*]Http Redirect Limit:使用UnityWebRequest下载资源时重定向的次数
[*]Retry Count:下载掉败后从头测验考试下载的次数


这三个选项暗示打包时,是否将资源的Address、GUID、Label写入包体中。对于有分包更新需求的情况下,建议都勾选上。


Internal Asset Naming Mode:如何为内部asset定名


[*]Full Path:用完整路径
[*]Filename:资源的文件名
[*]GUID:用GUID串
[*]Dynamic:Addressables按照组内的资产选择最小的内部定名

[*]Internal Bundle Id Mode(如何为内部bundle定名):
[*]Cached Clear Behaviour:空间不足时清理Cache;有新版本资源时,清理Cache
[*]Bundle Mode:打资源的策略

[*]Pack Together:按照Group打包
[*]Pack Separately:每个文件打一个包
[*]Pack Together By Label:按照Lable进行分包

[*]Bundle Naming Mode:如何创建bundle的名字
Asset Load Mode、Asset Provider、Asset Bundle Provider凡是不用改削,这三个选项用于控制asset的加载方式、AB包的获取方式。如果存在自定义的措置方式,可自行选择。


2.2 AddressableAssetSettings

Profile定义了各种路径参数,切换分歧的路径以灵活映射到的路径。(改削路径后需要从头Build资源后才能生效,因为locator的下载路径是在Build时序列化到当地的。体验上不太舒服~~)



[*]Send Profiler Eevet:向Event View 窗口发送事件,以监听资源加载状态
[*]Log Runtime Exceptions:发生错误时,Addressable内部会抛出异常



[*]Player Version Override:默认Catalog的定名是Catalog_<timestamp>.json,如果配置了该项可能会影响catalog名称。若发布客户端后,改削此项发布资源,则原客户端不会检测到存在资源更新。
[*]Compress Local Catalog\Optimize Catalog Size:优化Catlalog文件大小,凡是不会勾选,除非此文件影响流程体验。
[*]当需要发布远端资源时,勾选Build Remote Catalog
[*]当需要手动更新远端资源时,需要勾选Build Remote Path & Only update catalog manually(不勾选的情况下,也不是每次都下载hash文件进行对比,保险还是手动下载)



[*]Player Version Override:资源版本id
[*]Check for Update Issues : 点击Addressables Groups/Tools/Check for Content Update Restriction的措置方式。(将静态资源改削放到一个新包中,凡是用于对Local资源的改削)
[*]Content State Build Path:Addressables第一生成资源时,会生成addressables_content_state.bin文件,用于对比记录后续资源更新时的内容。该文件默认存储于AddressableAssetsData/Windows



[*]Custom certificate handler:自定义证书验证,担任UnityEngine.Networking.CertificateHandler.
[*]Max Concurrent Web Requests:最大的Web请求数量
[*]Catalog Downloaded Timeout:下载catalog文件超不时间



[*]Ignore Invalid / Unsupported Files in Build:忽略打包时的无效资源(测试.bin属于无效文件)
[*]Unique Bundle ID:使用此设置可以在资源已经被加载进内存之后依然撑持动态更新资源。其代价是在更新资源时,引用改削的资源也会被更新。不建议勾选。
[*]Contiguous Bundles:优化打包时的资源时序,提升资源加载速度。(Addressables 1.12.1以前的版本想要减小包体,不要勾选)
[*]Non-Recursive Dependency Calculation:开启该选项可以提高构建速度同时减少运行内存的占用,但资源存在循环依赖时会导致加载掉败。不建议开启。
[*]Shader Bundle Naming Prefix:Unity内置Shader Bundle定名,建议Project Name Hash
[*]MonoScript Bundle Naming Prefix:MonoScripts生成的Bundle定名,建议Project Name Hash
[*]Strip Unity Version From AssetBundles:是否移除Bundle包头的Unity版本信息(Unity版本不发生变化的情况下,可以勾选)
[*]Disable Visible Sub Asset Representations:在不使用Sub Asset(Sprites、sub-meshes)情况下可以提升打包时间


Addressables提供了三种Editor下资源加载方式:Use the Asset database(Asset database加载)、Simulate groups(模拟Group措置)、Use existing build(加载实际包体资源)



[*]New Build/Default Build Script:默认方式构建资源
[*]Update a Previous Build:增量式更新资源
[*]Clear Build Cache:断根构建的资源缓存(只是断根了link,实际目录下的资源还在)


三、打包措置

3.1 打全量包

措置法式如下:
(1)按照需求配置Group的构建路径(Remote\Local)
(2)按照远端路径(CDN\HFS)改削Profile,选择需要的Profile
(3)改削资源版本号(如果只是当地测试不需要,但若是正式发布需要改削,避免影响老版本)
(4)点击New Build/Default Build Script进行资源打包
Profile定义Build和Load路径,若需要从多个项目加载资源的情况(比如美术、Scene单独分手出工程进行制作),可以定义分歧的Profile以满足需求。对于大部门工程来说,凡是不需要改削local资源相管路径,这些工程会构建到不异的目录中。
注意:路径字符(以及自动生成的子目录)长度限制在260个character,否则会构建掉败

默认的local build路径:Library\com.unity.addressables\aa\平台\系统
默认的local load路径:Editor模式与构建路径不异;实机运行时被解析为StreamingAssets目录
Build输出文件:

[*].bundle:对应于Group设置的local资源
[*]settings.json:运行时Addressables的配置参数
[*]catalog.json:资源列表数据,用于查询资源更新
[*]AddressablesLink/link.xml:将我们当地构建的group、address、label等key与具体资源关联文件。在2021.2之后的版本,若不存在该文件,则会复制AddressableAssetSettings.ConfigFolder或者 Assets/Addressables_Temp目录
[*]Library/com.unity.addressables/AddressablesBuildTEP.json:构建性能数据,参考 Build profiling
[*]Library/com.unity.addressables/buildlayoutreport:构建日志,参考 Build layout report
注意:使用默认的local路径,在构建应用时,Addressbales会将打包资源拷贝到StreamingAssets目录,在应用构建结束后再将资源移除。如果使用自定义的local路径,需要本身措置这一过程。

默认的Remote Build路径:ServerData\平台
默认的Remote Load路径:为实际的下载url,必需要启用相管处事(CDN\HFS)后自行定义。
构建的文件:

[*].bundle:对应于Group设置的远端资源
[*]catalog_{timestamp or player version}.json:记录最新的资源版本。此文件定名与时间戳或者资源版本号有关系,定名方式在AddressableAssetSettings中设置。
[*]catalog_{timestamp or player version}.hash:用于查抄catalog文件是否发生变化,凡是法式启动时城市下载这一文件。

除了以上资源,打包资源时可能还会生成unitybuiltinshaders 和MonoScriptAssetBundles。如果构建中使用了内置资源会发生前者,MonoBehaviour对MonoScript存在引用,里面包罗了定位某个具体类所需要的信息。
3.2 打增量包

全量包会从头构建所有资源,当我们只需要对一部门资源改削时,这会发生很多不必要的工作。Addressbales提供了按照资源更新记录进行增量式更新


需要注意的是,能够进行增量式更新的前提是存在addressables_content_state.bin文件,而且不能改削资源版本号。此文件记录了资源的状态数据。当我们构建全量包时,会在“Assets\AddressableAssetsData\平台”创建该文件,必然不要手动改削此文件。只有不异版本号的catalog才会检测差异,从而更新。




addressables_content_state.bin


四、运行时的资源

4.1 资源加载

Addressables提供了通过address、label、AssetReference以及IResourceLocation进行资源加载。在执行异步操作时,会执行以下流程:

[*]将key转换为IResourceLocation
[*]按照catalog查询资源依赖
[*]若相关bundle都存在则直接加载,否则会先从远端下载
[*]将加载的资源赋值给AsyncOperationHandle.Result
[*]设置AsyncOperationHandle.Statue并执行Completed事件
若加载掉败,相关信息会存储在AsyncOperationHandle.OperationException。默认情况下,加载掉败不会抛出异常,如果需要可以为ResourceManager.ExceptionHandler设置回调。此外还可以通过设置抛出异常。


4.2 资源卸载

通过Addressables.Release可以卸载资源、实例、handle。释放handle可以减少资源的引用计数,而且handle会掉效。如果不需要使用回调成果,某些API接口提供了自动的handle回收参数,例如UnloadSceneAsync。
即便handle回调掉败了,仍然需要对其进行释放。凡是情况下,Addressables会自动释放Operation掉败期间的资源,但手动释放handle仍然是有必要的。
Addressables.LoadAssetsAsync是无法打消的,但如果在操作完成之前释放对应的handle,会减少对handle引用,在资源加载完成后会自动释放。
参考


[*]Addressables | Addressables | 1.20.5
页: [1]
查看完整版本: Unity - Addressables项目总结(一):基础工作流