GASPのALS版をもとに、モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラをつくりましょう。
遊べる完成形はこちらで公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering
本記事はAI敵キャラがビヘイビアツリーで間合いを取りながら攻撃してくる方法の説明です。
BTサービスで間合いをとろう
密です。次は距離で行動が変わるようにしたいです。
それには目標と自分の距離を測るタスクと距離情報キーが必要ですね。
距離情報を黒板に
まずはBlackboardにキーを追加しましょう。フロート型とします。名前はTargetDistanceとでもしておきます
BB_AI
距離キーを書き換える仕事:サービス
次にこれを書き換えるタスクですが、追いかけている最中は距離に応じていろいろ処理を変えたいですね。
距離はすぐに変化するので、ビヘイビアツリー末端のタスクではなく、常にやる小さい仕事用に、「サービス」という仕組みがあります。コンポジットかタスクに右クリックからサービスを追加できます
EQSでもっと高度な情報取得処理ができるのですが、それはまたの機会にということで、タスクと同様に上のボタンから新規サービスを自作しましょう。
ビヘイビアツリーサービスでBTSですね
BTS_GetTargetDistance > イベントグラフ
ポーン自体のアクターロケーションと相手のそれの差を計算します。相手はここではゲットプレイヤーキャラクターなどでもよいですが、もう少し汎用的にするため、黒板のキーで指定できるようにしましょう。
オブジェクトではなくて直接アクターとして取得できる関数 Get Blackboard Value as Actor があったのでこれにしましょう
変数に昇格して目玉を開きます。書き換える距離のキーも使うので、区別がつく名前を付けておきましょう。
ベクトルの距離は引き算だとベクトルになるので、それのLengthではなく、Distance関数で一発です。
よく使う計算は関数化されています。こういうのない?ってChatGPTとかに聞いてみるとよいでしょう。
こちらもキーを公開しましょう
サービスにはFinishなんたらはありません
これで紐づけた処理が動いている間何度も呼ばれる処理になります
ビヘイビアツリーにもどり使いましょう
BT_AI > ビヘイビアツリー
ファイヤータスク中にサービスも実行されるようになりました。表示はタスクの下にくっつくけど、優先度はサービスのほうが高いみたいですね
キー設定していませんでしたね。緑の部分をクリックして詳細欄で、目標はTargetActorで、書き込む距離はTargetDistanceをセットしましょうです。
サービスで更新される距離情報の利用
距離を測るだけでは変化がないので「距離が近づいたら」の条件をデコレートしたいです。
サービスで更新された距離を使って、やるかやらないか切り替えたいので、もう一段コンポジットがあったほうがよいかなと。
ここにデコレータを追加でブラックボードの値を確認しましょう。
ここを数値型のキーにかえるとクエリーが数値用のものに変わりました。Key Valueが境界値です。
10メートル(1000cm)まで近づいたら撃ち始めるようにしてみましょう。
あとはこれをどこに入れるかですね。さきほどの位置だとシーケンスなので、今追加した条件が不成立だと失敗してウェイトが発動しなくなっちゃいます。
では今回は、トラバースよりもファイヤーを優先として、セレクターでツリーを増やす構造にしてみましょう
ファイヤーできないときは0.5秒ごとにトラバースするようにしましょう
1個1個動かすの面倒なのでコメントで囲って塊にしたほうがこういう動かす作業も楽になりますね
1. プレイヤーを視界に捉えると 2. 追跡が発動
5. 走りモードかつ 6. ビックリリアクションとって、
8. プレイヤーを追いかけるメインタスク 7.しながら
10. 距離を測って
11. 10メートル切ったら 12.撃ってくる
遠ければ 14. トラバース試して 15. 0.5秒待つ
あと、サービスのイベントの詳細欄、インターバルで何秒ごとにサービスを実行するかを指定しています。撃ち始める距離はあいまいで構わないので、それほど高速にする必要はないかなと思いますが0.2秒周期としました。
ふむふむ、追いつくと撃たないし、撃つときは連射しまくりですね
まず連射のほうはクールダウン期間の導入で頻度を下げておきます。0.5秒くらいかな
次は追いつくと撃たない件です。いろいろ変わっていますが詳しくは動画をご確認ください。
10メートル以内だったら0.5秒に1回はその場で撃ってくる
10メートル以内だと追いかけている最中に立ち止まって撃ってきそうなので
MoveToの許容範囲内に入ったらに変更してみます。
試してみると、500より少し大きいところでなぜか Move To が止まっています。
理由はわかりませんが、少し大きめにしておいたほうが安全そうです
8番の閾値を550くらいに変更しておきます
次は、いったん止まると同じほうに発射し続けているので、そっち向くっていう便利なサービスを使いましょう
追いかけのMoveToのところにも追加します。基本的には追いかけているんだからこっち向いていますが、回り道しているときとかはこっちを向いているとは限らないためです。
あと設置しただけではだめです。詳細欄で、どこを向かせたいのか指定する必要があります。ターゲットアクターのほうを向いてくださいませ
正面と銃口の向きがあってないので正面向いても弾があたりませんが、とりあえず止まっているときもこちらに合わせて向きを変えるようになりました
コメント