位置: 编程技术 - 正文

Unity3D游戏开发之格式简析(Unity3D游戏开发标准教程)

编辑:rootadmin
Unity3D 的 asset bundle 的&#;式并没有公开。但为了做更好的差异更新,我们还是希望了解其打包&#;式。这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多。因为可以把 asset bundle 内的数据拆分为独立单元,只对变更的单元做差异比较即可。网上能查到的资料并不是官方给出的,最为流行的是一个叫做 disunity的开源工具。它是用 java 编写的,只有源代码,而没有给出&#;式说明(而后者比代码重要的多)。通过阅读 disunity 的代码,我整理出如下记录:asset bundle 分为压缩模式和非压缩模式。压缩模式仅仅是用开源的lzma 库 对整个非压缩包做了一次整体压缩。压缩数据的头有 个字节,前 5 个字节是 lzma 解压缩的 API 需要穿入的 props ,接下来的 4 字节是解压缩后的数据库长度。最后 4 字节不用理会它。把压缩数据解开后,就和非压缩模式没有差别,下面只讨论非压缩&#;式:assert bundle 的文件头是从这样一个数据结构序列化出来的。struct AssetBundleFileHead {struct LevelInfo { unsigned int PackSize;unsigned int UncompressedSize; }; string FileID; unsigned int Version;string MainVersion; string BuildVersion; size_t MinimumStreamedBytes; size_t HeaderSize; size_t NumberOfLevelsToDownloadBeforeStreaming; size_t LevelCount; LevelInfo LevelList[]; size_t CompleteFileSize;size_t FileInfoHeaderSize; bool Compressed;};复制代码string 是直接以 结尾的字符串,顺序序列化;size_t 是大端的 4 字节数字;bool 是单个字节;vector 就是顺着排列的结构。根据 Unity 版本的不同,assert bundle 的&#;式也不完全相同。Version 指明了 bundle 的&#;式版本,从 Unity 3.5 开始到 4.x 版都使用 Version = 3 ,下面只讨论这个版本。HeaderSize 应该恰好等于以上这个文件头的数据长度。一个 assert bundle 是由多个 asset 文件打包而成,接下来顺序打包了这些 asset 。序列化成这样的结构:struct AssetFileHeader {struct AssetFileInfo { string name; size_t offset; size_t length; };size_t FileCount;AssetFileInfo File[];}复制代码对于每个 asset ,又有它自己的数据头。数据头除了基本的数据头结构 AssetHeader 外,还有额外的三个部分。disunity 把它们称为 TypeTree ObjectPath 和 AssetRef 。注意:这里 Format 随不同 Unity3D 的版本有所不同,我们只关心目前的版本的&#;式,这里 Format 为 9 (其它版本的&#;式,在大小端等问题上有所不同)。Unity 对 Asset 数据做了简单粗暴的序列化操作。整个序列化过程是针对每种对象的数据结构进行的。TypeTree 是对数据结构本身的描述,通过这个描述,就可以反序列化出每个对象。AssetHeader 后面紧跟着的就是 TypeTree 。但是,这个 TypeTree 对于 asset bundle 来说是可选的,因为数据结构的信息可以事先放置在引擎中(引擎多半只支持固有的数据类型)。在发布到移动设备上时,TypeTree 是不打包到 asset bundle 中的。每个 asset 对象,都有一个 class id ,可以在 TypeTree 中查到如何反序列化。class id 的和具体类型的对应关系,在Unity3d 的官方文档 可以查到。但若我们只是想将差异比较在对象一级进行(而不是具体比较对象中具体的属性),那么就不需要解开具体对象的细节信息,这部分也不用关心。所以这里也不展开(有兴趣可以读一下 disunity 的代码,&#;式并不复杂)。在 AssetHeader 中的 TypeTreeSize 指的就是 TypeTree 部分的大小。接下来是每个 AssetObject 的描述数据。struct ObjectHeader {struct ObjectInfo { int pathID; int offset; int length; byte classID[8]; }; int ObjectCount; ObjectInfo Object[];}复制代码这里,所有的 int 都是以小端编码的 4 字节整数(不同于外部文件&#;式采用的大端编码)。在 Unity3D 中,每个对象都有唯一的字符串 path ,但是在 asset bundle 里并没有直接保存字符串,而是一个 hash 过的整数,也可以看成是对这个对象的索引号。真正的对象放在数据头的后面,偏移量为 offset 的地方。【狗刨学习网】这里的 offset 是相对当前 asset 块的。如果想取得正确的相对整个文件的位置,应该是文件的 HeaderSize &#; asset 的 offset &#; asset 的 dataOffset &#; 这里的 object offset 。接在 ObjectHeader 后的是 AssetRef 表,记录了 Asset 的引用关系。用于指明这个 bundle 内 asset 对外部 asset 的引用情况。AssetRefTable 结构如下:struct AssetTable { struct AssetRef { byte GUID[8]; int type; string filePath; string assetPath;}; int Count byte Unknown;vector Refs;}复制代码

