SkirtSupporter

説明書

何ができるのか?

VRChat用アバターのスカートのDynamicBoneの設定を支援するツールです。

  • 足がスカートを突き抜けない

  • 椅子に座ってもスカートが安定

そんなスカートの作成をサポートします。

また、sittingモーションの設定を支援する機能もあります。

※DynamicBoneは別途購入が必要です。

前提のお話

まず、サポート対象となるのはHipsにつけるオーソドックスなスカートボーンタイプです。足につけるタイプなどは現在のところ対象外となります。

足がスカートを突き抜けないようにする手法として、こちらのInside型のDynamicBoneColliderを導入します。

Inside型DynamicBoneColliderを導入する条件として、スカートのDynamicBoneは根本の1点からではなく、それぞれの節から設定される形になるためDynamicBoneの数は自ずと多くなり、さらにそれぞれに対してDynamicBoneColliderが必要となるため、VRChatのパフォーマンスランクはPoorが避けられなくなります。


ちなみに、この図のアバターは私(ほけ)が愛用しているジョー太郎さん作のクラムちゃんです。今回の見本として使用させていただきます。

最初の設定

まず、こちらからSkirtSupporterのunitypackageをダウンロードしてください。

UnityのVRChatアバターのプロジェクトでインポートしたら、ProjectウィンドウにSkirtSupporterフォルダが追加されるので、その中のSkirtSupporterプレハブをSceneのどこかに配置してください。

最初に、Humaoidアバターの場合、AvatarAnimatorにアバターのルートオブジェクトをドラッグ&ドロップでセットしてください。すると、各ボーンに該当するオブジェクトがそれぞれ自動的にセットされます。

Humanoidアバター以外の場合、AvatarAnimatorに何もセットせず、各ボーンに相当するオブジェクトを個別にセットしてください。

HipsとUpperLegは必須で、LowerLegは後述するTwistCancelを使用する場合に必須ですが、使用しない場合は特に必須ではありません。

スカートボーンの登録

SkirtParentをセットすると、SkirtBonesに配下のGameObjectが自動的にセットされるはずです。(セットされない場合、エラーメッセージを確認してください)

SkirtParent配下で、Humanoidアバターの要素(SpineやUpperLegなど)以外のGameObjectが全て取得されています。もし、スカートボーン以外が取得されていれば削除してください。BoneObjectをDeleteキーで削除することで、項目自体を削除することができます。

再びSkirtBonesを自動設定させたい場合は、一度SkirtParentとSkirtBonesを全て削除した上で、SkirtParentを再設定します。

Angleは、正面を0としたときの右回りの角度です。真右なら90、後ろなら180、真左なら270となります。自動設定された値が明らかに正しくない場合は修正してください。細かく計測する必要はありません。大まかに以下の基準で問題ないでしょう。

  • 正面が0になっていない場合

  • 背面が180になっていない場合

  • 右足側が1~179の間になっていない場合

  • 左足側が181~359の間になっていない場合

SkirtHangについて

VRChatは椅子に座っているとお尻の角度でスカートがあらゆる方向に広がってしまいますが、この記事の方法を実装することによって、スカートが常に下向きに安定します。

SkirtHangにチェックを入れることによって、この実装を自動で行うことができます。

その際、アバターのボーン構成が変化します。Hipsの下にSkirtRootとSkirtBranchが追加され、その下にスカートのボーンが移動することに注意してください。

TwistCancelについて

こちらは、ヒヨさんが考案した「ねじり打ち消し機構」というもので、Inside型コライダーでスカートが足のねじれに追従してしまう欠点を解決したものです。こちらに解説書が公開されています。

【VRChat向け】ねじり打ち消し機構の解説書

足をねじる機会のあるフルトラの場合は特に設定推奨です。

設定すると、Hipsの下に「SubLegR/L」というGameObjectがセットされ、その下にコライダーが生成されます。

DynamicBoneResetについて

DynamicBoneResetにチェックを入れることによって、SkirtSupporterプレハブの中にあるDynamicBoneModelの内容でDynamicBoneを自動設定することができます。

逆に、既にスカートボーンに存在するDynamicBoneの設定を維持したい場合、このチェックは入れないでください。ただし、全てのボーンにDynamicBoneが既に存在していることが条件です。そのとき、Collidersのみ自動更新されます。

