Spine导出格式说明之——JSON格式(上)

Spine可以导出为JSON或者二进制格式。JSON可读性强、便于检查和修改但体积大;二进制可读性差,修改成本高,但文件体积小,加载速度快。

可以说Spine导出的JSON格式数据是骨骼数据实例的序列化版本。它由一系列的骨骼(bones)、插槽(slots)、皮肤(skins)和动画(animations)组成。

骨架(Skeleton)

skeleton节点存储骨架的元数据,结构如下:

"skeleton": {
   "hash": "5WtEfO08B0TzTg2mDqj4IHYpUZ4",
   "spine": "3.8.24",
   "x": -17.2,
   "y": -13.3,
   "width": 470.86,
   "height": 731.44,
   "images": "./images/",
   "audio": "./audio/"
},

Skeleton属性

  • hash:skeleton数据的哈希值,工具可以用此哈希值来检测自上次加载以来数据是否发生变更。
  • version:导出数据时使用的Spine工具的版本。
  • x:AABB左下角的x坐标,跟spine软件中一样。
  • y:AABB左下角的y坐标,跟spine软件中一样。
  • width:skeleton附件在Spine中建立时的AABB宽度。虽然骨架的AABB取决于它的摆放方式,但我们依然可以用width、height来表示骨架的常规大小。
  • height:骨架建立时的AABB高度。
  • fps:帧率。
  • images:图片路径。
  • audio:音频路径。

AABB:计算机图形学中的术语,指“包围盒”、“包围体”。它的相交校验结果可以用来做碰撞检测。详见更权威的解释:https://zh.wikipedia.org/wiki/%E5%8C%85%E5%9B%B4%E4%BD%93

骨头(Bones)

bones节点描述建立姿势的“骨头”。

例:

"bones": [
   { "name": "root" },
   { "name": "torso", "parent": "root", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 94.95 },
   ...
],

“骨头”是有序的,因此“parent”总是在“child”前面。

Bones属性

  • name:骨骼名称。在skeleton中唯一。
  • length:骨骼长度。除了在绘制调试线条时使用外,通常不在运行时使用。缺值省为0。
  • transform:继承父bone的变换方式:normalonlyTranslationnoRotationOrReflectionnoScalenoScaleOrReflection。默认值为normal
  • skin:为true时,该骨骼只有在拥有这个骨骼的皮肤激活的时候才激活。默认为false。(通常在游戏发开中,一个组件active(激活)是才会渲染,也就是说才会显示)。
  • x:该骨头相对于父节点的x坐标。默认为0。
  • y:该骨头相对于父节点的y坐标。默认为0。
  • rotation:该骨头相对于父节点的旋转角度。默认为0。
  • scaleX:该骨头的x方向缩放值。默认为1。
  • scaleY:该骨头的y方向缩放值。默认为1。
  • shearX:该骨头x方向裁剪值。默认0。
  • shearY:该骨头y方向裁剪值。默认0。
  • color:颜色,默认0x989898FF(RGBA)。(非必需)

插槽(Slots)

插槽描述绘制顺序以及使用哪个附件。

例:

"slots": [
   { "name": "left shoulder", "bone": "left shoulder", "attachment": "left-shoulder" },
   { "name": "left arm", "bone": "left arm", "attachment": "left-arm" },
   ...
],

没有插槽时,“slot”将被省略。插槽绘制顺序排序,索引大的图片绘制在在所有小的图片之上。(这跟游戏里的zIndex类似)

Slots属性

  • name:插槽名称,在骨架中唯一。
  • bone:插槽连接的骨骼名称。
  • color:插槽颜色(RGBA)。
  • dark:摆姿势时插槽的深色值(RGB),用于tint。若未使用tint,则忽略。
  • attachment:附件名称。
  • blend混合模式

约束(Constraints)

IK约束

该节点描述IK (Inverse Kinematics反向动力学)约束。

"ik": [
   {
      "name": "left leg",
      "order": 2,
      "bones": [ "left thigh", "left shin" ],
      "target": "left ankle",
      "mix": 0.5,
      "bendPositive": false,
      "compress": true,
   },
   ...
],

如果不存在IK约束,“ik”将被忽略。

IK约束属性

  • name:约束名称,骨架中唯一
  • order:约束被应用的顺序
  • skin
  • bones
  • target
  • mix
  • softness
  • bendPositive
  • compress
  • stretch
  • uniform