ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YooAsset实战:Unity资源管理与热更新全流程解析

YooAsset实战:Unity资源管理与热更新全流程解析 先说点实在的。做Unity项目做久了资源管理这块基本是绕不过去的坎。AssetBundle打包、依赖管理、热更下载、内存控制每个环节都能让人折腾到怀疑人生。我在好几个中大型项目里试过自研的方案也踩过不少坑直到后来接触了YooAsset才感觉到这方向上还有这么顺手的东西。这篇文章不打算写成官方文档的复读版而是把我自己从初见到落地到优化整个过程的所见所得、踩过的坑、以及和Addressable、HybridCLR、加密混淆这些配套方案怎么组合使用一次性讲清楚给还没入坑或者刚入坑的朋友一个相对完整的导览。1. 项目概述YooAsset到底是什么它在我项目里的定位先说结论YooAsset是一个Unity上的资源管理框架核心解决的是AssetBundle的打包、加载、依赖管理和热更资源下载这一整套流程。它不是简单封装一下Resources.Load也不是把AssetBundle操作包一层而是从项目工程组织的角度重新梳理了资源管理的链路——从编辑期的资源收集、打包规则设定到运行期的生命周期管理和异步加载接口再到出包后的补丁更新、下载断点续传整整一条线都给你捋顺了。我在接手现在这个项目的时候前任团队用的是自研的资源管理工具说实话功能也算齐全但问题在于扩展性和可维护性都不太行尤其是新增一种资源类型或者调整一个打Bundle的策略要动的地方特别多。后来我们调研了一圈对比了市面上常见的方案最终选择了YooAsset。选择它的几个核心理由其实很简单一是默认就是分布式构建的思路资源的归属和依赖能被收集器自动分析出来不用手动逐个维护依赖关系二是单机游戏和联机游戏都能用它可以配置不同的PlayMode做编辑器模拟、单机运行和联机运行都行三是热更链路是完整的补丁包生成、版本差异对比、下载器管理这些都有现成的模块。当然一个框架好不好用光看功能列表是不够的还得看在实际项目里怎么落地。YooAsset适合的人我觉得分这么几类一类是从零开始的新项目想要一套完整资源方案省去自己造轮子的时间另一类是已经有自研方案但维护成本太高的老项目可以考虑局部替换或者整体切换还有一类是正在Addressable和其他方案之间纠结的团队想看看社区里另外一个活跃方案的效果。我个人的定位是把它当作项目的“资源基础设施”在这之上再叠加我们自己的业务层约束和配置规范。框架本身的职责边界很清晰不会侵入你的业务逻辑只是在你需要加载资源、管理资源生命周期、校验更新版本的时候提供一个可靠的工具箱。2. YooAsset和Addressable的对比为什么我最终没有选Addressable做资源框架选型很难不提到Unity官方的Addressable Assets System。我们在调研时也认真对比了两者。很多人觉得YooAsset是“国产版Addressable”这个说法有一定道理但实际体验下来两者设计哲学差异其实蛮大的。2.1 设计理念上的差异Addressable走的是“资源地址”路线你给资源起一个可寻址的名字运行时通过Addressable加载至于这个资源打包进哪个AssetBundle是引擎的依赖分析帮你决定的。听起来很智能但实际项目里AssetBundle划分是个可感知的问题。官方依赖分析在大型项目里很容易出现把一堆用得很少的资源打进同一个Bundle、或者因为某个共享资源版本变化引发大规模重新下载的情况。YooAsset更偏向“收集器 打包规则”的组合方式。你在编辑器里通过Collector去声明哪些目录、哪些文件要打进哪些包然后通过规则设定Bundle的分组策略。它把“资源如何组织”这个决策权更多交还给了开发者而不是完全黑盒。这意味着什么意味着你可以为自己的项目定义清晰的分包规范哪些资源进启动包、哪些资源作为热更资源、哪些资源独立成包一切都在构建前就能精确控制。我自己的体会是Addressable适合项目组对Unity构建体系非常熟、愿意接受官方默认策略的团队YooAsset则适合希望资源规整可控、分包灵活调整的团队。如果你对AssetBundle的内在机制理解得比较清楚用YooAsset会非常顺手因为它像一套功能完整的工具集而不是替你做了所有决定的自动化流程。2.2 加载接口和生命周期管理的不同体验Addressable的加载接口是AsyncOperationHandle使用上需要和资源释放、依赖计数这些概念打交道。YooAsset提供了同步和异步两类API日常用起来更直观特别是对一个不那么资深的团队来说学习曲线会平滑一些。比如加载一个Prefab// YooAsset异步加载 var handle resourcePackage.LoadAssetAsyncGameObject(Assets/Game/Prefabs/Role.prefab); await handle.ToUniTask(); var go handle.AssetObject as GameObject;如果加载完不想用那个返回值了调用handle.Release()即可。这个“Handler”的设计挺像句柄的哲学谁加载谁释放引用计数由框架内部管理。同步加载也支持但需要初始化对应的模式。说实话在主线程上同步加载AssetBundle会有卡顿风险除非是做帧动画或者启动预载否则我一般建议用异步。对比之下YooAsset在文档里也明确提示了同步加载会阻塞主线程如果你在乎流畅度就必须得谨慎使用。2.3 热更资源管理的完整度这是YooAsset一个很大的加分项。Addressable官方也有Hosting Service之类的方式做远程资源但要说补丁包生成、资源版本对比、下载断点续传这一整套打通的程度YooAsset做得更直观。它的构建产物直接就有补丁包模式构建的时候可以生成“全量包”和“增量包”然后运行时会根据版本信息下载缺失的资源文件。我们项目实际场景是每周一个版本资源变化参差不齐。YooAsset的增量构建能帮我们明显减小玩家每次更新需要下载的包体大小。配合资源包版本号的管理只需要动一下版本号就可以自动比对更新。这一点我很满意省去了很多自研热更方案的重复劳动。3. 核心细节拆解从收集器到运行时的全链路运作方式如果只是泛泛地说YooAsset好用那没有说服力。这一章我打算把整个资源链路拆开讲从编辑器配置、收集器规则、构建管线到运行时的初始化流程和加载接口把我实际配置过的内容贴出来尽量做到可以直接照着配置。3.1 收集器的配置与打包规则YooAsset的资源组织核心是Collector。在配置界面里你可以添加收集器指定要收集的目录或者资源然后设置规则。比如我项目中常用的一个配置是收集器路径Assets/GameRes/UI收集类型Prefab和Texture打包规则按标签分组或者默认为按目录分组这里比较关键的是“打包规则”。YooAsset有内置的几种规则按目录分组、按标签分组、按文件分组、按顶层目录分组等。不同规则会影响AssetBundle的划分粒度。我的经验是如果资源太多太碎全部按文件分组会导致生成的Bundle数量爆炸运行时加载负担重如果全部按目录分组又可能把冷热资源混到一个包里。折中方案通常是频繁更新的核心UI或者公共Prefab按标签分组美术资源按目录分组过场视频这种大文件单独成包。这个需要根据自己项目特点去权衡。规则上YooAsset也支持你自己写Rule脚本继承IPackRule去定制某个收集器下资源的归属。比如你可以写一个规则让所有带某个后缀的资源自动分配到“单独热更包”不跟随目录走。这种扩展性在我们项目里用得很频繁。3.2 AssetBundle的版本管理和补丁生成在构建阶段YooAsset提供了主动构建、增量构建、补丁构建几个入口。通常我们一键构建时会勾选“生成补丁清单”。构建完成后输出目录会有一个Version文件记录当前版本号同一版本下所有Bundle文件会对应一份CacheManifest文件。版本管理这里有个容易踩的坑如果你只改了少量资源但Unity的增量构建偶尔会有“依赖扩散”现象导致不少看似无关的Bundle也变了。YooAsset的增量构建在大多数情况下是可靠的但Unity的AssetBundle构建本身存在一定随机性所以建议每次发版后要有人抽查对比一下补丁包差异不能完全盲信自动增量。补丁生成后运行时通过初始化的时候读取版本号然后调用RequestPackageVersion()拿到远程最新版本再通过UpdatePackageManifest()更新本地的资源清单之后就能用新清单去加载资源了。这个过程YooAsset也提供了下载器对象var downloader resourcePackage.CreateResourceDownloader(); if (downloader.TotalDownloadCount 0) { downloader.OnDownloadProgressCallback OnProgress; downloader.BeginDownload(); await downloader.ToUniTask(); }3.3 运行时的加载接口和资源生命周期YooAsset初始化的时候会根据当前的PlayMode决定用哪种资源模式。我项目里三种模式都配置了编辑器模拟模式开发期快速迭代不用打Bundle单机模式直接打包后的本地资源适合测试首包内容联机模式带补丁更新的完整流程切换模式的核心是调用YooAssets.Initialize()和YooAssets.LoadPackage(DefaultPackage)。这个DefaultPackage就是你在编辑器里配置的资源包。多包管理在YooAsset里也支持比如你把战斗资源和UI资源拆成两个Package分别管理生命周期但这要求你对资源依赖关系特别清晰否则容易出现跨包引用导致包体臃肿或者加载异常。我实际项目里目前还是维持单包为主把分包做得太细其实会增加维护成本。资源加载这块建议整个项目封装一层自己的资源访问入口。不要直接在各业务代码里散落调用YooAsset的API否则后期要换加载策略、加缓存、加统计都会很痛苦。举个例子我们封装了一个AssetService对外提供LoadAssetAsyncT()和ReleaseAsset()两个方法内部统一走YooAsset并且维护了一个引用计数表方便排查资源泄漏。3.4 内存管理的实战经验资源框架解决的不只是加载更要命的是卸载。AssetBundle的卸载时机如果在项目里控制不好内存水位就会慢慢涨满。YooAsset提供了非常细粒度的控制每个加载句柄都有引用计数当你Release()之后计数减一计数归零的资源允许被卸载。但这里的“允许被卸载”并不等于“立即卸载”。我见过不少项目只要Release之后就以为万事大吉结果真机上内存占用仍然偏高。原因是场景里可能还持有已加载资源的引用比如那个Prefab实例的某些材质或者框架为了性能缓存了一部分常驻资源。如果内存压力特别大要做两件事一是合理设置AssetBundle的常驻内存策略二是在关键节点比如切场景后主动调用UnloadUnusedAssets()并配合Resources.UnloadUnusedAssets()强制回收。我自己的经验是能少加载就少加载不要图省事把整个UI界面所有图集都加载进来能延迟加载就延迟加载比如技能特效在真正播放时再加载。资源框架再好用真正常用的还是“什么时候加载、什么时候释放”的意识。4. 配合HybridCLR做代码热更一套可落地的完整方案说完了资源热更再来讲讲代码热更。YooAsset只管资源代码热更它不管社区里最流行的搭档是HybridCLR。HybridCLR做的是代码热更和YooAsset的资源热更正好互补组合在一起就能实现“代码 资源”双维度更新。4.1 HybridCLR的基本原理HybridCLR是一个商业化的CLR运行时扩展方案它允许你在一套主程序集之外加载额外的程序集并且通过它的解释器来执行热更代码。开发者可以把一部分逻辑代码打成热更DLL通过资源框架下载更新运行时加载并执行。这一点跟上古时代Lua热更思路类似但好处是你可以继续用C#开发不用维护一套Lua桥接代码。我们为什么选HybridCLR而不是Lua主要还是团队习惯C#不想为了热更去额外学一套Lua生态而且C#做复杂战斗逻辑写起来更自然。HybridCLR在性能上的解释执行开销也比很多纯绑定方案低一些但对性能极端敏感的逻辑比如战斗中的高频数值循环我们还是会放在主程序集里不做热更。4.2 加载热更DLL的两种思路热更DLL是二进制文件所以它可以作为普通资源被YooAsset管理。常见做法有两种第一种把热更DLL打包成RawFile原生文件通过YooAsset的RawFile加载接口读取字节流。这种方式最轻量不需要AssetBundle的解包流程路径也清晰。代码大概是这样var handle package.LoadRawFileAsync(Assets/HotUpdate/Code/hotupdate.dll.bytes); await handle.ToUniTask(); byte[] assemblyData handle.GetRawFileData(); var assembly Assembly.Load(assemblyData);第二种把DLL放进一个AssetBundle里打包运行时通过LoadRawFile或者LoadAssetAsync把它读出来。这样做的坏处是多一层Bundle管理好处是可以让热更DLL和资源Bundle统一走资源热更的下载和增量对比流程。实际项目里两种都有人用。我个人偏向第一种简单直接也不容易被Unity的AssetBundle缓存机制干扰。4.3 和YooAsset的版本联动代码热更和资源热更还有一个联动问题新版代码可能需要新资源新版资源也可能被旧代码调用所以版本对齐很关键。我的做法是在每次发版的时候把代码版本号写进资源包版本信息里作为资源清单的一部分。运行时的启动流程是拉起原生主程序集初始化YooAsset获取远程资源版本下载资源更新从下载到的资源里读取热更DLL并加载调用热更入口逻辑这套流程保证代码和资源永远是一个版本不会出现代码是新的但资源还是旧的情况。另外要把启动阶段的异常处理做好尤其是网络下载失败或者DLL加载失败时要有重试机制和错误上报否则热更到一半崩溃对玩家体验影响很坏。说实话HybridCLR对工程集成是有一定要求的比如Unity版本、IL2CPP的AOT泛型裁剪等都会影响最后热更代码的稳定性。我建议先在一个小的Demo里把流程跑通确认热更DLL能正常加载并执行再逐步把业务模块切分过来。不要试图一次把整个项目都做成热更迭代成本太高。5. 配套的加密与混淆方案给资源加一把锁YooAsset本身不做加密和混淆但它预留了很好的扩展点社区里也有不少现成的插件。资源安全这块要分两层说资源文件加密和代码逻辑混淆。5.1 资源文件加密AssetBundle文件本质上是Unity序列化的数据懂行的人用AssetStudio之类的工具就能把资源扒出来。如果你项目里有重要的美术资产或者数值配置加一层加密是值得的。YooAsset的加密实现主要是在构建后处理时对Bundle文件字节流做处理运行加载时解密后交给Unity。具体做法是继承IEncryptionServices接口实现Encrypt(EncryptFileInfo fileInfo)方法。比如用AES对称加密密钥打包进客户端或者稍微复杂一点分发给服务器下发。代码示意public class AESEncryption : IEncryptionServices { public EncryptResult Encrypt(EncryptFileInfo fileInfo) { byte[] rawData File.ReadAllBytes(fileInfo.FilePath); byte[] encryptedData AESHelper.Encrypt(rawData, secretKey); // 通常情况下加密后的文件内容会加一个自定义头标识便于运行时判断 return new EncryptResult { EncryptedData encryptedData, Hash fileInfo.Hash // 如果不需要变更清单可以保留原来的哈希 }; } }运行时这边YooAsset在解密上有对应的IDecryptionServices接口你需要根据文件头来判断这是不是加密过的Bundle如果是就解密不是就走正常加载流程。比较坑的点是AssetBundle文件一旦加密Unity的Bundle加载接口在解包时可能不认所以解密后的数据要放在内存里通过AssetBundle.LoadFromMemory加载这会给内存带来一定压力。如果你的包很大解密最好做成流式的边读边解密而不是一次性Load整个文件。5.2 代码混淆和防破解资源加密防的是AssetStudio扒皮党代码混淆防的是看到IL2CPP字节码逆向主程序逻辑的这帮人。市面上商用混淆工具有很多比如Beebyte、Virbox、.NET Reactor等可以根据预算选。需要注意的坑是混淆开关打开后可能会干扰HybridCLR的热更程序集反射调用因为混淆会改变类名、方法名的符号信息。如果项目里有大量反射逻辑混淆前就要把需要规避的API加白名单配置好排除列表。而且HybridCLR的热更程序集本身是挂在解释器上执行的混淆工具未必能正确处理。我建议主程序集按需混淆热更程序集除非你确认工具兼容否则不要动不然线上跑出诡异问题排查成本太高。5.3 插件集成建议现在市面上已经有一些针对YooAsset的加密插件它们通常会把构建管线、加密解密、平台适配这些都封装好。选择插件时我主要看三点第一是否跟上最新YooAsset版本兼容因为YooAsset迭代速度不慢插件跟不上版本就会出现配置对不上的情况第二是否支持多平台自动化构建比如你打包Android和iOS时要能在一条构建流水线里直接输出加密后的资源而不是打包后再手动加密一次第三异常处理是否完善解密失败时要有明确日志别让线上环境静默失败。6. 实操过程与核心环节实现搭一个最小可运行的Demo理论聊了不少还是上手跑一遍最实在。这里我以Unity 2021.3 LTS为例带你走一遍最小可运行的YooAsset流程。按照下面的步骤操作应该能在半天内把资源构建和加载链路给跑通。6.1 环境准备与安装从YooAsset的GitHub仓库拉取最新源码按文档把YooAsset模块导入工程。建议同时导入YooAsset.Editor和YooAsset.Runtime两个模块。如果你用的是git submodule方式管理第三方库也可以直接把仓库作为submodule引入。安装完成后Unity菜单栏会多出YooAsset的菜单入口一般叫YooAsset/AssetBundle Collector之类。双击打开收集器窗口这里就是配置收集资源和打包规则的主界面。6.2 创建资源包并配置收集器在收集器窗口里点击“新建Package”取名为“DefaultPackage”。然后点击“添加收集器”选择资源目录比如Assets/GameRes/Prefabs。在收集器设置里有几个字段需要关注CollectorTypeMainAssetCollector标记为主资源收集Address填写资源加载时使用的地址。如果你想用路径加载保留默认YooAsset路径规则即可如果想用短地址也可以手动起名PackRule选择打包规则我一般先用“按目录分组”配置完之后点击“保存”这个Package就已经关联了对应的资源目录。如果有公共资源被多个目录引用YooAsset能通过依赖分析自动收集进来这步不需要你手动加构建时会自动处理。6.3 执行资源构建回到菜单选择YooAsset/AssetBundle Builder在构建选项里做几个关键设置BuildTarget选择当前测试平台比如AndroidBuildMode选择“增量构建”或者“强制重建”CompressionAssetBundle压缩方式LZ4相对均衡LZMA更小但加载略慢我通常选LZ4点击“构建”按钮等待构建完成。构建产物会输出到指定的目录通常是一个带版本号的文件夹。打开这个文件夹你会看到很多Bundle文件以及一个记录所有资源索引的清单文件。6.4 运行时初始化和加载回到代码侧新建一个启动脚本挂在场景空物体上。核心代码可以按下面的模板写using UnityEngine; using YooAsset; public class Bootstrap : MonoBehaviour { IEnumerator Start() { // 初始化资源系统 YooAssets.Initialize(); // 创建默认的资源包 var initParameters new InitializationParameters(); var package YooAssets.CreatePackage(DefaultPackage); YooAssets.SetDefaultPackage(package); // 根据当前模式初始化 #if UNITY_EDITOR var playMode EPlayMode.EditorSimulateMode; #else var playMode EPlayMode.OfflinePlayMode; #endif var initResult package.InitializeAsync(playMode, initParameters); yield return initResult; // 加载资源 var handle package.LoadAssetAsyncGameObject(Assets/GameRes/Prefabs/Role.prefab); yield return handle; if (handle.Status EOperationStatus.Succeed) { var go handle.AssetObject as GameObject; Instantiate(go); } else { Debug.LogError($加载失败: {handle.LastError}); } } }这段代码覆盖了初始化、创建资源包、同步等待初始化、加载资源、实例化几个关键步骤。如果编辑器模式下能正常加载出Prefab说明流程已经通了。后面再逐步加入补丁更新、下载进度显示等功能。6.5 接上补丁下载流程如果要跑完整的联机更新需要用一个Web服务器来放置构建产物。最简单的做法是本地起一个静态文件服务比如用Python的http.server把构建输出目录映射为HTTP根路径。然后修改初始化参数为EPlayMode.HostPlayMode在初始化前调用更新接口var updateHandle package.RequestPackageVersionAsync(); yield return updateHandle; string latestVersion updateHandle.PackageVersion; var manifestHandle package.UpdatePackageManifestAsync(latestVersion); yield return manifestHandle;这几行代码的逻辑是先获取服务器上最新版本号再用这个版本号去更新本地资源清单。清单更新完系统才知道哪些Bundle需要重新下载。接着创建下载器开始下载缺失资源。不少新手在这里会漏掉一点RequestPackageVersionAsync默认读取的是服务器上固定的版本文件。如果你构建时用的版本号和服务器上的不一致会导致更新失败。所以每次发版都要同步更新构建版本号。7. 常见问题与排查技巧实录资源管理框架在实际接入中问题真不少。这些小坑通常文档里不会细写我在这里集中记一下。7.1 YooAsset清单加载失败联机模式下最常见的问题就是清单加载失败日志里通常提示找不到远程版本文件。排查顺序是确认服务器地址配置正确客户端能访问到根目录确认构建产物已经上传到服务器对应路径且文件名大小写严格一致确认初始化时用的PlayMode是HostPlayMode不是OfflinePlayMode确认构建版本号和服务器上的版本号能对应上如果用的是本地测试服务器还要注意跨域问题。不过Unity WebGL之外平台通常不受浏览器同源策略限制但如果你用了一些动态CDN可能要对跨域头做处理。7.2 增量构建后资源更新量比预期大这个我前面已经提过AssetBundle的依赖扩散是Unity本身构建机制带出来的。遇到这种情况先别急着怪YooAsset。建议做法是构建后打开“报告”界面对比两个版本的Bundle清单看看哪些Bundle发生了意外的变化。如果是一直共享的公共资源被打包进多个Bundle可以考虑调整打包规则把公共资源独立出来减少变动传导。7.3 加载Prefab后脚本丢失这个现象在工程升级或代码重构后容易出现。AssetBundle里其实只存了资源的GUID引用如果脚本的GUID变了比如文件被移动、重命名、重新生成metaUnity在加载Bundle时会根据GUID去主程序集里找对应类型找不到就会报脚本丢失。遇到这种问题排查时看两点第一资源Prefab引用的脚本是否在主程序集里第二脚本的meta文件GUID是否发生变化。高版本Unity里做代码更新要特别注意别随意删除和重新生成meta文件。7.4 内存泄漏场景来回切换后内存涨不停之前说过引用计数机制这里补充一个具体排障手段启动的时候打开YooAsset的调试窗口可以看到当前每个资源的引用计数。如果某个资源加载了很多次但一直没有Release它的计数会一直大于0这个窗口能非常直观地暴露问题。我在项目里就用这个窗口揪出过一个UI图集泄漏的问题最后发现是某个界面在关闭时没有释放资源句柄。7.5 和HybridCLR一起用时DLL加载失败如果热更DLL怎么都加载不进来先确认DLL字节流是否读出来了也就是LoadRawFileAsync的Handle状态是否成功。再确认Assembly.Load是否抛异常异常信息通常是找不到依赖程序集。HybridCLR要求热更程序集的依赖在主程序集里都已经提前打好AOT泛型如果缺少某个泛型实例化运行时会报AOT泛型缺失错误。处理办法是把对应泛型在初始化代码里做一次虚假调用或者用HybridCLR的补充元数据功能。8. 扩展思路让YooAsset再顺手一点框架本身给你的能力是固定的但使用方式可以五花八门。这里分享几个我觉得很有价值的扩展方向。8.1 接一个自己的下载模块YooAsset默认的下载器只是把文件从远端拉到本地。如果项目有离线包、CDN切换、下载失败重试、限速等需求可以自定义下载策略继承YooAsset的下载器接口把业务逻辑接进去。我们项目里接了一个带断点续传和错误重试的下载器玩家断网重连后能在原进度基础上继续下载体验好了不少。8.2 做资源统计和预警在编辑器环境下我可以定期扫描整个资源树的构建报告找出那些体积偏大、长期不更新、引用链异常的资源生成一份报表给美术和策划。YooAsset的构建报告数据足够详细支持这个场景。这个功能做出来后对控制包体很有帮助。8.3 和项目自动化流水线结合如果你的项目用CI/CD自动出包YooAsset的构建命令行也能接入。可以在构建脚本中调用AssetBundleBuilder的接口把版本号、平台参数、构建模式都作为命令行参数传进去实现一键构建出包。发布流程一旦自动化人工出错的概率会小很多。9. 最后的经验之谈如果让我用一句话总结YooAsset最大的价值就是它把资源从“怎么打包”到“怎么加载”再到“怎么更新”这一整条链路里最繁琐、最容易出错的部分沉淀成了通用的基础设施让开发团队可以把更多精力放在业务逻辑上。就我实际使用下来的感受YooAsset的核心设计不是死板的一套它非常强调可扩展性。打包规则能自定义加载接口能封装加密服务能替换下载器能定制甚至对AssetBundle构建管线的干预手段也不少。这意味着不管是小型独立项目还是几十号人的商业项目都能找到适合它的使用方式。当然落地一个新框架一定会有阵痛。我建议一开始做一个最小项目或者Demo工程把构建、加载、更新、加密、HybridCLR集成这些步骤逐步理清楚再迁移到正式项目里。框架本身是工具真正决定资源体系好不好的还是团队对资源生命周期、版本管理、构建策略这些理念的理解和沉淀。希望这篇导览能帮你少走点弯路。如果后续你也开始用YooAsset搭资源体系遇到什么问题欢迎多交流。
返回列表