DynamicBoneModelの設定は自由に変更できます。揺れ方の設定内容まではサポートできませんが、Play実行しながら調整する方法をこのあと説明します。まだ設定内容がわからないうちは、デフォルトのままでもいいでしょう。

以上の設定が終えたら、「DynamicBone&Collider生成」ボタンで実行します。

(InnerObjectsの項目は変更不要です。)

アバターがプレハブ化されていて、SkirtHangを使用する場合、GameObjectの親子関係を移動するためにプレハブを解除する必要があります。「Prefabを解除しても問題ないですか?」というダイアログが出て、問題がなければOKを押してください。

メッセージ欄に「DynamicBone&Collider生成完了」と出れば完了です。

エラーについて

エラーが発生した場合、ダイアログが表示されます。

「〇〇〇をセットしてください」 …… 必須項目が未入力です。

「Angleに重複があります」 …… SkirtBonesの中に同じ角度が設定されています。Angleが正しく設定されていない可能性があります。もし、本当に同角度のボーンがある場合、1度だけずらして設定してください。

「DynamicBoneResetがオフの場合、すべてのSkirtBonesにDynamicBoneをアタッチしてください」 …… 設定後、すべてのボーンにDynamicBoneがセットされていることが必須です。手っ取り早いのはDynamicBoneResetにチェックを入れることです。しかし、現在の設定を崩したくない場合はDynamicBoneResetにチェックを入れず、すべてのボーンにDynamicBoneをアタッチし、不足のないようにしてください。

「設定箇所に他のDynamicBoneが影響しています」 …… 実行は成功していますが、このツールによって設定したDynamicBoneの他に、そのボーンに影響するDynamicBoneが残っているので注意してください。そのままにすると、DynamicBoneの影響が二重になります。

コライダーの調整

実行すれば一発で設定完了! とはいかなくて、ここからモデルごとの調整が必要になります。ただ、通常よりは楽なはずです。

まず、左右のUpperLegの下(※)に、次のような階層でGameObjectが追加されています。

  • 左右のDynamicBoneColliderを束ねる「DBC_R / L」

  • スカートボーンごとの「DBC_R / L_(スカートボーン名)」

  • プレハブ親の「DBC_Prefab」

  • DynamicBoneColliderの実体がある「DBC_actual」

この末端の、「DBC_actual」のみ調整します。上位のGameObjectはそのままにしておきましょう。

まずは複数ある「DBC_actual」のうちの、どれか1つを選びます。正面のボーンに対応するものがあれば、最も扱いやすいです。

(※)TwistCancelがオンの場合、UpperLegの下ではなく、Hipsの下に新しくできた「SubLegR/L」の2階層下にあります。

モデルによってスケールは様々なので、デフォルトではColliderがあらぬ方向、あらぬ大きさになっているかもしれません。それを図のような形に合わせます。

  • Colliderが足・胴体にかからないよう、なるべく足に沿わせる。

  • 腰から足先まで余裕を持たせた長さにする。

  • スカートがどんなに広がっても余裕で収まる大きさにする。いくらでも大きくして良い。(図よりもっと大きくてもよさそう)

Radius、Heightの形状をある程度整えたら、Sceneビューの移動機能を使ってTransformを移動させると良いです。(ただし、positionのxは0がいいです。)

Centerは変えても変えなくても問題ありません。

1つのボーンの設定が終わったら、DBC_Prefab(プレハブ親)を選択して、Inspector上部にあるOverrides -> Apply all を押してください。

すると、他のボーンにもその位置調整が反映されて、ある程度綺麗な形に整います。これはプレハブの更新ボタンなので、更新することで他の全てのプレハブに同じ設定を反映させることができるという寸法です。

ただ、正面と側面では足からスカートまでの距離が違うので、同じ設定では合わないかもしれません。それぞれのボーンでColliderが足・胴体にかからないよう微調整してください。基本的にはpositionのzを少し移動してあげるだけで良いと思います。

そのとき、Apply all は行わないでください。(押すと全てに反映されてしまいます)

揺れ方の調整

先述したとおり、DynamicBoneの揺れ方は各自で調整する必要がありますが、調整をサポートする機能があります。

