本記事では、「PuppetMaster」というアセットの使い方を綴ります。
私自身、まだまだ完璧に使いこなしているわけではありませんが、
①ラグドール、②キャラクター掴み、③Prop(道具)掴み
という機能を応用して、実際にゲームも開発できたので、
それら3つのやり方を紹介したいと思います。
この記事では、次の動画で示す挙動の方法を説明します↓
ちなみに、Unity 2019.4.7f1で動作を確認してます。
1.アセット「PuppetMaster」とは
「PuppetMaster」とは、端的に言うと、
3Dモデルは通常アニメーションデータのようにしか動きませんが、
このアセットを適用すれば、
オブジェクトに衝突したときなど、
その影響が3Dモデルの動きに物理挙動的に反映させることができるのです。
実際には、それだけでなく、もっと色々な機能もあります。
例えば、他のキャラクターやオブジェクトを掴んだりする機能も加えることができます。
ただし、有料アセットで、価格はそれなりにしますが、
アセットの機能を上手く使うことができれば、
価格相応 もしくは、それ以上の価値があります。
これらの機能を自力で実装するには、
プロフェッショナルなスキルと労力が必要です。
※ちなみに、アセット開発者は、かの有名な「Final IK」も手掛けており、両アセットの相性も良い
さて、一体どんな感じのアセットなのか?
開発者のYouTubeをみると、アセットの各機能の実装方法が公開されています↓
英語の説明でよくわからん!という人は
日本語で分かりやすく紹介されている「UnityAssetStoreまとめ」の記事を参考にすると大まかな事はわかるでしょうね^^;
それらを見てもわからん!てなった方は、
以下に記載する内容が助けになるかもしれません。
2.3Dモデルにぐにゃらせ(ラグドール)を適用
PuppetMasterの各種機能を使う上で、初めの処理として、
各関節とそれに付随するメッシュが、
ぐにゃることができる状態(ラグドール)にする必要があります。
まず、シーンに3Dモデルを配置します。
ここでは例として
無料3Dモデルアセットの"Golem"を使います!
(無料のクオリティではない(@@;))
これをインポートしたら、「Prefabs」フォルダにある中の「PBR_Golem」を適当にCubeで地面を作っておいたシーンに配置します。
そのモデルには「Animator」しかもっていないので
「Rigidbody」と「Capsule Collider」をアタッチします。
実行すれば、地面に接地し、アニメーションします。
ここから、PuppetMasterを使います。
「PBR_Golem」のコンポーネントとして、「Biped Ragdoll Creator」をアタッチし、「Create a Ragdoll」をクリックします。
すると、「Options」が出てくるので、それも「Done」をクリック。
※すっ飛ばしてきましたが、
細かく調整したい方は自由にいじって下さい^^
「Biped~」のコンポーネントがなくなりますので、
次に「Puppet Master」のコンポーネントを追加します。
その中の「Set Up PuppetMaster」をクリックで、処理は終了です!
すると、画像のように「Puppet Master」コンポーネントが変わります。
(緑になっているのは、私のゲーム実行中の仕様です^^;)
この処理だけを施した3Dモデルをゲームに使うだけで、
リアルタイムに物理的な接触を表現してくれるキャラクターができ上がります。
強いて言うなら、扱いたいパラメーターは、
「Pin Weight」と「Muscle Weight」でしょうか。
「Pin Weight」を0にすると、死体のように安定性がなくなり、倒れます。いわゆるラグドール。
「Muscle Weight」はアニメーションで動くボーンとメッシュとの関係性のようで、0に近いほど、メッシュがプルプル振動するようになります。
これらをゲーム内のスクリプトなどで制御すると、
よりリアルな挙動を示すゲームができるでしょう。
3.モノ・キャラクターをくっつける(掴む)
Puppet Masterの「Puppet Grabber.cs」を用いれば、
「2.」でラグドール化しているキャラクターをくっつけることができます。
今、Golemに「Puppet Master」を適用されているので、このGolemを何かにくっつけることが可能ということです。
ここでは、適当なCubeで試してみましょう。
画像のように、くっつける側としてのCubeに
「Puppet Grabber」コンポーネントをアタッチします。
次に掴まれる側は、Puppet Masterが適用された3Dモデルであること。
その子オブジェクトの「PuppetMaster」に
「BehaviorPuppet」というコンポーネントを追加します。
これで出来上がりです。
早速、実行してみましょう!
くっつける側(Cube)の「Puppet Grabber」の「掴み可能フラグ」にチェックを入れた状態で、掴まれる側(3Dモデル)に触れると、くっつかせることができます。
離す場合は、「掴んでるかどうか」のチェックを外せばOK。
3Dモデルの手オブジェクトに「Puppet Grabber」をつけると、相手を掴むアクションを実装することもできます。
さらにCubeにくっつけて、2つの3Dモデルを吊り下げることも可能です。
さて、お気づきかと思いますが、
この掴み機能「Puppet Grabber」では
「Puppet Master」が適用された(ボーンの仕込まれた)3Dモデルしか「くっつける・掴む」ことができません。
つまり、ただの小道具や武器などのオブジェクトを3Dモデルが掴むことはできません。
武器を取得して、掴んで振り回せたら、最高ですよね!
そこで、本アセットにある「PropMuscle」といった機能を使います。
4.Prop(道具・武器など)を取得する
「2.」でラグドール化したキャラクター(Puppet Masterの処理を行ったモデル)を準備します。
まず、Propを取得した際、身体のどこでどのように所持するか、を設定します。
例えば、左手で持ちたいならば、
PuppetMaster配下の「LeftHand(左手の平)」オブジェクトを
「PuppetMaster」オブジェクトのPropMuscleというボックスにもっていき、「Add Prop Muscle」をクリックします。
これにより、取得したPropをPinするオブジェクト(Prop固定用オブジェクト)が生成されますので、
その「Prop固定用オブジェクト」の位置・方向をお好みに調整します。
詳細はアセット開発者がその紹介動画を上げてます^^↓
Propオブジェクトの作成方法について、動画の内容をまとめると…
長方形の棒状のProp作成
①空のゲームオブジェクト「Prop」を作成、その配下に空のゲームオブジェクト「Mesh Root」を作成
②「MeshRoot」の配下に「Cube」を作成
③その「Cube」を複製したものを「Collider」と命名し、「Prop」の配下に入れて、MeshRendererコンポーネントは削除
④「Cube」はMeshRendererの役目だけなので、そのBox Colliderコンポーネントは削除
⑤「Prop」にPuppetMasterProp、Rigidbodyの2つのコンポーネントをアタッチ
オリジナルのPropを作る際、一から作るのは面倒なので、アセットにあるProp Meleeを引っ張ってきて、メッシュとコライダーを変更して作るのもあり^^;
「Prop固定用オブジェクト」と、「Propオブジェクト」ができたら、ゲームを実行してみましょう。
「Propオブジェクト」を、「Prop固定用オブジェクト」のProp MuscleコンポーネントにあるCurrent Propに入れれば、取得されます。
逆にCurrent Propをnull(None)にすれば、Propをその場に手放します。
実際のゲーム開発では、これをスクリプトやボタンで制御していきます^^
(ここにひと工夫の余地あり?!)
※そのノウハウは、後日追記することにします~