UnityのClothでキャラクターのスカート設定するツールの紹介とか

この記事は[VRChat Advent Calendar 2020](https://adventar.org/calendars/5102)の17日目の記事です。ツールとそれが何をしているか、それからMax Distanceの設定パターンを少し紹介[^ref4]します。

[^ref4]: Unity拡張の実装上の細かいところは書いていません。調べればたくさん出てきますので。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/0d5243fe-68a5-4e6f-3031-a3386b5f828d.png)

VRChat向けに作ったツールなので、Unity 2018.4.20f1を前提としています。VRChat自体には依存していないので他にも使えるはずです。たぶん。

# きっかけ
先日、[こんな記事](https://qiita.com/esnya/items/8f5020d350f63b8d262a)[^ref1]を書きました。これを読めばClothコンポーネントの仕組みは完全に理解できたはずです。理解したら使ってみたいですね。しかし。

* じゃあ具体的にどうすればいいの？
* 計算したくない。
* パラメーター多すぎ。
* 標準のエディタ使いにくい。

色々と問題があります。とりあえず動くようになると嬉しい人も多そうです。そして何より、自分が楽をしたいですね。そんなときUnityでは**C#を書きます**[^ref3]。

そうしてできたものが[こちら](https://github.com/esnya/UnityClothSkirtHelper)になります。マニュアルも用意した[Booth版（有料）](https://esnya.booth.pm/items/2313417)もあります。

[^ref1]: 煽りタイトルですが、本当に書いてないのであながち間違いではないのです。
[^ref3]: ちなみにBlenderならPythonです。大体なんでもできます。楽しいですね。

# ツールができること
手作業でやっていたことを自動化するツールになります。いつも何をやっているかを整理して4種類の機能を作りました。

1. コライダー設定
1. Max Distanceの設定
1. その他パラメーター調整
1. よくあるミスを防ぐ

### 1. コライダー設定
Humanoidの各関節にSphere Colliderを追加し、2個組でClothコンポーネントに設定していく作業です。スカートであればHipsと左右のUpper Leg、Lower Legで4組5個、ロングスカートになればFootも増えて6組7個になるので何度も設定するのはそれなりの手間です。

ボーンは[`Animator.GetBoneTransform`](https://docs.unity3d.com/2018.4/Documentation/ScriptReference/Animator.GetBoneTransform.html)からすぐ取れるので、Sphere Colliderがなければ追加し、あればそれを参照するだけです。CenterやRadiusはアバター毎に調整することになるので自動化は見送りました。

Advanced Modeで細かくいじれるようにしました[^ref5]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/d4da5f84-38ec-0711-8dd0-f0d77be89462.png)

[^ref5]: このひどいUIをなんとかしてくれ！

### 2. Max Distanceの設定
Clothといえば出てくるこれは最も自動化したいところでした。編集UIの扱いづらさは言うまでもなく、どんな値を入れていいのかわからないということも多いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/e3329fe8-2c3f-1011-022a-a17e6d662e61.png)

Max Distanceは頂点が動ける範囲を指定します。その最も重要な役割[^ref11]は布のどこかを**固定する**[^ref6]ことです。固定するということは頂点の動ける距離を0にすることになるので、Max Distanceを0にする部分を作ります。ツールではメッシュ上端[^ref7]からある程度[^ref8]下までを固定しています。

また、頂点が動く範囲を制限して制御しやすくすることもできます[^ref9]。とはいえ、ただいたずらに設定してもコライダーの動きについていけずに貫通したりします。そこで2パターンの算出方法を用意してみました。

#### 2.1 Spreading Constraint
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/52180f9d-4706-13dd-7ecf-b9838403bba5.png)

スカートの広がりをもとに算出する方法です。スカートが捲れ上がったときにHipsのコライダーを乗り越えてしまうタイプの破綻を防ぐことを意図しています。Advanced Modeでないときはこれが適用されるようにしました。脚のボーンに**ウェイトが載っていない**場合にうまく作用します。

![0000-0075.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/b25ba6e1-6d94-9881-858f-020086ee0d06.gif) 

例えば80度までしか広がれないようにすれば、上のGIF画像[^ref10]のような破綻を下のGIF画像のように防ぐことができます。

![0075-0115.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/7525c60b-1ef8-044d-e1bd-2b7a1e9bcc70.gif)

#### 2.2 Inside Constraint
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/60cc8c04-a4df-960d-5e4a-83c59083294b.png)

足のコライダーへの食い込み距離を基準として制限し、コライダーを突き抜けないように設定します。脚のボーンに**ウェイトが載っている**場合にうまく作用するはずですが、あまり広がらなくなります。実はあまり使っていません。

[^ref6]: 固定してなければどこまでも落ちていきます。Colliderがあっても大抵はずるっとすり抜けて落ちていきます。
[^ref7]: 最初はHipsボーンでしたが、アバター、衣装で差がありすぎるので変更しました。
[^ref8]: 衣装に合わせて調整するように説明書に書きましたが、~~誰も読んでいないようです~~。
[^ref9]: 勘違いされがちですが、Max Dixtanceの範囲は0～1では**ありません**。0～∞の範囲で適切な値を導出しなければなりません。
[^ref10]: GIF画像はイメージとしてBlenderで簡単に作ったものです。
[^ref11]: 最近セットアップするアバターはこれだけで済ませています。

### 3. その他のパラメータ調整
デフォルト値はあまりにイケていないので適当な値を入れてあげます。ツールでは破綻しにくい、制御しやすいパラメーターを入れるようにしました。Inspectorからの入力自体の手間は少ないので、こだわる人は自分で好みの値を入れてくれるはずです。

### 4. よくあるミスを防ぐ
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575392/ae25f5d5-6ced-1133-a95f-70b0ff9eecb7.png)

わかりにくいハマりどころを潰したいのと、実装を簡単にするためのエラー表示機能です。

#### 4.1 頂点数チェック
頂点数が増えると計算負荷が増えます。ツールを使った影響で重たいアバターが増えて欲しくはないので、上限を設けました。ただ単に頂点数を数えているだけです。

#### 4.2 Transformチェック
Clothコンポーネントとそれに設定されたTransformが初期値でないと意図しない挙動が起きたりします。特にScaleはすべてのパラメーターに影響を与えるので1であるべきです[^ref12]。TransformやRotationはエディタがうまく動かない原因になったりします。

[^ref12]: ArmatureからRoot BoneまでのScaleも影響しているようです。今後のアップデートで対応を検討しています。

# おわりに
「いかがでしたか？」と特に主張したいことはありませんが、Clothを使いたい人に少しでも参考にしてもらえれば幸いです。

ツールはまだまだ完成ではなく、今後もアップデート[^ref13]を続けていく予定です。
「使った」報告やバグ報告はどこからでも歓迎です。これら[^ref14]が開発の原動力になります。

[^ref13]: 新機能はひっそりと[オープンソース版](https://github.com/esnya/UnityClothSkirtHelper)に追加されていたりします。
[^ref14]: とBoothの売上ももちろん。