# JSON出力形式

ここでは、SpineのスケルトンデータおよびアニメーションデータのJSON出力形式について説明します。[Spineランタイム](/spine-runtimes)は、このデータをロードしてアニメーションを表示します。また、Spineはこのフォーマットのデータをインポートすることができ、他のツールとの相互運用が可能です。実際にJSON形式でエクスポートされたファイルを確認するには、Spineランタイムの[各種プロジェクト例](/git/spine-runtimes/tree/examples)をご覧ください。

SpineランタイムはJSONやバイナリデータのロードを行います。独自のランタイムをゼロから書く場合（これは膨大な作業量になります）を除き、独自のロードコードを書く必要はありません。

JSON形式は特に “整形表示(Pretty print)"設定を使用してエクスポートした場合はヒューマン・リーダブル(対人可読形式)かつ編集可能です。このため、手動でデータを検査したり、加工したりする必要がある場合に適しています。また、ランタイムの小さな変更にも強いので、ランタイムが変更されたときにデータを再エクスポートする必要がない場合もあります。欠点は、JSON形式は[バイナリ形式](/spine-binary-format)よりもファイルサイズが大きく、実行時のロードに時間がかかってしまう点です。

「※非必須」とマークされたデータは、エクスポート設定の`非必須データ(Nonessential data)`がチェックされている場合のみ出力されます。このデータはレンダリングには必要ありませんが、ツールやSpineにデータをインポートする際に役立つ場合があります。

JSON形式は、ボーン、スロット、スキン、アニメーションのリストを持つ"skeleton data"インスタンスをシリアライズしたものです。これは、画面上の特定のスケルトンインスタンスに結びつかない、ステートレス(処理状態を把握しない)データです。[サンプルJSON](/spine/files/example.json "Example JSON")

<a href="/files/runtime-diagram.png" target="blank"><img src="/files/runtime-diagram.png"/></a>

!!
# スケルトン #
skeletonセクションには、スケルトンに関するメタデータが格納されます。

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

**スケルトンの属性:**
* **hash:** すべてのそのスケルトンデータのハッシュ。これは、ツールで前回ロードしたときからデータが変更されたかどうかを検出するために利用することができます。
* **version:** そのデータをエクスポートしたSpineのバージョン。これは、ツールで特定のSpineのバージョンを強制的に使用するために利用することができます。
* **x:** Spineで設定したセットアップポーズにおける、スケルトンのアタッチメントのAABB(軸に沿ったバウンディングボックス)の左下のx座標。
* **y:** Spineで設定したセットアップポーズにおける、スケルトンのアタッチメントのAABBの左下のy座標。
* **width:** Spineで設定したセットアップポーズにおける、スケルトンのアタッチメントのAABB幅。スケルトンのAABBはポーズの取り方によって異なりますが、これはスケルトンの一般的なサイズとして使用できます。
* **height:** Spineで設定したセットアップポーズにおける、スケルトンのアタッチメントのAABBの高さ。
* **fps:** Spine内でのドープシートのフレームレート(frames per second)。省略された場合は 30 となります。※非必須
* **images:** Spine内でのイメージパス。※非必須
* **audio:** Spine内でのオーディオパス。※非必須

# ボーン #
bonesセクションは、セットアップポーズのボーンについて記述されています。

スケルトンのbonesのJSON例:
```
"bones": [
	{ "name": "root" },
	{ "name": "torso", "parent": "root", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 94.95 },
	...
],
```
ボーンは、親が常に子ボーンの前に来るように順序付けされます。

**ボーンの属性:**
* **name:** ボーンの名前。これはスケルトンにおいてユニーク(一意)になります。
* **length:** ボーンの長さ。ボーンの長さは、ボーンのデバッグラインを描画する以外は、通常、実行時に使用されません。省略された場合は 0 となります。
* **transform:** 親ボーンのトランスフォームの継承方法を「normal」「onlyTranslation」「noRotationOrReflection」「noScale」「noScaleOrReflection」 のいずれかで決定します。省略された場合は normal となります。
* **skin:** trueの場合、アクティブなスキンがボーンを持っているときのみ、このボーンはアクティブになります。省略された場合は false となります。
* **x:** セットアップポーズにおける親に対するボーンの X 位置。省略された場合は 0 となります。
* **y:** セットアップポーズにおける親に対するボーンの Y 位置。省略された場合は 0 となります。
* **rotation:** セットアップポーズにおける、親に対するボーンの回転 (度数)。省略された場合は 0 となります。
* **scaleX:** セットアップポーズにおけるボーンの X スケール。省略された場合は 1 となります。
* **scaleY:** セットアップポーズにおけるボーンの Y スケール。省略された場合は 1 となります。
* **shearX:** セットアップポーズにおけるボーンのシアー X 。省略された場合は 0 となります。
* **shearY:** セットアップポーズにおけるボーンのシアー Y 。省略された場合は 0 となります。
* **color:** Spine内でのボーンのカラー。省略された場合は 0x989898FF RGBA となります。※非必須

