• 追加された行はこの色です。
  • 削除された行はこの色です。
#contents

&ref(c88-ai_all.png,,20%);

* 概要 [#q03f8336]
- 敵の挙動。ビヘイビアツリーで構築。
- 大抵の障害物や壁のチェックは「LineTrace By Channel」や「CupsuleTrace By Channel」でやってる
- EQS使おうとしたけど、一回試して上手く動かなかったので断念
- マスター予定日当日に調整してたのもあって、途中からかなり雑に。

&ref(c88-ai_task_01.png,,50%);
- ServiceとTaskはどれも大きいBPになったので今回はスクリーンショット割愛……需要あれば作ります

* Blackboard [#a33f61f2]
&ref(c88-ai_blackboard_02.png,,70%);
- AIControllerの「Event Tick」からBlackboardに相手のactorと射程範囲チェックを設定
-- Serviceでやっても良かった。

* Service [#pb971504]
** HandgunCheckService、MissileCheckService [#sfdfd66d]
- ハンドガン、ミサイルで撃たれているかをチェックするサービス。
+ 「Get All Actors with Interface」等でリストを全部取得。
+ actorの所属グループを観て敵が発射したものを収集
+ 一番近い弾を避ける対象の弾としてBlackboardに保存
-- 弾と自身の射線上に障害物(背景)がある場合は除外する(「LineTraceByChannel」でテスト)

* 遠距離 [#q74ea659]
** AttackShortService、AttackLongService [#n7e1b36b]
- 近距離、遠距離用攻撃サービス
+ 「Event Receive Activation」でアクティブになったタイミングで、短距離、遠距離武器の発射ボタンを押し始める
+ 「Event Receive Deactivation」でサービスを抜けるタイミングで、短距離、遠距離武器の発射ボタンを離す

** BoostUseService [#b32b30ef]
- ブーストボタン押しサービス
+ 「Event Receive Activation」でアクティブになったタイミングで、ブーストボタンを押す
+ 「Event Receive Deactivation」でサービスを抜けるタイミングで、ブーストボタンを離す
+ 「Event Recieve Tick」でブーストゲージが指定以下になったらブーストボタンを離す。一定以上回復したら再度押す。

* Task [#u8515aee]
** AvoidMissile [#w93dc224]
- ミサイル回避挙動。大抵迂回して飛んでくるので横に避けつつ、通り過ぎると反転まではしないので前進して回避する。
+ 自身から見て、敵との方向から垂直方向(左右)に回避する
+ 自身の右方向と左方向に避ける際、回避すべきミサイルから遠い方に回避
+ 合わせて正面へ向かう
-- ハンドガンで撃たれてたら前進は控えめに
** AvoidHandgun [#n9a14bee]
- ハンドガン回避挙動。左右に避けるのが一番。
+ 自身から見て、敵との方向から垂直方向(左右)に回避する
+ 左右の壁との距離を計測。どっちかの壁が近ければ、広い方に避ける。
-- 壁が近い方に避けると身動きが取れなくなる
-- 両方と壁が近い場合はどうしようもないのでどっちかに。
+ 左右どっちも広ければ、左右の移動先から相手へ攻撃できる方へ避ける


* 近距離 [#q74ea659]
** 仕様 [#r1b237f0]
- 遠距離範囲内
- 近距離範囲内
-- ハンドガンで撃たれているかをチェックする
-- ミサイルで撃たれているかをチェックする
-- 遠距離用の攻撃セットを実行
-- 近距離用の攻撃セットを実行
-- 移動行動
--- ミサイルで撃たれていればミサイル用の回避行動をとる
--- ハンドガンで撃たれていればハンドガン用の回避行動をとる
--- 現状維持行動
--- ミサイルで撃たれていればミサイル用の回避行動をとる。+ブースト使用。
--- ハンドガンで撃たれていればハンドガン用の回避行動をとる。+ブースト使用。
--- 遠距離よりもゲージギリギリまでブースト使いつつ避ける。
--- 相手を狙いつつ現状維持行動
--- 相手に近づく

** ビヘイビアツリー [#c30020d3]
&ref(c88-ai_long_01.png);
- Blackboardの「Is Long Length」(遠距離範囲内か)がtrueなら入る
- サービスとして遠距離範囲内では常時動かしたい処理を回す。
&ref(c88-ai_short_01.png);
- Blackboardの「Is Short Length」(近距離範囲内か)がtrueなら入る
- サービスとして近距離範囲内では常時動かしたい処理を回す。
-- 「HandgunCheckService」ハンドガンで撃たれているかチェック
-- 「MissileCheckService」ミサイルで撃たれているかチェック
-- 「AttackLongService」遠距離用の攻撃
-- 「AttackShortService」近距離用の攻撃

&ref(c88-ai_long_02.png,,60%);
&ref(c88-ai_short_02.png,,60%);
- 優先順位として、
++ ダメージの大きいミサイル回避
++ ハンドガン回避
++ ここに来ると狙われていないので適当な平行移動
++ 左右に回避したら敵を狙えなければMoveToで近づく
++ 最後ここまで来てスルーすると遠距離行動以外のノードに行ってしまうので、ここで終わらせる。強制的にSuccessを返す。
++ 最後ここまで来てスルーすると近距離行動以外のノードに行ってしまうので、ここで終わらせる。強制的にSuccessを返す。


* 遠距離 [#q74ea659]
- 近距離とほぼ一緒。近距離用の動作が遠距離になったり、パラメーターが一部違うだけ。
&ref(c88-ai_long_01.png);
&ref(c88-ai_long_02.png,,60%);

* 難易度調整 [#e39052c4]
- ミッションによって難易度付け。簡素な実装だけ入れた。
-- 1 - チュートリアル、2,3 - 弱い、4, 5, 6 - 普通
+ ハンドガン、「弱い」以下の場合は一定間隔でランダムに射撃を止めたりする
+ ミサイル、「チュートリアル」の場合は近距離に入った際に射撃を止める


* 感想 [#c1690992]
- 明らかに時間不足による調整不足感が……
- もうちょっと地形を考慮したりする戦い方をしたかった


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS