今回はUnityのClothを使って、髪、鎧、マントの形状を変化させたいと思います。
UnityのClothについては
でやりました。
今回はそれを応用してみます。
Clothを使うと布だけでなく、髪も動かす事が出来ます。
髪、鎧、マントの作成
今回の機能を作成する前に、髪、鎧、マントの3DCGを用意する必要があります。
わたくしの場合はMakeHumanでキャラクターを作り、その時に設定した髪を使用しますが、キャラクターの髪のメッシュがキャラクターの体と別にしてあれば問題ありません。
鎧は腰の部分だけを適当に作りました。
マントは
の動画を参考にしつつ、初心者なりに作成しました・・・・(;一_一)
まぁ3DCGの出来栄えについてはスルーしてください。
髪、鎧、マントにClothコンポーネントを取り付けとEdit Constraintsの設定
キャラクターの腰のボーンの子要素に鎧、胸のボーンの子要素にマントを配置します。
キャラクターの髪のメッシュゲームオブジェクト、鎧、マントのAdd ComponentからPhysics→Clothを取り付けます。
マントはspine_03の子要素、鎧はspine_01の子要素に配置しました(ボーンの作り方、名前の設定によって変わります、ボーンの位置に合わせた子要素に設定します)。
↑のような感じで、鎧とマントを着せます。
Clothを設定すると一緒にSkinned Mesh Rendererコンポーネントも取り付けられるので、
髪、鎧、マントそれぞれのSkinned Mesh RendererのMeshにそれぞれのメッシュを指定します。
例えばマントであれば、
↑のようにマントのメッシュを設定します。
髪のEdit Constraints
Clothを設定したゲームオブジェクトには制限値を与え、動かない部分を作らないと自由に動き回ってしまいます。
そこで頂点を固定したい部分と動く部分に分け、動きの制限を加えていきます。
選択モードをSelectにすると、マウスのドラッグで範囲内の頂点を選択出来ます(Shiftキーを押しながら繰り返し選択も可能)。
Paintだと一つ一つ選択出来ます。
まずは髪の制限を加えます。
髪の頭皮に付いている部分をSelectで選択し、Max Distanceを0にします。
Max Distanceは布が動く最大距離を指定するものなので、0に設定するとその頂点部分は動かないようになります。
鎧のEdit Constraints
鎧の制限を加えます。
腰の部分の頂点を選択し、Max Distanceを0、鎧の下の頂点を選択し、Max Distanceを0.05に設定します。
すでに鎧と接触を判定するコライダの設定がされているので見づらいです・・・・。
マントのEdit Constraints
マントの制限を加えます。
マントのキャラクターに付いている部分の頂点を選択し、Max Distanceを0にします。
他の頂点は何も設定しないので、かなりヒラヒラ動くはずです。
髪、鎧、マントの頂点に設定するMax Distanceの値を少しづつ調整すれば少しづつ制限を変える事が出来ます。
例えばマントの場合、付いている肩の部分はMax Distanceを0にし、その下の頂点群は0.01、その下の頂点群は0.02としていけば、下の方にいけばいくほど動きが大きくなっていきます。
↑は上から0、0.01、0.02と少しづつMax Distanceの値を上げて設定しました。
鎧、マントの接触コライダの作成とClothに設定
鎧、マントと接触するコライダを作成し、接触した場合に鎧・マントの形状が変化するようにします。
鎧用のコライダの作成と設定
まずは鎧と接触するコライダを作成します。
鎧と接触する可能性があるのはキャラクターの足です。
そこでキャラクターの両足のボーンにCapsuleColliderを設定していきます。
わたくしのキャラクターの足のボーンの名前はthigh_lとthingh_rなのでそこにコライダを設定します。
↑のようにサイズと位置を調整し、Is Triggerにチェックを入れます。
ボーンのゲームオブジェクト自体にコライダを設定したので、コライダの位置を調整する時はコライダのCenterの値を調整します。
個別にTransformで調整したい時は、ボーンの子要素に空のゲームオブジェクトを作成し、そこにCapsule Colliderを設定し、位置を調整します。
こちらの方がシーンビューで位置調整や角度調整が出来るので細かい設定が可能です。
↑のようにコライダが設定されました。
鎧のインスペクタを表示し、ClothのCapsule CollidersのSizeを2とし、そこに両方の足に作成したコライダを設定します。
マント用のコライダの作成と設定
次にマント用のコライダを作成します。
spine_03という名前のボーン(胸の辺りのボーン)にCapsuleColliderを取り付け、Is Triggerにチェックを入れサイズ調整をします。
↑のようにコライダのサイズを調整しました。
マントは鎧との接触も考慮する必要があるので、鎧にCapsuleColliderを作成し、Is Triggerにチェックをします。
↑の円状のコライダがマントとの接触を判定するコライダです。
コライダの作成が終わったので、マントのClothのCapsule Collidersのサイズを2にし、今作成した上半身のコライダと鎧のコライダを設定します。
↑のように設定しました。
これでClothのコライダの設定が終わりました。
髪には特別に接触するコライダは設定しないようにしました。
裏側も描画させる
鎧やマントはペラペラのメッシュで厚みを作成していない為、裏側から見ると標準のシェーダ―スクリプトだと透けて見えてしまいます。
そこで裏側からカメラで写した時も描画するようにする為、独自にシェーダ―スクリプトを変更します。
詳しくは↑を参照してください。
アセットストアにもシェーダ―スクリプトがあるかもしれません。
髪、鎧、マントの動きを確認する
まずは髪、鎧、マントにClothが設定されていない時の動きを確認してみます。
↑のようにマントはただのゲームオブジェクトなので堅いものが付いている感じ、鎧部分は元の形状のまま変わらないので足にめり込んでいます。
次はClothを設定した状態です。
↑のように、髪が自然と動き、鎧は足の動きに合わせて動き、マントもヒラヒラと舞っています。
マント用の上半身のコライダの縦の長さが足りないので、一部マントが体にめり込んでいる時がありますが・・・。
Clothの設定を変更すれば重い布、軽い布の違いを出す事も出来そうですね。(^-^)