[VRChat]ふわっとしたスカートで座っても安心のDynamicBone吊りスカート

#概要
先日のバーチャルマーケット２で初めてアバターを購入しました。
ジョー太郎さんの[クラムちゃん](https://jotaro13.booth.pm/items/1264241)です。めちゃんこかわいい。
![VRChat_1920x1080_2019-03-10_15-39-31.142.png](https://qiita-image-store.s3.amazonaws.com/0/275693/699036a1-058b-0a92-4496-dae450343337.png)
だけど、ふわっとしたスカートなのでVRChatだと椅子に座ったとき（Sitしたとき）に荒ぶってしまう！
これはこのアバターが悪いのではなくて、
おそらく、ふわっとスカート持ちの方に共通する悩みではないかと思います。
どうにかできないかを考えてみました。

タイトルにもある通り、この手法では[DynamicBone](https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743)を使用します。
スカートにもDynamicBoneが使用されていることを前提として話をします。

#デフォルトのSitモーションを変更する
まず前段の話ですが、座り姿勢のモーションを変更します。
[こちらの記事](https://seesaawiki.jp/vrchat_kemonoclub/d/%BF%C8%C4%B9%A4%AC%C4%E3%A4%A4%A5%A2%A5%D0%A5%BF%A1%BC%A4%C0%A4%C8%B0%D8%BB%D2%A4%CE%C3%E6%A4%CB%A4%E1%A4%EA%A4%B3%A4%E0%A4%F3%A4%C0%A4%B1%A4%C9)が参考になると思います。

※下部に追記あり


#コライダーを足の周囲のInside型にして突き抜け防止
前段その２、DynamicBoneのコライダーを足のOutside型ではなく、足の周囲のInside型にします。
初めて聞くとなんのこっちゃ？　という話ですが、これをしないと足がスカートを突き抜ける可能性が高くなります。
詳しくは[こちらの記事](http://yananann.hatenadiary.jp/entry/2018/11/17/195631)で解説されています。

※下部に追記あり


#ここまでやれば、うまくいくかな？
これでおそらく座り方は万全！
ということで、VRChatで試してみると……
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">※音が出ます※<br>夫婦の寸劇的な何かです。<br><br>夫が <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%882?src=hash&amp;ref_src=twsrc%5Etfw">#バーチャルマーケット2</a> を機に、自分でアバターを購入して自分で色変えて初めてアバターアップロードしていました(クラムちゃん <a href="https://t.co/NtfLFPKKSA">https://t.co/NtfLFPKKSA</a>)<br>タチバナくん(<a href="https://t.co/7qD3xcXiFX">https://t.co/7qD3xcXiFX</a>)との身長差が良い👌 <a href="https://t.co/TG6zJOeQqt">pic.twitter.com/TG6zJOeQqt</a></p>&mdash; 三十個(みそこ) (@0ne_chan) <a href="https://twitter.com/0ne_chan/status/1104781769327271936?ref_src=twsrc%5Etfw">2019年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
こんな感じで、体の向きによってスカートがふわふわ暴れて中身がコンニチワしそうになります。

この原因、最初は上記のInsideコライダーの設定がうまくいっていないのかな……
実はSitしたとき足の付け根も回転してコライダーが暴れているのでは……
などと思ったのですが、
問題はコライダーではなく、スカートがHipsボーンにくっついているために、Hipsの回転と一緒にスカートまで回転してしまうことでした。

VRChatでSitしたとき、足の付け根から先までは設定したモーションで固定されますが、Hipsから上は体の動きに合わせて回転したりします。
Hipsに直接ついているスカートはその動きをダイレクトに受けることになります。

#解決のカギはスカートを水平に保つこと
解決方法として、重力を入れてスカートを落としてしまうことも考えられますが、
重力を入れてしまうと、通常のふわっと感が損なわれてしまう恐れがあるので避けたいところ。

そもそも、実際には座ったときにいくら腰やお尻をくねらせてもスカートはくねらないでほぼ水平を維持して欲しいものです。

つまり、スカートのボーンをまとめて、地面から常に水平になるようなGameObjectにくっつけられれば、解決できそうです。

#水平を保つGameObjectをDynamicBoneで作り、スカートをぶら下げる
地面から水平を保つGameObjectなんてスクリプトを組めれば一瞬なんですが、VRChatのアバターにはスクリプトを組み込めないので、DynamicBoneを使用します。

イメージとしては、スカートを紐で吊るす感じ。
紐を手に持って手首を回転させても、紐は重力でまっすぐ下がり、スカートは傾いたりしないような、そんなイメージです。

##親子関係を構成
まず、以下のようにGameObjectの親子関係を構成させます。
変更する前の状態はバックアップしておいてください。
![img1.png](https://qiita-image-store.s3.amazonaws.com/0/275693/25d09b01-a10a-333a-981e-4f133818afe5.png)
1. 吊り元の空GameObjectをHipsの下に作成する。ここではSkirtRootとする。PositionはHipsと同位置(0,0,0)で良い。
2. 吊り先の空GameObjectをSkirtRootの下に作成する。ここではSkirtBranchとする。Positionはほんの微量だけSkirtRootより下にする。(同位置だとうまくいかない)
3. スカートのボーンをドラッグ＆ドロップでSkirtBranchの下に移動する。

たまに親子関係を変更するとボーン構成が外れることがあるみたいなので、ここで動作がおかしくなっていないかを実行して確認してみましょう。

##DynamicBoneを設定する
DynamicBoneをSkirtRootにアタッチします。設定は以下のとおり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/80a1542b-597b-bd53-7402-a49669fffcc8.png)
Root：SkirtRootをセットする。
Damping、Elasticity、Stiffness：すべて0にする。
Gravity、Force：yのマイナス方向に力を働かせる。(2019/3/22修正)
Exclusions：作用させるべきはSkirtBranchのみのため、その先のスカートのボーンをすべて除外設定する。

#できあがり！
これで、立って走ったときも問題なく、座ったときも荒ぶらないスカートが完成しました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この動画(<a href="https://t.co/hn1K9nlVAu">https://t.co/hn1K9nlVAu</a>)みたいに座ったときにあらぶってたうちのクラムちゃんのスカートがだいぶよくなってきた。多少太もも出てくるけど、くねくね動いても大丈夫。走っても大丈夫。かわいいかわいい。 <a href="https://t.co/FcoU6rUGrL">pic.twitter.com/FcoU6rUGrL</a></p>&mdash; ほけ (@hoke946) <a href="https://twitter.com/hoke946/status/1105145273347530752?ref_src=twsrc%5Etfw">2019年3月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

太ももがスカートを突き抜ける問題がやや残っていますが、これはまた別の調整の問題でしょう。
安心して椅子に座ることができますね。

#（2019/4/27追記）追加情報
上部に挙げているSitモーション編集とInside型コライダーの設定は、
あくまで私が当時行っていたことに過ぎず、皆さんがなぞる必要はありません。
ただ、何もしなければ座ったときに足がスカートを突き抜けるのみなので、次のいずれかは行うべきかと思います。

###Inside型コライダーを設定する
今回、私が行っていた方法です。
最低でも前側のスカートのボーンはInsideコライダーのDynamicBoneを仕込んでください。
また、そのDynamicBoneのStiffnessは低めにしないと、スカートがブルブルするかもしれません。

###Sitモーションにスカートの曲がりを設定する（オススメ）
SitモーションにスカートのボーンのRotation値を設定しておくのも有効です。
こんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275693/620df0b5-cfdb-ecb1-d57b-f39804c2e5a4.png)
こうやってボーンの曲がりを作っておけば、コライダーに頼らずともスカートを安定させることが可能です。
物理法則に従う必要がなく、長丈にも対応できるので、こちらの方が比較的導入しやすくてオススメです。

設定するときはAnimationウィンドウの「●」ボタンを押して、対象のボーンを直接回転させるなどすれば良いですが、
そのときはDynamicBoneを非アクティブにしておかないと動かないですし、
そこからDynamicBoneをアクティブに戻したときにはその影響を受けることになるので、注意が必要です。

#(2019/7/27追記)支援ツール作りました！
Inside型コライダー作成、Sitモーション作成、そしてこのDynamicBone吊りスカートの設定を支援するツール「SkirtSupporter」を作成しました。
[詳しくはこちら](https://sites.google.com/view/skirtsup)