Unity构建详解(6)——SBP的Bundle写操作生成

以下三个操作实际上是为了得到构建Bundle需要的其他参数,最关键的Bundle组装参数在上文已经说过了,至于这三个操作的具体细节不用过于追究,一般不怎么会取修改。

这些参数采用命令模式被封装起来,这是常见的参数非常多的时候的处理方式。

至于为什么要有这些参数,其实取决于后面的Writing Task

【GenerateBundleCommands】

  • 对BuildContent.BundleLayout中的 每个Asset bundle创建对应的AssetBundleWriteOperation
    • 创建WriteCommand
      • 根据filename和WriteData.FileToObjects知道一个要写哪些Object
      • 将每个Object封装成SerializationInfo,其有两个字段
        • 一是Object对应的ObjectIdentifier
        • 一个是serializationIndex,表不同Object在File中的标识
    • 创建BuildUsageTagSet
      • 从DependencyData.AssetUsage获取每个Asset的Usage,然后Union
    • 创建BuildReferenceMap
      • referenceMap.AddMappings(command.internalName, command.serializeObjects.ToArray());
    • 创建DependencyHash
      • 从DependencyData.DependencyHash得到每个Asset的Hash128
      • 合起来再计算一次Hash HashingMethods.Calculate(dependencyHashes).ToHash128()
    • 创建AssetBundleInfo
      • 得到bundleName
      • 从DependencyData.AssetInfo得到每个Asset对应的AssetLoadInfo
  • 对Scene Bundle中的创建SceneBundleWriteOperation
    • 创建WriteCommand
    • 创建BuildUsageTagSet
    • 创建BuildReferenceMap
    • 创建DependencyHash
    • 创建SceneBundleInfo:只有第一个场景有该参数
      • 得到bundleName
      • 对每个Scene引用的Asset创建SceneLoadInfo,其记录了三个信息
        • Scene的GUID、Scene的资源路径、Scene归属的内部文件名
    • 创建PreloadInfo
      • 场景的referencedObjects中有而File中没有的要预先加载
  • 填充WriteData
    • m_WriteData.WriteOperations.Add(operation);
    • m_WriteData.FileToUsageSet.Add(command.internalName, usageSet);
    • m_WriteData.FileToReferenceMap.Add(command.internalName, referenceMap);

【GenerateSubAssetPathMaps】

这里主要是为了处理BuildExtendedAssetData,创建对应的AssetLoadInfo

  • ExtendedAssetData.ExtendedData获取扩展数据的Asset的guid
  • 从WriteData.AssetToFilesasset0获取该Asset要被写入哪个文件
  • 从WriteData.WriteOperations找到该文件对应的写操作
  • 从写操作中的AssetBundleInfo获取该Asset的AssetLoadInfo
  • 获取该Asset对应的扩展数据的Object,根据该Asset的AssetLoadInfo生成扩展的Object的AssetLoadInfo
  • 将生成的AssetLoadInfo放入写操作中的AssetBundleInfo中的AssetLoadInfoList中

【GenerateBundleMaps】

  • 创建临时的map关系
    • 从WriteData.AssetToFiles获取该Asset对应的MainFile
    • 从DependencyData.AssetInfo和DependencyData.SceneInfo获取该Asset的referencedObjects
    • 进而得到MainFile的referencedObjects
    • 从WriteData.AssetToFiles获取该Asset的MainFile依赖的其他File
    • 获取其他File依赖的Asset
  • 填充BuildReferenceMaps,在GenerateBundleCommands只做了MainFile的,其他File没做
    • MainFile有自己全部的Object,不用引用其他的
    • 其他File引用的Object被剥离了,需要记录引用的哪个File中的哪个Object
      • referenceMap.AddMapping(file, serializedObject.serializationIndex, serializedObject.serializationObject);
      • 注意区分File中Obejct的索引serializationIndex和Asset中Object的索引FileID
  • 填充BuildUsageTagSet
相关推荐
peter676820 小时前
unity2d游戏开发经验总结
unity
郝学胜-神的一滴21 小时前
游戏设计:原型与开发 19:U3D工位布置与性格说明书
人工智能·算法·unity·unreal engine·游戏策划·游戏设计
Aman19841 天前
Claude Code做Unity项目移植(二): 自动执行只读操作,告别频繁的
unity·游戏开发·vibe coding·claude code
暴走约伯2 天前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
郝学胜-神的一滴2 天前
游戏设计:原型与开发 18:Unity入门的第一课
人工智能·程序人生·游戏·ui·unity·游戏引擎
淡海水2 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
LF男男2 天前
Flower Defense—UIFacade
unity
呆呆敲代码的小Y2 天前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
小贺儿开发2 天前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
Aman19843 天前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移