テーマは敵キャラクターを動かそう ビヘイビアツリー編です
GASPのALS版をもとに、モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラをつくりましょう。
遊べる完成形はこちらで公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering
本記事はAIキャラクターにこちらを追いかけながらトラバーサルアクションさせる方法の説明です。
トラバーサルアクション
前回までで、巡回しつつ、見つけたら追いかけてくるAIを作成できました。
せっかくGASPだからアクロバティックに追いかけっこしたいですね
移動中に前方に障害物があったらトラバースするタスクを追加しましょう
キャラクターがジャンプキーが押されたらトラバースしてみるイベントを持っているので、それを呼び出してみればよさそうですね
CBP_SandboxCharacter > イベントグラフ
AIキャラクターじゃなくて親のサンドボックスキャラクターのほうですね
開始時とトリガ時の差は失敗時ジャンプするかしないかみたいですね
インプットアクションはAIコントローラから呼び出せないはず
新しくカスタムイベントを追加します
適当にかぶらなそうな色で目立たせておきます
コメントやフォルダにも色を付けられます(これって色を決めたら登録しておくと便利です)
新規BTタスクを作成して今作ったイベントを呼びましょう
BTT_TryTraverse > イベントグラフ
これで呼ばれたらトラバースする処理ですが、歩きながらこれを何度も呼ぶと失敗しまくりますね
さっきの下側の処理につなげば十分かもしれませんが、せっかくなのでこのタスク自体でトラバースする価値があるか判定してみましょう
まずは自身の位置と前方の向きを把握します。前方少し離れたところまでに障害物があればやってみる価値があるとします
Get Actor Forward Vector(前向きベクトル)などは長さ1cmの単位ベクトルなので、これに距離を掛け算してあげれば距離分の長さのベクトルができます。
これらを使って、スフィアトレース(球をのばしたスティック状の探索レーダー)で前方になにかぶつかるものがあるか探します
カプセルでもラインでも構いませんが、ラインだとハードルなど下が抜けていると当たりにくいなど、コスパと検出漏れのバランスですね
レイを飛ばす開始地点はキャラクターがいる場所(現在地)で、
終点はそれに先ほど計算したこのベクトルを足した前方です。
球の大きさが0だとライントレースとかわらないというか何も飛ばないかも?しれないので30くらいにしてみます
デバッグでサイズ感は確認しましょう
ヒットした時だけトラバースしてみるように分岐を付けたら完成です
動画ではFinish Executeをつけ忘れてタスクが終了しなくなり大惨事になっています。みなさんも気を付けましょう。
ではビヘイビアツリーに戻りこれを使いましょう
BT_AI > ビヘイビアツリー
移動して、トラバースしてみる
じゃダメですね。移動しながらトラバースする必要があります
そんなときはドラえもん「Simple Parallel」
これはメインのタスク中に別な処理を並列で実行するノードです。メインのタスクにMoveToを指定して移動している間に、サブタスクとして別な作業を実行する といった並列でタスクができます
選択すると詳細欄にサブタスクの中断条件があり、(日本語訳は間違っています)
Delayだとサブタスクが終わるのを待ってから次の優先度のタスクに遷移するそうです
メインタスクは「タスク」しか設定できませんが、サブタスクのほうには「コンポジット」が使えるので、たとえばシーケンスでトラバースしてみてウェイトでしばらく待つことで実行回数を減らすこともできます
5秒に一回だと連続する障害物で困るので0.5秒くらいにしておきます
散歩中も同じですね。コピペしておきます
ここまでで実験しましょう。動画では前述のミスでデバッグ大会になります。それも自分で問題が起きた時のヒントになると思いますのでみてください(;^ω^)
ただ、その前にもうひとつ大事な問題があり、明らかに障害物をよけてこっち来ますね
これはナビメッシュの設定で、段差を登れるようにつないでいないことが原因です。AIは自分が操作しているキャラクターがトラバーサルアクションできることを知らず、階段くらいのちょっとした段差しか通れると思いません。
これはちょっとハッキーな作戦ですが、キャラクターが通行できる段差をトラバースできる高さまであげることで対策可能です
レベル編集画面 > アウトライナー > RecastNavmesh-Default 選択
詳細 / ナビメッシュの解像パラメタ
もとは35cmになっているので、ちょっとした階段的な段差しか通行しようとしませんが
トラバース可能な高さ限界まで広げてあげれば、つながっている地面と同じつもりで移動しようとします。解像度3段階あるので3つとも同じ260cmにしておきます
ただし、勝手にトラバーサルアクションはしないので、さきほどのタスクで必要な時に実行するように行動ルールを作ってあげる必要があったということです
GASP-ALSだと3mでもジャンプしながらやれば登れます
これで移動しながら、0.5秒ごとに、前方75cm以内に障害物があれば華麗に乗り越える敵キャラが完成しました。
テーマは回収しましたが、追いかけてくるだけでは戦いとはいえないので、次回からは戦闘機能を作っていきます。
コメント