LayaAir Spine 资源格式分析

本文主要分析laya引擎spine格式.bin到atlas及skel的相关浅显记录。

1.头部特征

Laya 自定义容器 的前 8 字节通常都为00,它被读取为两个 uint32,固定为 0,可视为 Laya 容器标记。

image-20260810110047069

之后是:

  • varint 长度,跳过一段 ASCII/UTF-16 字符串(通常是 spine 标记)
  • uint16 字符串表数量
  • 每个字符串条目:
    • 0 = null
    • 1 = 空字符串
    • 偶数 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 贴图 UV
    • x/y/width/height
    • originalWidth/originalHeight
    • offsetX/offsetY
    • index

4.骨架

图集后是 Laya 自定义骨架段,结构与 Spine 4.0 标准二进制顺序相近,但有三个重要区别:

  1. 字符串不是内联,而是 varint 字符串表索引
  2. 浮点数组不是内联,而是 varint 浮点数组表索引
  3. 动画不是立即解析,而是先记录名称和偏移,运行时再按偏移读取

因此转换到标准 .skel 时要做:

  • 重建标准字符串表
  • 内联浮点数组
  • 把自定义小端格式转成标准大端格式
  • Mesh UV 从“贴图绝对 UV”反算为“区域局部 UV”
  • 非加权 Deform 从“绝对形变值”换算为“相对基础顶点的增量”

至此,基本解析与复原大致方向就已结束。