AI BehaviorとPUPPETMASTERでラグドールNPC
- BTA(Kelorin Jo)
- 2020年10月7日
- 読了時間: 7分
更新日:2020年11月14日
カモメ町を作って宣伝するのに
水着ガールいないと物足りないからVRoidで自作して、
ビーチでくつろぐモーションも見つからないから自作して、
次にほしいってなったのが箱庭を歩き回るNPCでしたが
どうやって手軽に歩かせられるか?
手持ちのキャラクターコントローラをいくつか試した所、以前無料で落としたAIアセット
と、
この組み合わせがベストマッチになりました。
AI Behaviorのセットアップ方法
1.キャラモデルと、モーション(アニメーションクリップ)をいくつか用意します。最低IdleとWalkがあればよくて、WalkはRoot移動で前進するものが必要です
2.AnimatorControllerを作り、IdleとWalkのクリップを入れて、Idleだけデフォルトステートにして、他は繋がず孤立させます(これが重要)

3.シーンにキャラモデルを置き、2のコントローラをアタッチして、Apply Root Motionをオンにします
4.ステージをstaticにしてナビメッシュを作ります
5.3のキャラを選びTools-AI Behavior-mechanim setupを実行

いくつかのコンポーネントに加えて、AnimationStatesとStatesというオブジェクトが追加されますが、これは放置します
6.Navi mesh Agentをアタッチします
7.AI animation Stateに2のコントローラのIdleとWalkのステート名を入力します。

AIのモーションはこの項目から参照します
8.AI Behaviorsの、Idleステートを設定します。

AI Behaviorsのステート左のEditボタンを押すと下の項目がきり変わって、ステートの設定ができるようになります。

基礎設定項目はIdleをAnimationにセットするぐらいです。Idleはデフォだと延々待ち続けるので、時間で他ステートに遷移するTimerTriggerを追加します。

9.Patrolステートは巡回するためのウェイポイントが必要で、シーンに空オブジェクトを並べて、ウェイポイントグループを作ります。

基本、ヒエラルキーに並べた順に巡回する仕様のようです。ポイントがナビメッシュから離れすぎてると無理に行こうとして固まります
10.Patrolに歩きモーション、移動スピード、ウェイポイントグループを設定します。

Patrol Modeをonceに設定して、巡回が終わったらIdleに遷移するようにします
(LoopでずっとPatrolにしてもいいけど)
11.これで最低限歩き回る設定にできます。

・他のステートやトリガーを追加して、視界にプレイヤーが入ったら別ステートに移るとか、HPをデフォで持ってるので体力の多い少ないまたは0で発動するとか、アイテムドロップするとか、自作変数を追加して…とかいろいろできます。
・ステートはプリセットで色々種類があって、固有の設定を持ちますが、トリガーとステートとステート遷移の組み合わせが悪いと競合して働かないか固まります。どの組み合わせが上手くいくかいかないかは、マジでメモしたほうがいいです
・外部からイベントなどでで強制的にステートを切り替えたりHPを減らしたりできます。
・アニメータコントローラがない時代にできたアセットなので、コントローラをほぼ必要としないのが特徴です。普通のキャラコンのようにアニコン内部のステートがトランジョンするようになってるとうまく動けません。また、競合しないように切り替えれば他のアセットと併用もできそうです。構造が単純なので、そう難しくないはず。
・またこのアセットには、おまけでプレイヤーのキャラコンや弾発射、HPカウントのささやかなスクリプトが独立してついてます…独立してるのがポイント
で、次はPuppetMasterのセットアップの説明です。
※AIBehaviorなしのまっさらモデルにセットアップする前提で説明します
1.シーンのキャラモデルにBiped RagDollをアタッチでラグドールをセットアップ、


続いてPuppetMasterをアタッチ&セットアップすると、

なんか色々作られてキャラモデルのヒエラルキーが大幅に変えられます。

キャラモデル本体は[キャラモデル名Root]下に移動してます。
その後に、追加されたBehaviorオブジェクトにセットアップしていきます。ここからが本番
2.Behaviorオブジェクト下に、puppetという空オブジェクトを作りBehaviour Puppetコンポーネントをアタッチ(Behavio"u"rになってる)
3.同様に、fallという空オブジェクトを作りBehavior fallのコンポーネントをアタッチ
4.puppetオブジェクトに設定していきます。

・Collision And Recoveryに、 当たり判定を適用するレイヤーを設定します。 Ground Layersには地面や壁を
Collision Layersには当たると転ぶ対象を
前者はDefaultでもいいですが、後者は、有効なレイヤーを指定(というか、新規プロジェクトの場合は「追加」)しないと、ぶつかっても転ばなくなります。(それでも当たるとわずかにボヨンとはする)
あわせてステージの方も、対応するレイヤーにを追加または書き換えます。
・Muscle Group Properties-Defaultに数値を設定します Unpin Parents 0.6ほど Unpin Origin 0.6ほど
Min Mapping Weight 0 Max Mapping Weight 1 Min Pin Weight 0
Regain Pin Speed 0.5 Collision Resistance 0.5 Knock Out Distance 0.5
※この辺の数値で転びにくさや転倒からの復帰速度を設定してますが、どの数値がどう作用するかは詳しくは不明です。一部はいじっても変化なし
・Getting UPを設定する Can Get Upをオンに オンにしないと転んだら立たなくなります
・Eventsを設定する

