orangegirl’s blog

Unityを使用していて気付いた点などのメモ帳

Unityの人気アセット「Dynamic Bone」をSpineのモデルに適用してみる

Unityアセットストアで人気のアセットに「Dynamic Bone」があります。

https://www.assetstore.unity3d.com/#!/content/16743

女性の胸や長い髪(ポニーテールとか)、動物の尻尾などの、いわゆる「揺れもの」の挙動を簡単に実装できるアセットです。 

基本的には3Dモデルを動かすのを主目的としたアセットなのですが、Spine公式の海外フォーラムを見ていた時に、気になるスレッドを見つけました。

http://ja.esotericsoftware.com/forum/Dynamic-Bones-8392?p=38501

 

 要約すると、「SpineのモデルにDynamic Boneを適用したいんだけど、うまくいかないんだ」「うーん、俺もなんだよね…あ、わかった!こういうコツがあったんだよ」「なるほどね!」みたいな内容のスレッドです。

考えてみると、Spineのモデルは、板ポリのメッシュにボーンとウェイトを設定して動かしているようなものなので、Dynamic Boneも動きそうです。

機会があれば試したいな…と思っていたところ、「Unity AssetStoreまとめ」さんのイベントでアセットストアのバウチャーを25$も頂いたので、早速購入し、実験してみました!(汗人柱さん、ありがとうございました!)

 

というわけで、サクッとキャラの絵を描いて、Spineでセットアップします。

Dynamic Boneの公式動画では女性の胸と尻尾が動いているので、それをほんのり踏襲して、胸とツインテールの髪が動く感じをイメージしてみました。

f:id:orange__girl:20180116223652p:plain

作画は超適当ですが、髪と胸は細かく分割しておきます。なお、胸に割り当てているボーンは、左右3本ずつのボーンです。 

f:id:orange__girl:20180116223935p:plain f:id:orange__girl:20180116223947p:plain

SpineモデルをエクスポートしてUnityに読み込んだら、シーンにSkeleton Animationとして配置します。その際、Skeleton Utilityがアタッチされていなければ、アタッチします。

f:id:orange__girl:20180116224236g:plain

Skeleton Utilityを使うと、通常はUnity上では非表示の、Spineで設定したボーンをヒエラルキーで表示&各種設定することができます。「Spawn Hierarchy」から、ここではひとまず「Follow」を選択し、ボーンを表示させます。

f:id:orange__girl:20180116224442g:plain

 ヒエラルキーに表示したボーンを選択すると、「Skeleton Utility Bone」がアタッチされています。枠をつけたところを説明しますと、「Mode」は「Follow」と「Override」の2つがあります。

ざっくり言うと「Follow」はSpineで設定したアニメを再生するモードで、「Override」はUnity側で挙動をあれこれ上書きするためのモードです。「Override Alpha」は、最大の1にすると完全にSpineのアニメを無視し、0に近づくにつれて「Follow」同様にSpineのアニメを再生するようになります。

f:id:orange__girl:20180116224905p:plain

というわけで、Dynamic Boneで動かしたいパーツは「Override」にする必要があります。「Override」にするとヒエラルキーのアイコンが変わります。左右の髪と、左右の胸を「Override」に設定しました。

f:id:orange__girl:20180116225537p:plain

次に、Dynamic Boneのスクリプトをアタッチします。このスクリプトはモデルのRootに配置することもできますが、剛性などの設定を各パーツで分ける観点から、動かしたいパーツの根元ごとに設定するのが無難かなと思います。このキャラでいうと、「SideHair_L」「SideHair_R」「Mune_L」「Mune_R」の4箇所ですね。アタッチしたら、スクリプトの「Root」欄にそのボーンをセットします。

f:id:orange__girl:20180116225943p:plain

Dynamic Bone自体を動かすには、設定はこれだけでも大丈夫です。ここで一旦、動かしてみましょう。なお、キャラクターにはごくごく簡単な、RigidBodyのVelocityで左右移動とジャンプするスクリプトを設定しています。

f:id:orange__girl:20180116230659g:plain

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よりも上(マイナス側)に設定し、「あれ…動かないぞ…?」と小一時間ほど悩みました。

docs.unity3d.com

 実はこれ、「Script Execution Order」でDynamic BoneをDefault Timeよりも下(プラス側)に設定するのが正解のようです。なんでやねん、ってなりましたが、そうなのだから仕方がない。

f:id:orange__girl:20180116231632p:plain

で、ちゃんとSpineモデルにDynamic Boneが反映されるようになったのが↓です。Dynamic Boneの設定を何もいじっていないので、髪も胸も揺れまくっていて実に落ち着きがないですが、小一時間悩んだ後だったので、動いた時は感動しました…。

f:id:orange__girl:20180116231803g:plain

ちなみに、Dynamic Boneの各設定は↓のような感じのようです。

Dynamic Bone (コンポーネント) - VRchat 日本wiki

 

これを踏まえて、髪と胸の設定を調整してみました。

まずは髪。「Damping」を増やすと、ゆっくり揺れる感じになり、ちょうどいい感じでした。

f:id:orange__girl:20180116232246p:plain

次に胸。こちらは「Stiffness」を多めにして、あまりボーンが暴れないように設定しました。

f:id:orange__girl:20180116232236p:plain

上記の設定を行ったものがこちら。髪の毛の分割があれでも足りなかったのか、ちょっとカクついていますが、なかなか良い感じな気がします。

f:id:orange__girl:20180116232445g:plain

一応、ボーンの表示のないGameビューも。

Spine+Dynamic Boneには、けっこうな可能性があるような気がします!

f:id:orange__girl:20180116232647g:plain