LayaAir Spine 资源格式分析
LayaAir Spine 资源格式分析
本文主要分析laya引擎spine格式.bin到atlas及skel的相关浅显记录。
1.头部特征
Laya 自定义容器 的前 8 字节通常都为00,它被读取为两个 uint32,固定为 0,可视为 Laya 容器标记。
之后是:
varint长度,跳过一段 ASCII/UTF-16 字符串(通常是spine标记)uint16字符串表数量- 每个字符串条目:
0= null1= 空字符串- 偶数
v= ASCII 编码,长度为v / 2 - 奇数
v= UTF-16LE 编码,长度为v / 2
uint16浮点数组表数量- 每个浮点数组:
varint长度 +float32 * 长度
Laya 的 BinaryParser.readHeader() 就是按这个顺序读取的。
2.关于laya
通常有3.7、3.8、4.0这些真实的spine版本构成,之后以4.0版本为例推进分析。
当然,有时候也有一些例外,比如一些bin实际上是标准 Spine 3.8.99 二进制骨架,不是 Laya 容器,这种直接可用。
3.二进制图集
头部之后是二进制图集:
- 页面数量
uint16 - 每个页面:
- 页面名(字符串表引用)
- 宽
uint16、高uint16 - minFilter、magFilter、uWrap、vWrap 各 1 字节
- 区域数量
uint16 - 每个区域:
- 区域名
- 页面索引
degrees(0/90/180/270)u/v/u2/v2贴图 UVx/y/width/heightoriginalWidth/originalHeightoffsetX/offsetYindex
4.骨架
图集后是 Laya 自定义骨架段,结构与 Spine 4.0 标准二进制顺序相近,但有三个重要区别:
- 字符串不是内联,而是
varint字符串表索引 - 浮点数组不是内联,而是
varint浮点数组表索引 - 动画不是立即解析,而是先记录名称和偏移,运行时再按偏移读取
因此转换到标准 .skel 时要做:
- 重建标准字符串表
- 内联浮点数组
- 把自定义小端格式转成标准大端格式
- Mesh UV 从“贴图绝对 UV”反算为“区域局部 UV”
- 非加权 Deform 从“绝对形变值”换算为“相对基础顶点的增量”
至此,基本解析与复原大致方向就已结束。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xingluo1909!
评论