推荐整理分享Unity3D游戏开发之格式简析(Unity3D游戏开发标准教程),希望有所帮助,仅作参考,欢迎阅读内容。

Unity3D游戏开发之格式简析(Unity3D游戏开发标准教程)

文章相关热门搜索词:Unity3D游戏开发(第2版)pdf,Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社,Unity3D游戏开发毕业论文,Unity3D游戏开发标准教程,Unity3D游戏开发(第2版),unity3D游戏开发,Unity3D游戏开发(第2版),Unity3D游戏开发(第2版),内容如对您有帮助,希望把文章链接给更多的朋友!

Unity3d游戏开发之如何接入SDK 言废话:开发手机游戏都知道,你要接入各种平台的SDK。那就需要Unity3d与iOS中Objective-C的函数有交互,所以你就需要用到如下内容:一、Unity3dToiOS:1、

unity游戏开发之相关的注意事项及技巧 1.打开后缀名为.packadge的文件报错(图1),想必很多朋友都碰到过这个问题,其实只要更改一下文件的位置就可以了(文件存放的路径不可以包含中文

在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视

标签: Unity3D游戏开发标准教程

本文链接地址:https://www.jiuchutong.com/biancheng/381510.html 转载请保留说明!

上一篇:Unity3D游戏开发之如何隐藏物体(Unity3D游戏开发引擎)

下一篇:Unity3d游戏开发之如何接入SDK(Unity3D游戏开发标准教程)

  • 进口环节应纳消费税的计税依据为
  • 股东如何收回投资
  • 金税四期影响企业贷款吗
  • 营业外支出增加的原因
  • 发票开错对方已抵扣怎么处理
  • 商业承兑汇票贴现率
  • 增值税专用发票明细太多怎么办
  • 哪些收入应该纳入到个人所得税
  • 没有发票的费用可以抵扣企业所得税吗
  • 车辆停放服务属于交通运输服务吗
  • 资产入股会计处理
  • 公司名称变更发票还能认证吗
  • 税务1236600短信
  • 销售补差怎么做分析
  • 高新技术企业账务处理注意事项
  • 债务重组损失是费用吗
  • 资产负债表预收预付账款怎么填
  • 员工工资薪金会计如何核算?
  • 高新技术企业预审要求
  • 第三方代缴社保算工龄吗
  • 生产出来的次品怎么入账
  • 过期的费用发票怎么处理
  • 融资租赁主营业务收入如何确认
  • 购买材料自用不退款
  • 多缴的社保退还给员工是否还要算个税
  • 新办企业的开办费用应计入( )
  • 小型微利企业的条件
  • 一般纳税人增值税及附加税费申报表怎么填
  • 个体户经营所得核定税率
  • 托收凭证的会计科目
  • 其他应付款包括应付职工薪酬吗
  • 银行贷款入公账怎么入分录?
  • 退回的发票怎么处理
  • 未担保余值什么意思
  • 讨论:利息与贴息的关系?
  • 怎么实现增删改查
  • typecho 插件开发
  • mac电脑色彩设置
  • 苹果电脑付款方式设置
  • 建筑业预缴企业所得税税率
  • ajax无刷新更新数据
  • 存货跌价准备是什么意思
  • 驼鹿穿过莫兰山了吗
  • 纳税人性质是什么
  • Vite4+Pinia2+vue-router4+ElmentPlus搭建Vue3项目(组件、图标等按需引入)[保姆级]
  • hashmap教程
  • 错账的类型及对应的更正方法
  • 小企业会计准则外币业务
  • php页面出不来
  • python3 sys模块
  • 进项税需要转出的分录
  • 小规模租金可以抵税吗
  • 主营业务收入借方什么意思
  • 哪种情形的货物或者服务可以采用竞争性谈判方式采购
  • 去年应收账款下账错误怎么调整
  • 银行日记账记错了怎么办
  • 公司汽车上牌费用多少
  • 息税前利润变动百分比计算公式
  • rpm包安装的apache可以如何启动
  • mac的vmware
  • 彻底删除ubuntu系统
  • 安装xps虚拟打印机
  • proflwiz.exe - proflwiz是什么进程 有什么用
  • Centos 6.4 64位版命令行下设置无线网卡教程
  • win8系统忘记密码电脑重置
  • 新手如何入门
  • korok是什么文件
  • win7系统电脑卡住了怎么办
  • 如何短时间内学会打字
  • opengl和openglskia
  • node.js视频教程
  • 【mclin】手把手叫你在Eclipse里添加Android开发功能(附:完整离线版Android_SDK和Android_ADT下载)
  • javascript基础入门教程
  • js中new一个函数
  • android简单app实例
  • 土地使用税申报流程图
  • 税费算管理费用还是财务费用
  • 北京税务分所怎么样啊
  • portal
  • 2020年山东录取人数
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设