アニメーターコントローラの中にうつぶせ起き上がりモーションがあったら入れて-同アセットのどこかに見本モーションがあります。そしてトランジョンは繋げなくてOK-
そのステート名をOn Get Up ProneのAnimation Stateに記入します。
なくても一応動きますが、おきあがりこぼしみたいな起き上がり方をします。
On Get Up Supineに、あおむけ起き上がりモーションのステート名を同様に入れます。こちらもなくても一応動きます
On Lose Balnceには3のfallと入れます (追記)表記ミス。コンポーネント名のBehaviourFallでした。ただし入れなくても別に動作に支障はないです)
4.3のfallに設定をします。

・Ending-Can Endをオンにします On Endに2の名前、puppetと入れます (追記)表記ミス。BehaviourPuppetでした)
これで、何かに当たったら転んで、しばらくしたら立ち上がります。
5.Playして、手動でなにか当たり判定あるものをぶつけて動作確認します。

・PuppetMasterでは、セットアップしたキャラのルートは移動せず、その中のキャラ本体だけ移動し、ラグドール案件が発動したらPuppetMasterオブジェクトが一瞬でキャラのもとに移動、一時的にキャラをラグドール化する…という仕様になってます。
・キャラモデル本体にはレイヤー8が、PuppetMasterにはレイヤー9が設定されます。
ProjectSettingから、お互いの衝突を無効にする必要があります。

しないとプレイと同時にキャラがふっとびます
1のセットアップから作ったならそのへんセットしてくれますが、セットアップしたキャラをパッケージにして別プロジェクトに持ち込んだ場合はレイヤーは持ち込めず消えてるので、手動で設定し直す必要があります。障害物のコリジョン設定も同様です。
・VRoidモデルでうごかしたら足首がぐねりがちなのでしたが、修正するには、PuppetmasterのHumanoid Configファイルをいじります。
Individual Muscle Settings-Muscles-LeftFoot,RightFootのProps-Mapping Weightを0にすれば、とりあえず足首のラグドールを無効にできて、これで問題なし
6.AI Behaviorをキャラクターにセットアップします。
Puppet Masterが激烈に書き換えるので、先にAIBをセットアップしてもまともに動くか怪しいです。動くかもしれないけど保証はできません
7.4のPuppetと5のfallの各Eventsから、AIBのステート強制変更やHP増減のメソッドを操れば、バランスを崩したりダウンしたらダメージを受けてステートが切り替わるようにできます。音やエフェクト出すのもイベントでやればOK

ただ、何故かダウンすると、アクセスしてないAIBのステートが、どこにも割り当ててないはずのHelpに勝手に変わり、逃げようとします。しかしHelpを設定しても、ラグドールに拘束されてるかのように金縛りのまま動くという なにそれ怖い
Helpの設定を一瞬で解除されるように設定(到達距離を10000とかにする) と対策できましたが、完全には…
AIBもパペマスもどちらも、アニコンのステートを独立させておくとうまく動くという共通点がありました。
そして複雑なヒエラルキー構造を強要するPuppetMasterと奇跡的に競合しないという。
扱うには結構なプログラム力が必要そうなのに、ノンコードでこいつはすげえぜ!!!
プロジェクトもほとんど書き換えないし、パッケージにして他プロジェクトに実装するのも比較的簡単です。(レイヤーやナビメッシュは持ち込めないので、手動で設定し直す必要がある)
そして作ったサンプルゲームがこちらになります
UnityRoom
タイトル画面やステージクリアの部分作るほうが50倍苦しんだ
他のアセットがだめだった理由
Behavior Designer…プログラム力が必要(昔挫折して放置してたので未検証だけど)、お高い
Invector…重い、Resourcesファイル地獄、プロジェクトの深いところをギタギタに書き換えるからパッケージにして他プロジェクトに持ち出せない、ほぼInvector内製のアセットしか併用できない。コード改変が難しすぎる
Character Controller Pro…PuppetMasterと似たオブジェクト構成を強要して、それが競合して解決できなかった
その他細かい注意点
・Unity2019.4でAI Behaviorを使おうとしたら、+-↑↓など一部のアイコンが非表示になってしまいました。一応その場所をクリックすれば操作できるけど辛い。
まあ古いアセットだししょうがない…
・PuppetMasterは物理演算なんで予期しない挙動がもりもり出ます。なかなか立ち上がれないとAIBの処理タイミングがずれてか棒立ちで動いたりワープしたりします。モデルが一瞬でも複雑骨折するのが許せない人は、まあ相応にシビアな調製作業が必要でしょう。
Comments