# スロット
slotsセクションでは、表示順序と、アタッチメントを割り当てられるスロットについて記述されています。

スケルトンのslotsのJSON例:
```
"slots": [
	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left-shoulder" },
	{ "name": "left arm", "bone": "left arm", "attachment": "left-arm" },
	...
],
```
スロットが無い場合は、"slots "セクションを省略することができます。スロットは、セットアップポーズの表示順序で並びます。上位のスロットにある画像は、下位のスロットにある画像の上に描画されます。

**スロットの属性:**
* **name:** スロットの名前。これはスケルトンにおいてユニーク(一意)になります。
* **bone:** このスロットがアタッチされているボーンの名前。
* **color:** セットアップポーズにおけるスロットのカラー。RGBA順で4つの2桁の16進数からなる8文字の文字列になります。アルファが省略された場合は、アルファを "FF" とします。省略時は "FFFFFFFF “となります。
* **dark:** セットアップポーズにおけるスロットのダークカラーで、2色でのティントに使用されます。RGB順に2桁の16進数3つを含む6文字の文字列になります。2色カラーリングを使用しない場合は省略されます。
* **attachment:** セットアップポーズにおけるスロットのアタッチメントの名前。省略された場合は、セットアップポーズではアタッチメントが無いと仮定されます。
* **blend:** スロットの表示アタッチメントを描画する際に使用するブレンドのタイプで、「normal」「additive」「multiply」「screen」のいずれかになります。

# コンストレイント

## IKコンストレイント
このセクションでは[IKコンストレイント](/spine-ik-constraints)について記述されています。

