Frame05 Load & Import

说明

集成热更新资源包的解决方案

  1. Hybrid 来进行 Hotfix
  2. Addressables 来进行 资源管理
    和前文的 Ilruntime 和 AssetBundle 进行替换

Addressables

默认结构目录

  • AddressableAssetsData 主干
    • AssetGroups 资源组
      • Built In Data.asset(2
      • Default Local Group.asset(3
      • Schemas 资源单元
        • Built In Data_PlayerDataGroupSchema.asset
        • Default Local Group_BundledAssetGroupSchema.asset(3
        • Default Local Group_ContentUpdateGroupSchema.asset(3
    • AssetGroupTemplates 资源组模板
    • AddressableAssetSettings.asset 设置功能(4
    • DefaultObject.asset 默认对象(1

疑问

  1. DefaultObject
  2. Built In Data
    是否包含Resources目录和首屏(BuildScene)资源
  3. PackageSchema
    添加新的Package 只不过把名称换掉同样增加3个文件
    • Default Local Group.asset 实质是索引文件
    • Default Local Group_BundledAssetGroupSchema.asset
      为Advanced Opinion属性
      • AssetBundle Compression 压缩格式
        • LZMA 流压缩 包小 要解压
        • LZ4 块压缩 有Header 自带计数 比LZMA快
      • Include in Build 构件中打包
      • Unique Provider 设定唯一性 避免重名资源冲突加载
      • Use Asset Bundle Cache 自带加载缓存
      • Asset Bundle CRC
        • Disable 不校验
        • Enable,InClude Cached; 全校验
        • Enable,Excludeing Cached; 下载时校验,解压时不校验
      • UseUnityWebRequestForLocalBundles

        主要是因为 WebRequest 没缓存导致下载多个Bundles

      • RequestTimeOut
        请求中断时间
      • Use Http Chunked Transfer
        使用 HTTP1.1 传输方式。新版本没有
      • Http Redirect Limit
        重定向转跳限制,-1为无限次。
      • Retry Count
        重试下载次数
      • Include Addresses in Catalog
        是否将地址写进catalog 如果这个组内的资源不需要通过地址加载,可以取消该项来减少catalog的体积。.
      • Include GUIDs in Catalog
        是否将GUID写进catalog。 如果使用了AssetReferences,则必须勾选该选项。如果没有使用AssetReferences的方式或者用GUID作为key去加载,则可以取消勾选来减少catalog的大小。
      • Include Labels in Catalog
        是否将Label写进catalog。
      • Internal Asset Naming Mode
        在catalog里如何为资源命名
        1. Full Path:用完整路径
        2. Filename:资源的文件名
        3. GUID:用GUID串
        4. Dynamic:可寻址系统根据组内的资产选择最小的内部命名。
      • Cache Clear Behavior
        什么时候清理缓存
        • Clear When Space Is Needed In Cache:空间不足时清理
        • Clear When When New Version Loaded:是有新版本时清理
      • Bundle Mode:打资源的策略
        • Pack Together:根据Group打包
        • Pack Separately:每个文件打一个包
        • Pack Together By Label:根据Lable进行分包
      • Bundle Naming Mode
        Bundle命名规则。
      • Asset Load Mode:资源加载模式
        • Requested Asset and Dependencies:加载请求的资源和依赖(通常使用)
        • All Packed Asset And Dependencies:加载所有打包的资源和依赖项
      • Asset Provider
        定义 Addressables 使用哪个 Provider 类从该组生成的 AssetBundle 加载资产。将此选项设置为来自 Bundles Provider 的 Assets,除非有自定义 Provider 实现来提供来自 AssetBundle 的资产。
      • Asset Bundle Provider
        定义 Addressables 使用哪个 Provider 类来加载从该组生成的 AssetBundle。将此选项设置为AssetBundle Provider,除非您有自定义 Provider 实现来提供 AssetBundle。
    • Default Local Group_ContentUpdateGroupSchema.asset
      为Content Update Restriction属性,名称会随插件版本更新换成其他解释
      但是主要功能就是这个Bundle不再可写。一般让他作为动态包
  4. AddressableAssetSettings.asset
    BundleBuild 的预制信息。最好每次构建都修改一下
    • Diagnostics
      • Send Profiler Eevet:向Event View 窗口发送事件,以监听资源加载状态
      • Log Runtime Exceptions:发生错误时,Addressable内部会抛出异常
    • CataLog
      • Player Version Override 版本号,可以通过版本进行切换内容
      • Compress Local Catalog 压缩
      • Optimize Catalog Size 优化
    • Content Update
      • Disable Catalo Update on StartUp
        默认是没有勾选的,没有勾选,那么每次AddressableAsset(下称AA)系统初始化的时候,会自动更新catalog文件,勾选上,将不会自动更新catalog文件,也就意味着不会自动更新资源。AA系统的初始化会在任意接口第一次调用时初始化,也可以主动调用Addressables.InitializeAsync()初始化。
      • Content State Build Path
        状态Bin文件,没填会默认在Assets/AddressableAssetsData文件夹下建包,用于更新资源
      • Build Remote Catalog
        默认没有勾选,只有勾选上才会创建catalog在指定目录(.hash和.json文件),记录着此次打包的资源信息,可用于在线更新,客户端通过下载这个catalog来进行对比更新。
    • Build
      • Ignore Invalid/Unsupported Files in Build 忽略不支持的文件进行构建
      • Unique Bundle IDs 每次构建生成唯一ID
      • Contiguous Bundle 生成更有效的包布局。如果您有Addressables 1.12.1或更早版本生成的包,请禁用此选项以最小化包的更改
      • Non-Recursive Dependency Calculation 当资产具有循环依赖关系时,启用此选项可改善构建时间并减少运行时内存开销。(尽量还是优化结构,但是复用性 Shaders 还是点上
      • Shader Bundle Naming Prefix 为Unity着色器生成的包命名。
      • MonoScript Bundle Naming Prefix 为Monoscript生成的包命名。
      • Strip Unity Version From AssetBundles 生成版本号
      • Disable Visible Sub Asset Representations 关闭 Sub Asset 对应资源,图集和submesh。尽量不要关 一般都是会用SubAsset
    • Build and PlayMode Script
      构建模式优化,一般不会用到,暂未深入

      AddressableAssets

      没找到如果建立Api的例子

      服务器的根目录 = RemoteBuildPath

额外技巧

配置变量语法:

  • 大括号{}:

    可寻址对象在运行时评估大括号包围的条目。可以使用运行时类的代码变量(例如 {UnityEngine.AddressableAssets.Addressables.RuntimePath})。

  • 中括号[]:

    在构建时评估被方括号包围的条目。这些条目可以是其他配置文件变量(例如 [BuildTarget])

总结

Addressables 打包更加方便
Addressables用地址取代了 包名+文件名 的形式
通过 group 和 label 更好的减少了规划包分类的工作量,虽然还是要分
内置引用计数。一键释放,一键加载。
成熟的环境配置。学了就能用。不需要额外理解
测试环境,调试环境,生产环境默认配好
关联引用真的神。Unity的资源都可以直接托

Question

  1. 什么是libil2cpp
    Unity 编译项目有两种形式 Mono 和 IL2CPP 两种模式

    • Mono 构建直接运行 MonoVm
    • IL2CPP 构建转C++ 再转平台码
    • Mono编写更快 IL2CPP运行更快
  2. Assembly Definition 和 Assembly Definition Reference的区别

    • 前者为当前文件夹下的脚本打包为Dll,也可以关联其他DLL进行整合
    • 后者为当前文件夹下的脚本 作为某个Assembly Definition来打包
    • 还有一种通过vs构建dll的形式,一般是算法使用
  3. CompileDll 为啥有 Dev模式

    • 生成DLL 当然有Dev和Release两种模式 对应即可
  4. Hotfix打包流程
    详细查看官方文档 https://hybridclr.doc.code-philosophy.com/docs/basic/buildpipeline

    • 打包流程 是 Editor 和 Unity 直接构建Release的过程
    • 优化的打包流程 是 Unity 生成对应平台 工程的打包流程
  5. Addressables 打包策略
    Group配置基本策略:

    1. 默认按文件夹分组,将每个文件夹下面的资源根据文件夹路径配置成一个Group,并设置打包模式为PackTogether。这样基本上一个模块(以文件夹划分)的资源打成一个AB包。
    2. 特殊类资源(icon、lua、video、audio、scene…,属于更新频繁或者打成一个AB时更新太大)放入同一个Group,并设置打包模式为PackSeparately。这样资源独立生成AB包,且放在一个Group方便管理。
    3. 其他资源按情况处理。比如某些文件夹划分较粗,是按类型进行分组,而不属于同一模块,可以根据文件夹划分一个Group,打包模式为PackSeparately。或者比如Audio文件夹中有一些常用资源放在Comon目录,这时Common目录就可以打包PackTogether,方便加载。
    4. plist,atlas,spine 这些种组合文件要整整齐齐。避免打包时产生的多包方案
    5. hotfix脚本一定要 和 工程脚本分开,避免调用顺序错误
  6. Asset Provider
    主要就是重名类型资源的方案。