spineのUnityランタイムをみっちり調べる
- BTA(Kelorin Jo)
- 2020年2月14日
- 読了時間: 4分
spineの解説動画はエフェクト作ったとこまでは撮ってますが、そこから先
Unityで動かすことが大きな難関です。
Unityでspineを動かすランタイム
の日本語の解説記事が、すごく少ない…ほとんど軽いさわりだけ!
(英語の記事ですら少ないような)
公式のくわしいドキュメントはあるんですが、
長っ!!!!!
そしてところどころに載ってるコードはコピペで打ち込んで即動くようにできてない!
Unityランタイムのサンプルデモを参考にして作ってねってことみたいです。
サンプルデモは5 Basic Platformerが一番実践的でわかりやすいです。
サンプルのキャラを自作モデルに差し替える手順

1.まずランタイムをプロジェクトにインポート、5 Basic Platformerを探して開きます
2.次に自作キャラモデルをspineから書き出してUnityにインポートします。
適当なところにフォルダを作って3つの生成ファイル(atlas.txt、png、json)を入れると、SkeletonDataが作られます。
3.プロジェクトから、自作モデルのSkeletonDataを選択してインスペクタから
previewの下のCreate Anumation RefrerenceAssetsボタンを押すと、

モデルの内包するモーション一つ一つが個別のファイルとして生成されます。

これは一つのフォルダに複数モデル入れてると上書きされるので、1キャラ1フォルダに分別してください。
4.ヒエラルキーのplayer-HeroにあるSkereton Animationの中身を差し替えます。
SkeletonDataを自作モデルのものに変えて、
InitialSkinはdefaultに、AnimatorNameはNoneに変えます。

このSkereton Animationがspineランタイムの根幹といえる代物で、SkeletonDataをヒエラルキーにD&Dすると自動的に組み込まれるぐらい重要です。
5.PlayerのSkeleton Animation Handle Exampleの要素を差し替えます
Animationの欄に3で作ったデータの、該当するモーションをセットしていきます

その下、Transformsでは、モーション同士のつなぎを設定できます。
From モーションA
To モーションB
Transform モーションAからモーションBに変える間のモーション
たとえばFromが落下、ToがIdle、Transformがダウンの場合は、(ジャンプなどで)落下して着地したらそのたび転倒するようになります。
※なおこれを使わなくてもspineはUnityのスプライトアニメと違って、それ単体で若干のモーションブレンドが効かせられます。モーション個別のブレンド具合も設定できます
6.Player-Hero-root以下のSkeleton Utility Bonesがついてるオブジェクトは使いません。不具合を起こすので非アクティブにするか削除します。
7.ところでキャラの大きさはspineが(キャラ作成前の画像インポートの時点で)ピクセル解像度で決められてるのですが、
SkeletonData=モデルデータのscaleで調整できます。
これで実行すれば、自作モデルが動かせるはず。
ここまでの段階での印象は、
・Unity上からはspineのボーンは直接はいじれない、でもIKとかTCはいじれるぽいし、Unityの物理で揺らせるボーンもある
・Unityのアニメーション機能で動かしてるわけじゃなく、基本はspine上で作ったモーションを再生する以上のことは(簡単には)出来ない
ここまでは簡単。
Skeleton Utilityユーテリティの使い方
Skeleton Utilityは、spineボーンの位置を取得してボーンの階層を作れます。

これは手動でアタッチするのでなく、spineモデルのskeletonAnimationのAdnancedを開くと、一番下にAdd Skeleton Utilityボタンがあり、

これを押すとSkeleton Utilityが生成されます。
Skeleton Utilityはなにか空の入力欄がありますが手を出さず、ボタンを押すとメニューが出て、
自身のスケルトンを指定すると、ボーン階層が生成されます。

全てのオブジェクトにSkeleton Utility Boneがアタッチされてて、モデルのボーンの位置に常時追随します。ここに物理のヒンジとかIKとか取り付けられるようです。
使わないボーンのオブジェクトは削除できます。
また、ボーンの位置を常時追随ということは、これでボーンのローカル座標が取得できます。
特定のボーンのワールド座標だけ取得したい場合は、BoneFollowというコンポーネントを使います。これはSkereton Animationの右メニューから作れます。
これらの仕様を使って、キャラの当たり判定やフレームごとに変動する攻撃判定が作れます。
…この間接的な方法を使わず、スマートにSkeletonDataとSkereton Animationから直接ボーンの位置やキーフレームを取得しようとすると、おそらく地獄の難易度になります。
それでもイベントキーだけはなんとかして取得しないといけないのですが、
四苦八苦してまともに取得できたコードがこんな感じになりました。

適当なゲームオブジェクトにスクリプトをアタッチ、spineモデルのあるオブジェクトと参照したいイベント名をセット、イベントキーが発火するたびログに数値が出ます

このコードはモデルのオブジェクトの外からも使えます。
イベント名の入力がstringで手打ちという不便さなんですが、
Skereton Animationのあるオブジェクト内にアタッチする前提だったら、SpineAttributeというもので簡単にリストから選択できるようにも作れます。

全モーション名がリスト表示になってそこから選択できる
[SpineAnimation]
public string attackAnimation;
Idleとつくモーションデータだけ選択できる
[SpineAnimation("Idle")]
public string idleAnimation;
イベント名をリスト表示して選択できる
[SpineEvent]
public string eventnon;
スロット名を選択できる
[SpineSlot]
public string eyesSlot;
アトリビュートをつけるだけで、上のようにリスト表示されて超使いやすくなります。
これはSkereton Animationをアタッチしたオブジェクト内でかつnamespace Spine.Unity.Examplesの中でしか使えませんでした。
SpineAttributeを改造して外でも使えるように自作できるかは不明。アトリビュートって自作できるもんなの…?
Comments