Unityの人気アセット「Dynamic Bone」をSpineのモデルに適用してみる
Unityアセットストアで人気のアセットに「Dynamic Bone」があります。
女性の胸や長い髪(ポニーテールとか)、動物の尻尾などの、いわゆる「揺れもの」の挙動を簡単に実装できるアセットです。
基本的には3Dモデルを動かすのを主目的としたアセットなのですが、Spine公式の海外フォーラムを見ていた時に、気になるスレッドを見つけました。
http://ja.esotericsoftware.com/forum/Dynamic-Bones-8392?p=38501
要約すると、「SpineのモデルにDynamic Boneを適用したいんだけど、うまくいかないんだ」「うーん、俺もなんだよね…あ、わかった!こういうコツがあったんだよ」「なるほどね!」みたいな内容のスレッドです。
考えてみると、Spineのモデルは、板ポリのメッシュにボーンとウェイトを設定して動かしているようなものなので、Dynamic Boneも動きそうです。
機会があれば試したいな…と思っていたところ、「Unity AssetStoreまとめ」さんのイベントでアセットストアのバウチャーを25$も頂いたので、早速購入し、実験してみました!(汗人柱さん、ありがとうございました!)
というわけで、サクッとキャラの絵を描いて、Spineでセットアップします。
Dynamic Boneの公式動画では女性の胸と尻尾が動いているので、それをほんのり踏襲して、胸とツインテールの髪が動く感じをイメージしてみました。
作画は超適当ですが、髪と胸は細かく分割しておきます。なお、胸に割り当てているボーンは、左右3本ずつのボーンです。
SpineモデルをエクスポートしてUnityに読み込んだら、シーンにSkeleton Animationとして配置します。その際、Skeleton Utilityがアタッチされていなければ、アタッチします。
Skeleton Utilityを使うと、通常はUnity上では非表示の、Spineで設定したボーンをヒエラルキーで表示&各種設定することができます。「Spawn Hierarchy」から、ここではひとまず「Follow」を選択し、ボーンを表示させます。
ヒエラルキーに表示したボーンを選択すると、「Skeleton Utility Bone」がアタッチされています。枠をつけたところを説明しますと、「Mode」は「Follow」と「Override」の2つがあります。
ざっくり言うと「Follow」はSpineで設定したアニメを再生するモードで、「Override」はUnity側で挙動をあれこれ上書きするためのモードです。「Override Alpha」は、最大の1にすると完全にSpineのアニメを無視し、0に近づくにつれて「Follow」同様にSpineのアニメを再生するようになります。
というわけで、Dynamic Boneで動かしたいパーツは「Override」にする必要があります。「Override」にするとヒエラルキーのアイコンが変わります。左右の髪と、左右の胸を「Override」に設定しました。
次に、Dynamic Boneのスクリプトをアタッチします。このスクリプトはモデルのRootに配置することもできますが、剛性などの設定を各パーツで分ける観点から、動かしたいパーツの根元ごとに設定するのが無難かなと思います。このキャラでいうと、「SideHair_L」「SideHair_R」「Mune_L」「Mune_R」の4箇所ですね。アタッチしたら、スクリプトの「Root」欄にそのボーンをセットします。
Dynamic Bone自体を動かすには、設定はこれだけでも大丈夫です。ここで一旦、動かしてみましょう。なお、キャラクターにはごくごく簡単な、RigidBodyのVelocityで左右移動とジャンプするスクリプトを設定しています。
Dynamic Boneはちゃんと動いていますが、Spineのモデルには反映されてないですね。ここが、冒頭で紹介した海外フォーラムで言及されていたポイントで、曰く、
Figured it out. In the Script Execution Order make sure Dynamic Bone updates BEFORE SkeletonUtilityBone
…となっています。さて、皆さんはこの英語をちゃんと読めたでしょうか…。
僕は「ふむふむ、SkeletonUtilityBoneよりも前に、Dynamic Boneを実行すればいいんだな」と解釈し、「Script Execution Order」でDynamic BoneをDefault Timeよりも上(マイナス側)に設定し、「あれ…動かないぞ…?」と小一時間ほど悩みました。
実はこれ、「Script Execution Order」でDynamic BoneをDefault Timeよりも下(プラス側)に設定するのが正解のようです。なんでやねん、ってなりましたが、そうなのだから仕方がない。
で、ちゃんとSpineモデルにDynamic Boneが反映されるようになったのが↓です。Dynamic Boneの設定を何もいじっていないので、髪も胸も揺れまくっていて実に落ち着きがないですが、小一時間悩んだ後だったので、動いた時は感動しました…。
ちなみに、Dynamic Boneの各設定は↓のような感じのようです。
Dynamic Bone (コンポーネント) - VRchat 日本wiki
これを踏まえて、髪と胸の設定を調整してみました。
まずは髪。「Damping」を増やすと、ゆっくり揺れる感じになり、ちょうどいい感じでした。
次に胸。こちらは「Stiffness」を多めにして、あまりボーンが暴れないように設定しました。
上記の設定を行ったものがこちら。髪の毛の分割があれでも足りなかったのか、ちょっとカクついていますが、なかなか良い感じな気がします。
一応、ボーンの表示のないGameビューも。
Spine+Dynamic Boneには、けっこうな可能性があるような気がします!