[Unity]エンジニアが揺れもの（髪、胸、服）を揺らすときに使った知識まとめ

はじめに
---
半年前とあるUnity案件で揺れものを設定していました
SpringBone　と　DynamicBone　を使い分けて 揺れもの（髪と胸と服）を揺らしていました
髪と胸はいい感じに揺れて３Dデザイナーに驚かれたのは今でも覚えています

その時備忘録として書いたマニュアルを発掘したのでニッチな情報になりますがQiitaに放流しておきます（だれかのの役にたてばいいな

使用するものは外部アセットです
・SpringBone
・DynamicBone
この２つの単語をみて「？」の方はまずどういうものなのか把握してから見るとわかりやすいと思います

なおこのマニュアルをつくったときは去年の9月でそれから内容をアップデートしていません
そこだけご注意ください

---

揺れ者設定マニュアル
---

目次

□それぞれの特性
SpringBone
DynamicBone

□Unityでの使い方
DynamicBone
SpringBone

□当たり判定の設定
DynamicBone
SpringBone

□設定欄の説明
DynamicBone
SpringBone
SpringManger

□揺らすうえで気を付けていること




□それぞれの特性
---
SpringBone
物に例えるとバネ
・重力に反発するレベルで元ある形状を残そうとする
・動くと揺れるがすぐ元の形状に戻ろうとする
・揺れ方はかため
→アホ毛や短髪（髪が垂れない長さ）に合う

DynamicBone
物に例えるとプリン
・ある程度重力を与えることができる
・元の形状を壊しやすい
・揺れるとゆっくり元の形状に戻ろうとする
・揺れ方は柔らかい
→長髪に合う　胸にもつかえる（というか胸ならこっちを強く勧める


□Unityでの使い方
---
DynamicBone
1.  	揺らしたいボーンを選択
2.  	ボーンにDynamicBoneを追加
3.  	DynamicBoneのRootに選択したボーンを追加

![uploading-0](https://i.imgur.com/TgiWOFD.png)
図.DynamicBoneの追加イメージ

SpringBone
1.揺らしたいボーンを選択
2.ボーンにSpringBoneを追加
3.SpringBoneのChildに揺らしたいボーンの１つ下の階層にあるボーンを追加
4.SpringManagerを追加（場所はどこでもいい）
5.SpringManagerのSpringBonesに2で追加したSpringBoneを追加

![uploading-0](https://i.imgur.com/Nt6Qb9Q.png)
図.SpringBone追加イメージ


当たり判定の設定
---
DynamicBone
1.新規オブジェクトを作成
2.DynamicBoneColliderを1に追加(下図を参照)
3.当たり判定を付与したいDynamicBoneに2を追加(下図を参照)

![uploading-0](https://i.imgur.com/AJYVZQi.png)
図.DynamicBoneColliderを追加

![uploading-0](https://i.imgur.com/vQxftba.png)
図.DynamicBoneにColliderを設定

SpringBone
1.新規オブジェクトを作成
2.SpringColliderを1に追加
3.当たり判定を付与したいSpringBoneに2を追加


設定欄の説明
---
DynamicBone
--初期設定---
Root : 揺れ先
UpdateRate :  毎秒何回処理するか ※増やすと動きが滑らかになるが処理が重くなる
UpdateMode : 更新タイミング
---揺れ方の設定---
Damping : 減衰  増やすほど空気抵抗が上がりすぐに揺れなくなる
DampingDistrib : 反映の配分を設定
Elasticity : 伸縮性 増やすと伸びやすくなる 結果、躍動感が出る
ElasticityDistrib : 反映の配分を設定
Stiffness : 硬さ 増やすと硬くなると思いきや柔らかくなる
StiffnessDistrib : 反映の配分を設定
Inert : 物理演算を無視して反映される変化量　増やすほど物理演算を無視した動きになっていく
InertDistrib : 反映の配分を設定
Radius : 当たり判定の半径
RadiusDistrib : 反映の配分を設定
EndLength : 0以外にすると設定しているボーンの最下層に入れた数字分のボーンを追加する（使ったことがないので良くわからない）
EndOffset : 揺れに設定した数値分を更に付加する タイミングは動いたときに付与
Gravity : 揺れに設定した数値分を更に付加する タイミングは常に付与
Force : 常に設定した数値分を付与する　強制的に変えるのでGravityとは別の力のかかり方をする
---当たり判定の設定---
Colliders : 当たり判定先を読み込む場所
Exclusion : 読み込んだ先はこの揺れ演算に反映させない
FreezeAxis : 設定した方向には揺れなくなる
DostandDisable :カメラやプレーヤーから遠い場合、物理シミュレーションを自動的に無効にするかどうか
ReferenceObject : 謎　よくわからなかったです
DistantToObject : オブジェクトの距離を変更　当たり判定の場所が変わる　初期値でOK

![uploading-0](https://i.imgur.com/hHsx8z4.png)
図.DynamicBoneの設定欄

SpringBone
---
---初期設定---
Child : 現在の子オブジェクトを読み込む
BoneAxis : 揺れる方向　設定している方向に揺れやすい
Radius : 当たり判定の半径
IsUseEachBoneForceSettings : チェックを入れるとSpringBone本体の揺れ設定を使う　
チェックを外すとSpringManagerの揺れ設定を使う
---揺れ方の設定---
StiffnessForce : 柔らかさ(少なくするほど揺れた際に原型の形に戻りにくくなる)
DragForce : 力の減衰力(増やすと空気抵抗が増える)
SpringForce : 何かの向き 初期値でいい　良くわからない
---当たり判定---
Colliders : 当たり判定を読み込む
Debug : チェックを入れるとエディター画面に当たり判定を表示
---その他---
Threshold : ManagerのDynamicRatioが有効になる最低値

![uploading-0](https://i.imgur.com/aHHKzOp.png)
図.SpringBoneの設定欄


SpringManger
---
---初期設定---
DynamicRatio : 最後に揺れる量に掛け算をする　揺れる力が100だとしてDynamicRatioが0.5だったら50になる
---揺れ方---
StiffnessForce : 柔らかさ
StiffnessCurve : 反映の配分を設定
DragForce : 力の減衰力
DragCurve : 反映の配分を設定
---その他---
SpringBones : SpringBoneを読み込む
SkipFrame : 開始時に何フレーム処理をしないか 初期値で良い

![uploading-0](https://i.imgur.com/P9e9DHx.png)
図.SpringManagerの設定欄




揺らすうえで気を付けていること
---
・長髪などでツリー上にボーンがある場合
→上から下に影響していくので上と下の部分が同じ設定だと下は上に比べてものすごく揺れる
対策：反発係数や摩擦の数値を下側に多めにかけると直りやすい
イメージは根元はよく揺れ左記になるほど揺れにくくなる
・ジャンプモーションなどで急に姿勢が変わる場合に髪はゆっくりとその姿勢を追いかけたい場合
→DynamicBoneを使用
・当たり判定が貫通する
対策：DynamicBoneのExclusion を利用する　または当たり判定側に揺れないようにする　またはUpdateFrameの数値を上げる