ランタイムスキン

スキンはスケルトンがランタイムで使用するアタッチメントをコントロールするために使用されます。キーがスロットと名前であるとするとSkinはマップであり、値はアタッチメントです。名前はSpineエディターに定義されたスキンプレースホルダー名であり、アタッチメントの名前である必要はありません。これによりコードとアニメーションは特定のアタッチメントを参照することなく、スキンのプレースホルダー名によりアタッチメントを設定できます。

例えば、スキンはキー、「slot=head,name=head」とそのキーの値、「attachment=fish-head」を持っているかもしれません。他のスキンは同じキー、「slot=head,name=head」と値、「attachment=donkey-head」を持つかもしれません。スキンは実際使用されるアタッチメントからコードとアニメ―ションを分離します。コードとアニメーションは「head」という名前を使用してアタッチメントを変更しますが、どのアタッチメントが頭に表示されるかはスケルトンの現在のスキンによります。

スケルトンデータにより定義される全てのアタッチメントはスキン内に配置されます。Spineエディターのスキン内にないアタッチメントは、ランタイムに「デフォルト」という名前のスキンとして表示されますが、スキン内の名前はアタッチメントの名前と同じです。スケルトン、「getAttachment」が名前によりアタッチメントを探す必要がある時、まずスケルトンの現在のスキンを探します。アタッチメントが見つからない場合、SkeletonDataのデフォルトスキンの中を探します。

カスタマイゼーション

スケルトンはSpineエディターにより定義されるスキンに制限されません。新しい空のスキンをランタイム時に作成し、アタッチメントとともに投入することができます。例として犬の頭または蛇の頭を持ち、羽根の翼または燃える翼を持つスケルトンがあるとします。もっと多くの特徴が追加される可能性がある中、スキンに頭と翼の全ての組み合わせを作成することは煩雑です。この代わりに希望する頭、翼、その他のアタッチメントを持つスキンをプログラムにより作成できます。

アタッチメントのグループ化

スキンの主な目的は分離ですが、アタッチメントのグループ化にも便利です。最もよく使用される方法はスケルトンの全体の外見を切り替えるためにスキンを使用することがあります。

スキンはまたアタッチメントのサブセットのグループ化にも使用されます。例えば、キャラクターに装備される「アイテム」が複数のアタッチメントにより構成されることがあります。シャツは胴のアタッチメントと袖という2個のアタッチメントから構成されるかもしれません。このケースではスキンは3個のシャツアタッチメントで作成されます。

実行時には、スケルトンは1つのスキン(と予備としてSkeletonDataの「default」スキン)のみ持つことができます。スキンはプログラムで作成し、他のスキンのアタッチメントと一緒に入力することができます。このように複数「アイテム」のスキンを組み合わせてスケルトンを着飾らせることができます。

Skin newSkin = new Skin("new-skin"); // 1. Create a new empty skin
newSkin.addSkin(skeletonData.findSkin("shirt/pink"); // 2. Add items
newSkin.addSkin(skeletonData.findSkin("pants/green");
newSkin.addSkin(skeletonData.findSkin("shoes/sneakers");

Spineエディターでは、スキンビューを使って複数のスキンを一度にプレビューすることができます。

スキンの変更

新しいスキンが設定され、スケルトンにまだスキンがない時、設定ポーズに表示されるスキン内の任意のアタッチメントを取り付られます。

新しいスキンが設定されスケルトンがすでにスキンを持ち、スロットに古いスキンからのアタッチメントがある場合、新しいスキンからのアタッチメントを取り付けられます。さもなければアタッチメントを変更することはできません。

全てのアタッチメントがアクティブスキン設定を反映するかどうかを確認するには、アタッチメントを影響する全てのシステムにスロットを再設定するよう指示する必要があります。

skeleton.setSkin(newSkin); // 1. Set the active skin
skeleton.setSlotsToSetupPose(); // 2. Use setup pose to set base attachments.
animationState.apply(skeleton); // 3. Use AnimationState to set attachments active in the current movement.
// 4. Set attachments that were manually changed.

「animationState.apply」がコマに呼び出される前にスキンが設定されている場合、 「animationState.apply」の呼び出しを省略することができます。

他の動きを用意するには、スキン変更後、希望するアタッチメントを設定する必要があります。

アタッチメントの作成

ランタイム時のスキン作成と同様、アタッチメントをプログラムにより作成することができます。これはSpine内に多数のアタッチメントがあり、手動で作成することが煩雑な場合便利です。

Spineではアタッチメントは親ボーンに関連して位置づけられます。アタッチメントをプログラムで作成する時、アタッチメントをどこに配置すべきかを知るために慣例が必要です。この主な問題は、画像が異なるサイズの時、異なるポジショニングが必要になることです。

これを解決するには、様々なアタッチメント用のアートを全て収容できるほど十分な空白を持つテンプレートイメージをスケルトンに装着します。アタッチメントイメージはテンプレートイメージから好きなだけ作成できますが、Spineのスケルトンに追加する必要はありません。ランタイム時にテンプレートイメージ用のアタッチメントをコピーすると、テクスチャ領域が変更します。全てのイメージは対応テンプレートイメージと同じサイズのため、これらは同じポジションでボーンに取り付けられます。

ボーンの位置をマークするテンプレートイメージを持つアートを作成すると便利です。またアタッチメントイメージ内の余分な空白はテクスチャパッカーまたは同様のプロセスで除去できます。

次: APIリファレンス 前: Runtimeスケルトン