PuppetMasterの掴みアクションを使うには
- BTA(Kelorin Jo)
- 2020年11月15日
- 読了時間: 4分
PuppetMasterキャラコン最後の難関が、Melee…近接攻撃のセットアップです。
落ちてるものを拾って振り回せて、当たった相手はラグドールで転がる
これが実装できたらすっごいゲームしてる感じになるやつ!

が、サンプルシーンMeleeのプレイヤーキャラコンの設定を見まねでセットしても全く動かず、謎のエラーがでまくります。
近接攻撃のボタンを使わなければそれ以外の機能は使えるので放置してましたが、
動かせない現実から目を背けてはいけない…
正解は、「公式のチュートリアルを見る」でした。
Prop Muscle セットアップボタンを押さずオブジェクトやコンポーネントのコピーで作ろうとすると、絶対にエラーになってしまうという仕様でした。
まあとにかく動画を見てそのとおりにセットすればいい…
動画のモデルは手のボーン…じゃなくてマッスル(PuppetMasterの子にあるボーンみたいなの)がなく、前腕からProp Muscleを作ってますが、手マッスルから作ってもいけます。
複数の部位にProp Muscleを作って、所持したプロップを背中に取り付けたり持ち替えたりもできます。

プロップのほうはサンプルシーンの得物を持ってきて、持たせたいオブジェクトに移植で、まあすんなり使えました。
が、
セットアップ成功して、持てるようになって振れるようになるも、思ってたのと違った…
腕がぐねってまともに殴れない!?

殴った相手に得物のほうが跳ね返されたり(相手もちょっとだけボヨンとした)

なにこれ
ラグドールを転ばすのに必要な威力の設定にしたら、自分のラグドールの力が働いて振り回せなくなってるみたいな?!
(ちなみに持った瞬間に得物の本来のコライダーと物理は一時オフになって殴り用のコライダーに置き換わります)
いや、詳しく適切に設定したら解決できるのかもしれないけど、当たったら無条件で転ぶトリガーイベントをつけるとか、振った瞬間だけプレイヤーの目の前に当たり判定が出現する方式のほうが確実なのでは…
ためしに、上記の機能を使わず、得物のメッシュに普通にコライダーとRigidbodyを仕込んでisKinematicをオン、これをPuppetMasterでなくスケルトンの方の手ボーンに得物をセットしたら、普通にぶん殴れて、Mass0.1でも盛大にふっとばせました。 ただし当たり判定が出っぱなしだし、得物がでかいとコライダーが自分にも当たってバグ挙動になりますが。あと当然拾えないし捨てられない

※PuppetMasterはRigidbodyなしのコライダーでも、転びレイヤーに設定しとけば、適切なスピードで体幹に当てたら転ばせられるはずですが、上のセットアップでRigidbodyなしだと全く転びませんでした
一方、他のPuppetMasterを実装したキャラをつかめるというGrabコンポーネントがあります。
こっちは実装は簡単
グラブコンポーネントを手マッスルにアタッチして、少々設定するだけ

掴まれた側はダウン状態(BehaviorPuppetがnot get up状態)になります。つまりアニメーションを割り当ててあったら、糸の切れた人形のようにただぐったりするのでなく、モーションがブレンドされた状態でブラブラしてくれます。
AIを実装してたらストップさせる必要があるかも。
判定が常時効きっぱなしで投げるモーションもないのがちょっと残念で、サンプルコードは掴むのはOnCollisionEnterで無条件で呼び出して、つかみ解除はメソッドでなくUpdateで処理してる単純さなので、ゲームに使うには改造必須です。
掴む(殴る)動作で手を動かしたときだけ、もしくは相手がダウン状態か怯んでるときだけ
Grab.CSのOnCollisionEnterが作動するようにして、投げるボタンを押して投げるモーションを作動、、手を振るモーションのどこかでイベントで手を離すメソッドを発火できれば…
ちなみにMeleeキャラコンは物を持ってないときは殴るアクションが出せますが、使うには上記のProp Muscleを設定しないとたとえ得物つかみを使わなくても赤エラー吐かれて使えません。
もう殴るコード自作したほうが早いのでは
なお、PuppetMasterラグドールを使ってないものはつかめません。
また、ラグドールを普通のオブジェクトにピンドメする方法もあります。

触った場所に無条件でなく、特定のマッスル限定です
ピン留めしたいオブジェクトにconfigable jointをとりつけて、
オブジェクトにはConnectedBodyに掴むマッスルを設定してXYZのLockを以下のように設定して、

キャラ側は、PuppetMasterのMaster Weight-Pin Weightを0にするか、キャラに何かぶつけてダウン状態にするとブランブランします。

↓ビーチボールとHipマッスルを割り当てた場合の絵面

敵を拘束して宙吊りにするJustCauseのフックロープ的な使い方ができそうな。
ピン留めを外すにはConnectedBodyをnoneにします。
キャラはPin Weightを1にすると立ち上がります。
キャラ掴みとピン留めは、完全に固定ではなくゴム紐でつなげてるような感じで、
ピン留めした座標とキャラをぐるぐる回転させると相手がぶん回せますが、勢いでだんだん離れていき、場合によってはバグ挙動になったりエラーになったので、どんな無茶なアクションにも完全対応とはいかないようです。
PropMustleのピン留めだったら固定部位から離れなくできてるし、これらのつかみアクションはがんばれば一つのスクリプトで一元化できそうな気がするけど。
Comments