```
"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:** trueの場合、アクティブなスキンがこのコンストレイントを持つときのみコンストレイントが適用されます。省略された場合は false となります。
* **bones:** このコンストレイントによって回転が制御される1つまたは2つのボーン名のリスト。
* **target:** ターゲットボーンの名前。
* **mix:** 0から1までの値で、コンストレイントがボーンに及ぼす影響を示します。0はFKのみ、1はIKのみ、その中間はFKとIKのミックスを意味します。省略された場合は 1 となります。
* **softness:** 2つのボーンによるIKのための値で、回転が遅くなるボーンの最大到達点からの距離を表しています。省略された場合は 0 となります。
* **bendPositive:** trueの場合、ボーンは正の回転方向に曲がります。省略された場合は false となります。
* **compress:** trueの場合、単一のボーンのみが制約され、ターゲットが近すぎる場合、ボーンはそれに到達するようにスケーリングされます。省略された場合は false となります。
* **stretch:** trueかつターゲットが範囲外である場合、親ボーンはターゲットに達するようにスケーリングされます。複数のボーンが制約され、親ボーンが非均一なローカルスケールを持つ場合、ストレッチは適用されません。省略された場合は false となります。
* **uniform:** trueの場合、単一のボーンのみが制約され、compress(圧縮) または stretch(ストレッチ) が使用されると、そのボーンはX軸とY軸の両方でスケーリングされます。省略された場合は false となります。

## トランスフォームコンストレイント
ここでは、トランスフォームコンストレイントについて記述されています。

```
"transform": [
	{ "name": "weapon to hip", "order": 1, "bone": "weapon", "target": "hip" },
	...
],
```

トランスフォームコンストレイントがない場合は、"transform"セクションを省略することができます。

**トランスフォームコンストレイントの属性:**
* **name:** コンストレイントの名前。これはスケルトンにおいてユニーク(一意)になります。
* **order:** このコンストレイントが適用される順番を表す序数。
* **skin:** trueの場合、アクティブなスキンがこのコンストレイントを持つときのみコンストレイントが適用されます。省略された場合はfalseとなります。
* **bones:** このコンストレイントによってトランスフォームが制御されるボーン。
* **target:** ターゲットボーンの名前。
* **rotation:** ターゲットボーンからオフセットする回転値。省略された場合は0となります。
* **x:** ターゲットボーンからオフセットするX距離。省略された場合は0となります。
* **y:** ターゲットボーンからオフセットするY距離。省略された場合は0となります。
* **scaleX:** ターゲットボーンからオフセットするXスケール。省略された場合は0となります。
* **scaleY:** ターゲットボーンからオフセットするYスケール。省略された場合は0となります。
* **shearY:** ターゲットボーンからオフセットするYシアー。省略された場合は0となります。
* **rotateMix:** 0から1までの値で、コンストレイントがボーンに及ぼす影響を示します。0は影響なし、1は制約のみ、そして間は通常のポーズとコンストレイントのミックスを意味します。省略された場合は1となります。
* **translateMix:** **rotateMix**と同様です。
* **scaleMix:** **rotateMix**と同様です。
* **shearMix:** **rotateMix**と同様です。
* **local:** trueの場合はターゲットのローカルトランスフォームが影響を受け、そうでない場合はワールドトランスフォームが影響を受けます。省略された場合はfalseとなります。
* **relative:** trueの場合はターゲットのトランスフォームが相対的に調整され、そうでない場合はトランスフォームが絶対的に設定されます。省略された場合はfalseとなります。

## パスコンストレイント
ここでは、パスコンストレイントについて記述されています。

```
"path": [
	{
		"name": "constraintName",
		"order": 0,
		"bones": [ "boneName1", "boneName2" ],
		"target": "slotName",
		"positionMode": "fixed",
		"spacingMode": "length",
		"rotateMode": "tangent",
		"rotation": "45",
		"position": "204",
		"spacing": "10",
		"rotateMix": "0",
		"translateMix": "1"
	},
	...
],
```

パスコンストレイントがない場合は、"path “セクションは省略されます。

**パスコンストレイントの属性:**
* **name:** コンストレイントの名前。これはスケルトンにおいてユニーク(一意)になります。
* **order:** このコンストレイントが適用される順番を表す序数。
* **skin:** trueの場合、アクティブなスキンがこのコンストレイントを持つときのみコンストレイントが適用されます。省略された場合は false となります。
* **bones:** このコンストレイントによって回転とトランスレートが制御されるボーン。
* **target:** ターゲットスロットの名前。
* **positionMode:** パスの位置の計算方法をfixedまたはpercentで指定します。省略された場合は percent となります。
* **spacingMode:** ボーンの間隔の計算方法を、length、fixed、percentのいずれかで指定します。省略された場合は length となります。
* **rotateMode:** ボーンの回転の計算方法を、tangent、chain、chain scaleのいずれかで指定します。省略された場合は tangent となります。
* **rotation:** パスの回転からオフセットする回転値を指定します。省略された場合は 0 となります。
* **position:** パスの位置。省略時は 0 となります。
* **spacing:** ボーンとボーンの間の間隔。省略された場合は 0 となります。
* **rotateMix:** 0から1までの値で、コンストレイントがボーンに及ぼす影響を示します。0は影響なし、1は制約のみ、そして間は通常のポーズとコンストレイントのミックスを意味します。省略された場合は1となります。
* **translateMix:** **rotateMix**と同様です。

# スキン
skinsセクションで記述された各スキンは、各スロットに割り当てられるアタッチメントを記述しています。

スケルトンのskinsのJSON例:
```
"skins": [
	{
		"name": "skinName",
		"attachments": {
			"slotName": {
				"attachmentName": { "x": -4.83, "y": 10.62, "width": 63, "height": 47 },
				...
			},
			...
		}
	},
	{
		"name": "skinName",
		"attachments": {
			"slotName": {
				"attachmentName": { "name": "actualAttachmentName", "x": 53.94, "y": -5.75, "rotation": -86.9, "width": 121, "height": 132 },
				...
			},
			...
		}
	},
	...
],
```
スキンやアタッチメントが無い場合は、”skins”セクションは省略されます。

各スキンは、基本的にスロットとアタッチメント名からなる複合キーを持つマップであり、値はアタッチメントです。キーに使用されるアタッチメント名は各スキンで同じですが、実際に使用されるアタッチメント名は異なる場合があります。

例えば、「pelvis」スロットの画像「pelvis」は、実際には「red」スキンでは「red/pelvis」、「blue」スキンでは「blue/pelvis」というアタッチメント名を持っているかもしれません。もしスケルトンが「blue」スキンをアクティブにしていて、「pelvis」スロットの「pelvis」イメージを表示するように指示されたら、それが見つけるアタッチメントは、「blue/pelvis」という実際のアタッチメント名を持つことになるでしょう。

スケルトンがあるスロットにアタッチメントを見つける必要があるとき、まずそのスキンをチェックします。もし見つからなければ、スケルトンはデフォルトスキンをチェックします。デフォルトスキンは、Spineのスキンによって定義されていないアタッチメントを含んでおり、スキンとスキン以外のアタッチメントを混在して使用することができます。デフォルトスキンは、常に "default "という名前を持ちます。

デフォルトスキン以外のスキンは、ボーンやコンストレイントを持つことがあります:
```
"skins": [
	{
		"name": "skinName",
		"bones": [ "bone1", "bone2" ],
		"ik": [ "ik1", "ik2" ],
		"transform": [ "transform1", "transform2" ],
		"path": [ "path1", "path2" ],
		"attachments": {
			...
		}
	},
	...
}
```

## アタッチメント

各アタッチメントの属性は、アタッチメントの種類によって異なります。

**アタッチメントの共通属性:**
 * **type:** アタッチメントの種類。省略した場合は "region “となります。
 * **name:** アタッチメントの名前。これはスケルトンにおいてユニーク(一意)になります。画像アタッチメントの場合、これはディスクやテクスチャアトラスなどでテクスチャ領域を検索するためのキーとなります。省略した場合は、周囲のJSONマップのキーが実際のアタッチメント名として使用されます。

**アタッチメントの種類:**
 * **region:** テクスチャのある長方形。
 * **mesh:** 頂点がウェイトによって複数のボーンに影響される可能性があるテクスチャメッシュ。
 * **linkedmesh:** 他のメッシュとUV、頂点、ウェイトを共有するメッシュ。
 * **boundingbox:** 当たり判定や物理演算などに使用されるポリゴン。
 * **path:** 3次元スプラインで、パスに沿ってボーンを移動させるのによく使われます。
 * **point:** 投射物やパーティクルのスポーンによく使われる、回転を伴う点。
 * **clipping:** 他のアタッチメントの描画をクリップするために使用するポリゴン。

**領域(region)アタッチメントの属性:**
* **path:** 設定されている場合、テクスチャ領域を検索するために、アタッチメント名の代わりにこの値が使用されます。
* **x:** スロットのボーンに対する画像のX位置。省略した場合は 0 となります。
* **y:** スロットのボーンに対する画像のY位置。省略した場合は 0 となります。
* **scaleX:** 画像のXスケール。省略した場合は 1 となります。
* **scaleY:** 画像のYスケール。省略した場合は 1 となります。
* **rotation:** スロットのボーンに対する画像の回転（度）。省略した場合は 0 となります。
* **width:** 画像の幅。
* **height:** 画像の高さ。
* **color:** アタッチメントを着色するカラー。省略した場合は FFFFFFFF RGBA となります。

**メッシュ(mesh)アタッチメントの属性:**
* **path:** 設定されている場合、テクスチャ領域を検索するために、アタッチメント名の代わりにこの値が使用されます。
* **uvs:** 各頂点のテクスチャ座標となる数値のペアのリスト。
* **triangles:** メッシュの各三角形を定義する頂点のインデックスのリスト。
* **vertices:** 各頂点に対して、x,y のペアか、ウェイトが設定されているメッシュの場合は、まず頂点に影響を与えるボーンの数、次にそれらのボーンのインデックス、バインドX位置、バインドY位置、ウェイトが続きます。vertices > UV数 であれば、そのメッシュはウェイトが設定されています。
* **hull:** ポリゴンのハルを構成する頂点の数。ハルの頂点は常に**vertices**リストで最初に表示されます。
* **edges:** 接続された頂点間のエッジを定義する、頂点インデックスペアのリスト。※非必須
* **color:** アタッチメントを着色するカラー。省略した場合は FFFFFFFF RGBA となります。
* **width:** メッシュで使用する画像の幅。※非必須
* **height:** メッシュで使用する画像の高さ。※非必須

**リンクメッシュ(linkedmesh)アタッチメントの属性:**
* **path:** 設定されている場合、テクスチャ領域を検索するために、アタッチメント名の代わりにこの値が使用されます。
* **skin:** ソースメッシュを含むスキン。省略した場合は、ソースメッシュはデフォルトスキンになります。
* **parent:** ソースメッシュの名前で、常にこのメッシュと同じスロットにあります。ソースメッシュがデフォルトスキンにない場合、この名前はスキン内の実際のアタッチメントを検索するために使用されます。
* **deform:** falseの場合、ソースメッシュの変形タイムラインはこのメッシュに適用されません。省略された場合は true となります。
* **color:** アタッチメントを着色するカラー。省略した場合は FFFFFFFF RGBA となります。
* **width:** メッシュで使用する画像の幅。※非必須
* **height:** メッシュで使用する画像の高さ。※非必須

**境界ボックス(boundingbox)アタッチメントの属性:**
* **vertexCount**: 境界ボックスの頂点数。
* **vertices:** 各頂点に対して、x,y のペアか、ウェイトが設定されているバウンディングボックスの場合、まず頂点に影響を与えるボーンの数、次にその数のボーンに対して、ボーンのインデックス、バインドX位置、バインドY位置、ウェイトになります。verticesの数 > vertexCountであれば、境界ボックスはウェイト付けされています。
* **color:** Spine内での境界ボックスのカラー。省略した場合は 60F000FF RGBA となります。※非必須

**パス(path)アタッチメントの属性:**
* **closed**: 最後の頂点と最初の頂点が接続されている場合、trueになります。省略された場合は false となります。
* **constantSpeed**: パスに沿った移動が一定速度で行われる場合はtrueになります。省略された場合はtureとなります。
* **lengths**: セットアップポーズでのパスの始点から各カーブの終点までの長さ。
* **vertexCount**: パスの頂点の数。
* **vertices:** 各頂点に対して、x,y のペアか、ウェイトが設定されているパスの場合、まず頂点に影響を与えるボーンの数、次にその多くのボーンに対して、ボーンのインデックス、バインドX位置、バインドY位置、ウェイトになります。verticesの数 > vertexCount であれば、パスはウェイト付けされています。
* **color:** Spine内でのパスのカラー。省略時は FF7F00FF RGBA となります。※非必須

**ポイント(point)アタッチメントの属性:**
* **x:** スロットのボーンに対するポイントのX位置。省略された場合は0となります。
* **y:** スロットのボーンに対するポイントのY位置。省略された場合は0となります。
* **rotation:** スロットのボーンに対するポイントの回転(度)。省略された場合は0となります。
* **color:** Spine内でのポイントのカラー。省略された場合は F1F100FF RGBA となります。※非必須

**クリッピング(clipping)アタッチメントの属性:**
* **end**: クリッピングが停止するスロットの名前。
* **vertexCount**: クリッピングポリゴンの頂点の数。
* **vertices:** 各頂点に対して、x,y のペアか、ウェイトが設定されたクリッピングポリゴンの場合、まず頂点に影響を与えるボーンの数、次にその多くのボーンに対して、ボーンのインデックス、バインドX位置、バインドY位置、ウェイトになります。vertices > vertexCountの場合、クリッピングポリゴンはウェイト付けされています。
* **color:** Spine内でのクリッピングアタッチメントのカラー。省略時は CE3A3AFF RGBA となります。※非必須

# イベント #
eventsセクションでは、アニメーション中にトリガーされる名前付きイベントと、そのセットアップポーズ値について記述されています。

eventsのJSON例:
```
"events" [
	"name": { "int": 1, "float": 2, "string": "three" },
	"name": { "int": 1, "float": 2, "string": "three", "audio": "hit.wav", "volume": 0.9, "balance": -0.25 },
	...
],
```
**イベントの属性:**
* **name:** イベントの名前。これはスケルトンにおいてユニーク(一意)になります。
* **int:** イベントのInteger(整数)の値。省略した場合は 0 となります。
* **float:** イベントのFloat(浮動小数点)の値。省略した場合は 0 となります。
* **string:** イベントのString(文字列)の値。省略し場合は null となります。
* **audio:** このイベントがオーディオを再生するためのものである場合、オーディオファイルへのパスが入ります。省略された場合は null となります。
* **volume:** オーディオファイルの再生に使用するボリューム。省略した場合は 1 となります。
* **balance:** オーディオファイルの再生に使用されるステレオバランス。省略した場合は 0 となります。

# アニメーション #
アニメーションには、タイムラインのリストがあります。各タイムラインにはキーフレームがあり、ボーンやスロットの値が時間と共にどのように変化するかを記述しています。

アニメーションのJSON例:
```
"animations": {
	"name": {
		"bones": { ... },
		"slots": { ... },
		"ik": { ... },
		"deform": { ... },
		"events": { ... },
		"draworder": { ... },
	},
	...
}
```

## ボーンのタイムライン
アニメーションのbonesセクションは、ボーンを操作するタイムラインが記述されています。

アニメーションのbonesのJSON例:
```
{
"bones": {
	"boneName": {
		"timelineType": [
			{ "time": 0, "angle": -26.55 },
			{ "time": 0.1333, "angle": -8.78 },
			...
		],
		...
	},
	...
},
```
各キーフレームの属性は、タイムラインの種類によって異なります。

**ボーンのタイムラインの種類:**
* **rotate**: ボーンの回転のキーフレーム。
* **translate**: ボーンのXおよびYの位置のキーフレーム。
* **scale**: ボーンのXおよびYのスケールのキーフレーム。
* **shear**: ボーンのXおよびYのシアーのキーフレーム。

**ボーンのキーフレームの共通属性:**
* **time:** キーフレームの時間（秒）。省略した場合は0となります。
* **curve:** このキーフレームと次のキーフレームとの間で使用する補間方法。属性が省略された場合はリニア、値が文字列 "stepped" の場合はステップカーブ、それ以外の場合は制御点を定義する 4 つの要素を持つ配列である `cx1`、`cy1`、`cx2`、`cy2`となります。X軸の単位はフレーム、Y軸の単位は値です。

**回転キーフレームの属性:**
* **angle:** セットアップポーズに関連するボーンの回転。省略された場合は 0 となります。

**トランスレートキーフレームの属性:**
* **x:** セットアップのポーズに対するボーンの X 位置です。省略された場合は 0 となります。
* **y:** セットアップのポーズに対するボーンの Y 位置です。省略された場合は 0 となります。

**スケールキーフレームの属性:**
* **x:** セットアップのポーズに対するボーンの X スケールです。省略された場合は 1 となります。
* **y:** セットアップのポーズに対するボーンの Y スケールです。省略された場合は 1 となります。

**シアーキーフレームの属性:**
* **x:** セットアップのポーズに対するボーンの X シアーです。省略された場合は 0 となります。
* **y:** セットアップのポーズに対するボーンの Y シアーです。省略された場合は 0 となります。

## スロットのタイムライン
アニメーションのスロットセクションは、スロットを操作するタイムラインが記述されています。

アニメーションのslotsのJSON例:
```
"slots": {
	"slotName": {
		"timelineType": [
			{ "time": 0.2333, "name": "eyes closed" },
			{ "time": 0.6333, "name": "eyes open" },
			...
		],
		...
	},
	...
}
```
各キーフレームの属性は、タイムラインの種類によって異なります。

**スロットのタイムラインの種類:**
* **attachment**: スロットのアタッチメントを変更するためのキーフレーム。
* **color**: スロットのカラーを変更するためのキーフレーム。

**スロットのキーフレームの共通属性:**
* **time:** キーフレームの時間(秒)。

**アタッチメントのキーフレームの属性:**
* **name:** そのスロットに設定するアタッチメントの名前。

**カラーキーフレームの属性:**
* **color:** スロットに設定するカラー。RGBA順で2桁の16進数4つを含む8文字の文字列です。
* **curve:** このキーフレームと次のキーフレームとの間で使用する補間方法。属性が省略された場合はリニア、値が文字列 "stepped" の場合はステップカーブ、そうでない場合はベジエカーブの`cx1`となります。<br>ベジエカーブは、`cx1`、`cy1`、`cx2`、`cy2`の4つの要素からなり、制御点を定義します。X軸は0から1まであり、2つのキーフレーム間の時間の割合を表します。Y軸も0から1までで、キーフレームの値の差のパーセントを表します。
* **c2:** ベジエカーブの`cy1`値。省略した場合は 0 となります。
* **c3:** ベジエカーブの`cx2`値。省略した場合は 1 となります。
* **c4:** ベジエカーブの`cy2`値。省略した場合は 1 となります。

**2色のカラーキーフレームの属性:**
* **light:** スロットに設定するライトカラー。RGBA順で2桁の16進数4つを含む8文字の文字列です。
* **dark:** スロットに設定するダークカラー。RGBA順で2桁の16進数4つを含む8文字の文字列です。
* **curve:** このキーフレームと次のキーフレームとの間で使用する補間方法。属性が省略された場合はリニア、値が文字列 "stepped" の場合はステップカーブ、そうでない場合はベジエカーブの`cx1`となります。<br>ベジエカーブは、`cx1`、`cy1`、`cx2`、`cy2`の4つの要素からなり、制御点を定義します。X軸は0から1まであり、2つのキーフレーム間の時間の割合を表します。Y軸も0から1までで、キーフレームの値の差のパーセントを表します。
* **c2:** ベジエカーブの`cy1`値。
* **c3:** ベジエカーブの`cx2`値。
* **c4:** ベジエカーブの`cy2`値。

## IKコンストレイントのタイムライン
アニメーションのIKセクションには、IKコンストレイントのタイムラインが記述されています。

アニメーションのIKのJSON例:
```
"ik": {
	"constraintName": [
		{ "time": 0.5333, "mix": 0.616, "bendPositive": true },
		...
	],
	...
},
```

**IKコンストレイントのキーフレームの属性:**
* **time:** キーフレームの時間(秒)。
* **mix:** キーフレームに設定するIKコンストレイントのミックス値。省略された場合は1となります。
* **softness:** 2つのボーンによるIKのための値で、回転が遅くなるボーンの最大到達点からの距離を表しています。省略された場合は0となります。
* **bendPositive:** キーフレームに対するIKコンストレイントの曲げの方向。省略された場合は false となります。
* **compress:** trueの場合、単一のボーンのみが制約され、ターゲットが近すぎる場合、ボーンはそれに到達するようにスケーリングされます。省略された場合は false となります。
* **stretch:** trueかつターゲットが範囲外である場合、親ボーンはターゲットに達するようにスケーリングされます。複数のボーンが制約され、親ボーンが非均一なローカルスケールを持つ場合、ストレッチは適用されません。省略された場合は false となります。

## トランスフォーム・コンストレイントのタイムライン
アニメーションのtransformセクションには、トランスフォーム・コンストレイントのタイムラインが記述されています。

アニメーションのトランスフォームコンストレイントのJSON例:
```
"transform": {
	"constraintName": [
		{ "time": 1.81, "rotateMix": 0.66, "translateMix": 0, "scaleMix": 0.5, "shearMix": 0.5 },
		...
	],
	...
},
```

**トランスフォーム・コンストレイントのキーフレームの属性:**
* **time:** キーフレームの時間(秒)。
* **rotateMix:** このキーフレームでのトランスフォームコンストレイントの回転のミックス値。省略した場合は 1 となります。
* **translateMix:** このキーフレームでのトランスフォームコンストレイントのトランスレートのミックス値。省略した場合は 1 となります。
* **scaleMix:** このキーフレームでのトランスフォームコンストレイントのスケールのミックス値。省略した場合は 1 となります。
* **shearMix:** このキーフレームでのトランスフォームコンストレイントのシアーのミックス値。省略した場合は 1 となります。

## パスコンストレイントのタイムライン
アニメーションのpathセクションは、パスコンストレイントのタイムラインが記述されています。

アニメーションのパスコンストレイントのJSON例:
```
"path": {
	"constraintName": 
		"position": [
			{ "time": 1.81, "position": 0.7 },
			...
		],
		"spacing": [
			{ "time": 2.92, "spacing": 0.05 },
			...
		],
		"mix": [
			{ "time": 3.03, "rotateMix": 0.5, "translateMix": 0.75 },
			...
		],
	...
},
```

**パスコンストレイントのキーフレームの属性:**
* **time:** キーフレームの時間(秒)。
* **position:** このキーフレームでの位置コンストレイントの位置を指定します。省略時は1となります。
* **spacing:** このキーフレームでの位置コンストレイントの間隔を指定します。省略時は1となります。
* **rotateMix:** このキーフレームでの位置コンストレイントの回転のミックス値を指定します。省略時は1となります。
* **translateMix:** このキーフレームでの位置コンストレイントのトランスレートのミックス値を指定します。省略時は1となります。

## 変形のタイムライン
アニメーションのdeformセクションには、各メッシュアタッチメントの頂点を操作するタイムラインが記述されています。

アニメーションのdeformのJSON例:
```
"deform": {
	"skinName": {
		"slotName": {
			"meshName": [
				{
					"time": 0,
					"curve": [ 0.25, 0, 0.75, 1 ]
				},
				{
					"time": 1.5,
					"offset": 12,
					"vertices": [ -0.75588, -3.68987, -1.01898, -2.97404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
					-1.01898, -2.97404, -0.75588, -3.68987, 0, 0, -0.75588, -3.68987, -0.75588, -3.68987,
					-1.01898, -2.97404, -1.01898, -2.97404, -1.01898, -2.97404, -0.75588, -3.68987 ],
					"curve": [ 0.25, 0, 0.75, 1 ]
				},
				...
			],
			...
		},
		...
	},
	...
}
```

**変形のキーフレームの属性:**
* **time:** キーフレームの時間(秒)。
* **offset:** **vertices**を適用する前にスキップする頂点の数。vertices &lt;= offset は 0 であると仮定されます。
* **vertices:** このキーフレームにおいてセットアップ頂点位置に追加する量を表す数値ペアのリスト。エントリ数が頂点数より少ない場合、これらの後のverticesは 0 と見なされます。
* **curve:** このキーフレームと次のキーフレームとの間で使用する補間方法。属性が省略された場合はリニア、値が文字列 "stepped" の場合はステップカーブ、そうでない場合はベジエカーブの`cx1`となります。<br>ベジエカーブは、`cx1`、`cy1`、`cx2`、`cy2`の4つの要素からなり、制御点を定義します。X軸は0から1で、2つのキーフレーム間の時間の割合を表します。Y軸も0から1までで、キーフレームの値の差のパーセントを表します。
* **c2:** ベジエカーブの`cy1`値。省略した場合は 0 となります。
* **c3:** ベジエカーブの`cx2`値。省略した場合は 1 となります。
* **c4:** ベジエカーブの`cy2`値。省略した場合は 1 となります。

## イベントのタイムライン
アニメーションの events セクションには、イベントをトリガーするための単一のタイムラインが記述されています。

アニメーションのeventsのJSON例:
```
"events": [
	{ "time": 0.2, "name": "event1", "int": 1, "float": 2, "string": "three" },
	{ "time": 0.6, "name": "event2", "int": 4, "float": 5, "string": "six" },
	...
}
```
**イベントのキーフレームの属性:**
* **time:** キーフレームの時間(秒)。
* **name:** イベントの名前。
* **int:** イベントのInteger(整数)の値。省略した場合は、セットアップポーズの値となります。
* **float:** イベントのFloat(浮動小数点)の値。省略した場合は、セットアップポーズの値となります。
* **string:** イベントのString(文字列)の値。省略した場合は、セットアップポーズの値となります。
* **volume:** オーディオファイルの再生に使用するボリューム。省略した場合は、セットアップポーズの値となります。
* **balance:** オーディオファイルの再生に使用するステレオバランス。省略した場合は、セットアップポーズの値となります。

## 表示順序のタイムライン
アニメーションの draworder セクションは、表示順序を変更するための単一のタイムラインが記述されています。これは、スケルトン上のスロットを、そのアタッチメントが描画されるべき順序でリスト化したものです。

アニメーションのdraworderのJSON例:
```
"draworder": [
	{
		"time": 0.2,
		"offsets": [
			{ "slot": "slotName", "offset": 1 },
			{ "slot": "slotName", "offset": -2 },
			...
		]
	},
	...
}
```
**表示順序のキーフレームの属性:**
* **time:** キーフレームの時間（秒）。
* **offsets:** スロット名と数値オフセットのリスト。これは、指定されたスロットを、そのセットアップポーズの表示順序インデックスに対してシフトする描画順エントリの数です。"offsets" が省略された場合、キーフレームはセットアップポーズの表示順序に設定されます。