Frame05 Load & Import
说明
集成热更新和资源包的解决方案
- Hybrid 来进行 Hotfix
- 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
- AssetGroups 资源组
疑问
- DefaultObject
- Built In Data
是否包含Resources目录和首屏(BuildScene)资源 - 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里如何为资源命名- Full Path:用完整路径
- Filename:资源的文件名
- GUID:用GUID串
- 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。
- AssetBundle Compression 压缩格式
- Default Local Group_ContentUpdateGroupSchema.asset
为Content Update Restriction属性,名称会随插件版本更新换成其他解释
但是主要功能就是这个Bundle不再可写。一般让他作为动态包
- 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来进行对比更新。
- Disable Catalo Update on StartUp
- 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
- Diagnostics
额外技巧
配置变量语法:
- 大括号{}:
可寻址对象在运行时评估大括号包围的条目。可以使用运行时类的代码变量(例如 {UnityEngine.AddressableAssets.Addressables.RuntimePath})。
- 中括号[]:
在构建时评估被方括号包围的条目。这些条目可以是其他配置文件变量(例如 [BuildTarget])
总结
Addressables 打包更加方便
Addressables用地址取代了 包名+文件名 的形式
通过 group 和 label 更好的减少了规划包分类的工作量,虽然还是要分
内置引用计数。一键释放,一键加载。
成熟的环境配置。学了就能用。不需要额外理解
测试环境,调试环境,生产环境默认配好
关联引用真的神。Unity的资源都可以直接托
Question
什么是libil2cpp
Unity 编译项目有两种形式 Mono 和 IL2CPP 两种模式- Mono 构建直接运行 MonoVm
- IL2CPP 构建转C++ 再转平台码
- Mono编写更快 IL2CPP运行更快
Assembly Definition 和 Assembly Definition Reference的区别
- 前者为当前文件夹下的脚本打包为Dll,也可以关联其他DLL进行整合
- 后者为当前文件夹下的脚本 作为某个Assembly Definition来打包
- 还有一种通过vs构建dll的形式,一般是算法使用
CompileDll 为啥有 Dev模式
- 生成DLL 当然有Dev和Release两种模式 对应即可
Hotfix打包流程
详细查看官方文档 https://hybridclr.doc.code-philosophy.com/docs/basic/buildpipeline- 打包流程 是 Editor 和 Unity 直接构建Release的过程
- 优化的打包流程 是 Unity 生成对应平台 工程的打包流程
Addressables 打包策略
Group配置基本策略:- 默认按文件夹分组,将每个文件夹下面的资源根据文件夹路径配置成一个Group,并设置打包模式为PackTogether。这样基本上一个模块(以文件夹划分)的资源打成一个AB包。
- 特殊类资源(icon、lua、video、audio、scene…,属于更新频繁或者打成一个AB时更新太大)放入同一个Group,并设置打包模式为PackSeparately。这样资源独立生成AB包,且放在一个Group方便管理。
- 其他资源按情况处理。比如某些文件夹划分较粗,是按类型进行分组,而不属于同一模块,可以根据文件夹划分一个Group,打包模式为PackSeparately。或者比如Audio文件夹中有一些常用资源放在Comon目录,这时Common目录就可以打包PackTogether,方便加载。
- plist,atlas,spine 这些种组合文件要整整齐齐。避免打包时产生的多包方案
- hotfix脚本一定要 和 工程脚本分开,避免调用顺序错误
Asset Provider
主要就是重名类型资源的方案。