JointのBreakForceでキュゥべえの首をもげ

2012年1月7日に行われた第3回 UnityのためのCGとか勉強会@Moyashipanが発表した内容です。

デモ

マリオ64の起動画面でマリオの顔をいじれるのがありましたよね。
ああいうカーソル操作でキャラクターをいじれるコンテンツを作りました。

デモ: キュゥべえもぎもぎ

要FlashPlayer11です(Unity3.5DeveloperPreviewのFlash書き出しを利用しているため)

制作期間

夜にコツコツと進めて、モデルを作るのに3日ぐらい、作り方を調べて操作部分を作るのに1日ぐらいかかりました。

制作手順

モデルを作ります

リグを仕込みます

Unityにモデルを読み込みます

クリッカブルエリアとなるCapsule(CapsuleCollider)を、モデルとだいたい同じ位置・サイズに設置します。
(ずっとコリダーと読んでいたのですが正しくはコライダーなんですね @shinriyoさんありがとうございます)


説明を簡便に済ますために今回はBodyとHeadのみColliderを設置しました。
(Bodyはめり込んでてわかりにくいですが、見やすいように赤いMaterialを設定してあります。)

Play時にCapsuleが落下してしまわないように、とりあえずUse Gravityをoffにしておきます。

GameObject>Create Emptyで空のGameObjectを作成し、モデルとCapsuleをその中に含めます。

そのGameObjectにRagdoll ゾンビを動かす | Unity | M3 creatorで紹介されているコンポーネントを追加します。
(「unity ragdoll drag」でググると同様のエントリが見つかります)

Playしてみると、ドラッグで各Capsuleを個別にドラッグできるようになりました。

このままだとBodyとHeadがつながっていない状態になってしまうので、Jointが登場します。

HeadにFixedJointを追加して、Fixed Joint>Connected BodyにBodyを指定します。

FixedJointを設定すると、まるで親子関係になっているかのように2つのColliderを連結することができます。

Playしてみると、ドラッグ時にもう片方のColliderがついてくるようになりました。連結されてますね。

ただしこの状態だとドラッグするたびに全体があちこちに移動してしまうので、BodyはIs KinematicをONにしておきましょう。
これで頭だけをグイグイ引っ張れるようになりました。

ここまででColliderによるドラッグ時の操作が用意できたので、そこにモデルのArmatureを紐付けましょう。
(今回動くのは頭だけなので、HeadのみでOKです)


あくまでも座標の集まりではなく、各ArmatureをColliderの子にします。

Playしてみると...やったね!ドラッグでモデルが動くよ!

(もうColliderを目立たせる必要がないのでMeshRendererを非表示にしました)

ただしこのままだとタイトルにあるように首をもぐ事はできません。
そこで設定すべきなのがJointのBreakForceです。
Infinityになっている部分を数値に変更して調整します。

Playしてみると...そぉい!もげた!

最後にHeadのUse Gravityをonに戻せば、もいだ後に落下する首の完成です。

Jointには他にも種類があるので、各部位にあわせたものを選んで、同じように設定するといいですね。

まとめ

Colliderをドラッグするコードを追加して、Jointでつないで、もぎたいならBreak Forceを設定する。

今回はColliderを作ってからモデルのArmatureを子にするという方法をとりましたが、モデルのArmatureに対してColliderを設定する方法でもやりたいことは実現できると思います。

自分が作ったモデルで手っ取り早く「触れる」コンテンツを作りたい場合には良い方法だと思いますので、
みなさんも先輩魔法少女の首がもぎちぎられたり、友人のソウルジェムをもぎ捨てたりするコンテンツ作成にご活用ください。



それではごきげんよう