DynamicBoneModelの中にParameterCopyというコンポーネントがついています。

この「DynamicBone設定コピー&ペースト」ボタンを押すと、DynamicBoneModelのDynamicBoneの設定が各スカートボーンに反映されます。UnityのPlayボタン実行中でも可能です。

Playボタン実行中だった場合、停止すると設定が元に戻ってしまいますが、そこで「停止後ペースト」ボタンを押してください。直前のコピー内容がDynamicBoneModelを含め全てに再反映されます。

DynamicBoneが足についてこない?

DynamicBoneを調整しているうちに、UnityEditorのPlaybackモードでDynamicBoneが足についてこなくなる場合があります。

これは、TwistCancelを使用している場合に発生します。

TwistCancelはDynamicBoneの二重構造になっていて、処理順が狂うとこの状況が起こります。

この状況は、Hipsについている2つのDynamicBoneを貼りなおすと修正できます。

コンポーネントの右上のメニューから、「Copy Component」でクリップボードにコピー ⇒ 「Remove Component」で削除 ⇒ 「Paste Component As New」でペースト

この3つの手順を、Hipsについている2つのDynamicBone それぞれに行ってください。

Sittingモーションの調整

椅子にSitした状態を確認してみましょう。

SkirtSupporterプレハブの下部にSittingAnimationSimulatorというコンポーネントがあります。

このAvatrAnimatorにアバターのルートオブジェクトをドラッグ&ドロップで設定してください。

SittingAnimationに同梱のSit用AnimationClipがセットされています。手持ちのものがなければこれを活用してください。図のようなスカートに適用させたモーションになります。

この状態でUnityをPlay実行すると、座り姿勢になります。

Sittingモーション調整の手引き

白い箱は椅子の高さ目安です。もし高さが合わない場合、ProjectウィンドウからSittingのAnimationClipを選択すると、Inspectorがこのようになり、Root Transform Position(Y)のOffsetを変えると高さが変わります。

Play実行中でもOKです。

モーションを変更したい場合、ProjectウィンドウからSit用AnimationClipを選択し、Window -> Animation -> Animation を開きます。

Play実行中でも修正できますが、このままだとアニメーションのループで小刻みに動き続けることになるので、いったん右側のフレームを削除しましょう。

これで、実際の動きを確認しながらモーションの調整ができるようになります。

ヒントとして、スカートを穿いたアバターの場合、腰を浮かせて関節の角度を浅くしておいたほうが破綻が少なくて良くなる傾向があります。

腰の部分はスカートで見えなくなるので、腰が浮いていることは案外気付きにくいです。

モーションの編集ができたら、右側のフレームにコピーしましょう。

ここまでくると、もはやツールは関係ないですが、SittingアニメーションのVRChat設定方法も説明しておきます。(意外と説明資料が少ないですね)

CustomStandingAnimsという項目にCustom_CustomOverrideEmptyというアセットがありますが、これを別名コピーして、その下のCustomSittingAnimsにセットしてください。

そのコピーしたアセットにIDLEという項目があるので、そこに編集したSittingのAnimationClipをセットしてください。

これでOKです。

もう一つ、「設定してみたらスカートがブルブル震える」という場合の対策をこちらに紹介しておきます。

https://twitter.com/hoke946/status/1258207368262742016

ひそかにうれしい特典

これは当初想定していなかった副産物ですが、このSittingAnimationSimulatorを生かした状態でVRChatのアバターアップロードをすると、sittingモーションでお写真を撮ることができます。

Tポーズよりも自然でいいですね。

最後に

モデルの構成は多種多様なので、中にはツールに適合できないケースがあるかもしれません。その場合はご容赦ください。

もし、こういう事例がダメだったよ、ということがありましたら、ほけ(@hoke946)までご連絡ください。可能な限り改善を検討します。

その他、ご要望などがありましたら、お気軽にご相談ください。

(おまけ)PDF書籍のご紹介

このツールの仕組みについて掘り下げたPDF書籍ができました。

「こうしてDynamicBoneはやさしくなった」

Boothで無料頒布しております。気になる方はお求めください。

ツールがよかった! という投げ銭代わりにもなっております。