前書き
今回はTopDown EngineのAI Brainで敵キャラがプレイヤーを追いかけて攻撃する設定方法について紹介していこうと思います。以前はAI Brainの作りなど紹介させていただきましたが、今回は1歩踏み込んでAI Brainで敵キャラを動かしていこうと思います。
以下の動画のように敵がプレイヤーを探索し、一定の距離に入ったらプレイヤーに向かって走り攻撃するようになります。
Demoの場所
今回もDemoの作りから見ていこうと思います。参考にするDemoの場所は以下になります。
TopDownEngine->Demos->Koala2D->Prefabs->AI
・KoalaNinjaSwordMaster
敵がプレイヤーを追いかけて攻撃する作り
KoalaNinjaSwordMasterのAI Brainを見てみると以下のようになっています。それぞれStatesとスクリプトについて細かく見ていこうと思います。
- Detecting
- Moving
- Attacking
Detecting(探索)
Actions
AIActionDoNothing
スクリプト名が示すように何もしないアクションになります。AIはその場でじっとしています。
Transitions
AIDecisionDetectTargetRadius2D
TargetLayerで指定したレイヤーオブジェクトが指定されたRadius内にある場合はtrueを返します。それ以外の条件の場合はfalseを返します。
上記のパラメータを見るとTargetLayerはPlayer、Radiusは”7″となっているため、敵を中心とした”7″の距離にプレイヤーが存在する場合はTrue、いない場合はFalseを返す作りになります。
例えばAIDecisionDetectTargetRadius2DのRadiusの値を10などにすることでより遠くの位置からプレイヤーを見つけるようにすることができます。
Detectingの動き
Detectingに設定されているActionsとTransitionsの内容から
「止まった状態でプレイヤーが指定の範囲内に入ったらMovingの処理に遷移する(True分岐)」
「止まった状態でプレイヤーが指定の範囲内に入っていない場合はその場で探索を続ける(False分岐)」
上記の動きをすることが分かります。
現状は止まったままでプレイヤーを探索していますが、ActionsをAIActionDoNothing以外の設定にすることで、決まったルートを動き回りながらプレイヤーを探したり、ランダムに動きながらプレイヤーを探したりすることもできます。
Moving(移動)
Actions
AIActionMoveTowardsTarget2D
敵をターゲット方向に指定したMinimumDistanceの距離まで移動させます。このコンポーネントを使用することで、敵がプレイヤーのほうに近づいてくれます。注意として敵をターゲット方向に移動させる必要があるため、AIActionMoveTowardsTarget2Dを実行するためにはCharacterMovementコンポーネントが付与されていることが必要です。
Transitions
AIDecisionDetectTargetRadius2D
MovingでもDetecting同様の作りで使用されています。ただしTrue条件が空欄でFalse条件にDetectingへ遷移するように設定しています。このようにTrue/False条件を設定することで
「プレイヤーに向かっている間にプレイヤーが指定の範囲内にいたらMovingの処理を継続する(True分岐)」
「プレイヤーに向かっている間にプレイヤーが指定の範囲内にいなかったらDetectingの処理へ遷移する(False分岐)」
といった形になっています。このようにすることで、プレイヤーが見つかっている間は追いかけて、見つからなかったらその場で止まるようになります。
AIDecisionTargetIsAlive
ターゲットが生存している場合はTrue、いない場合はFalseを返します。True条件が空欄でFalse条件にDetectingへ遷移するように設定しています。そうすることで
「プレイヤーが生存している場合はMovingの処理を継続する(True分岐)」
「プレイヤーがいない場合はDetectingの処理へ遷移する(False分岐)」
→Detecting処理に遷移して、最終的にはその場でじっとするようになります。
AIDecisionDistanceToTarget
ターゲットが指定された範囲内にある場合はTrueを返し、それ以外の場合はFalseを返します。上記の例だとComparison ModeがLower Than(以下)でDistanceが”2″なので、ターゲットまでの距離が”2″以下になった場合にTrue、”2″よりも離れている場合はFalseを返す動きになっています。
条件分岐を見てみるとTrue条件がAttackingへ遷移するように設定されていて、False条件は空欄になっています。こうすることで
「プレイヤーまでの距離が”2″以下の場合はAttackingの処理に遷移する(True分岐)」
「プレイヤーまでの距離が”2″よりも離れている場合はMovingの処理を継続する(False分岐)」
という形でプレイヤーが近づいたら攻撃処理に遷移するようになっています。
Movingの動き
あらためてMovingの動きになりますが
- ターゲットに向かって移動し続ける(Actions)
- 探索指定範囲にいるかどうかチェックを行い、探索指定範囲外だったら止まる(Detectingに遷移する)
- ターゲットが生存しているかチェックを行い、ターゲットがいない場合は止まる(Detectingに遷移する)
- ターゲットが指定の距離まで近づいたら攻撃処理に遷移する(Attackingに遷移する)
- ターゲットが指定の距離まで近づいていなかったら移動処理を続ける(Movingを継続)
という動きをしています。
Attacking(攻撃)
Actions
AIActionShoot2D
Target Handle Weapon Ability で設定した武器を使用して攻撃を行います。上記の例ではNoneになっていますが、キャラクターのプレハブにCaracter Handle Weapon が設定されている場合は自動で設定されます。
Transitions
AIDecisionTimeInState
最小値(After Time Min)と最大値(After Time Max)の間でランダムに指定された期間(秒単位)が経過した後にTrueを返します。また時間が経過しない場合はFalseを返します。主な用途として指定秒後に何かを行うために使用するといいと思います。
指定の時間が経過した場合はTrue、経過していない場合はFalseを返します。True条件がDetectingへ遷移してFalse条件が空欄に設定しています。そうすることで
「指定の時間が経過した場合はDetectingの処理へ遷移する(True分岐)」
「指定の時間が経過していない場合は攻撃を継続する(False分岐)」
敵によって5秒間攻撃したい、ランダムの時間攻撃したいなどあると思いますが、AIDecisionTimeInStateで時間を設定することで攻撃している時間を指定することができます。
Attackingの動き
Attackingの動きは
- 指定の時間まで攻撃を行う
- 指定の時間が経過したら攻撃をやめる(敵の探索に遷移する)
という動きをしています。2.で攻撃をやめて探索に遷移していますが、現在の作りでは待機時間を設けていないため、敵とプレイヤーが近い位置にいる場合は「攻撃」→「探索」→「移動」→「攻撃」というループが続くため敵は攻撃しっぱなしです。現状攻撃のスキがない状態なので、攻撃の後に「待機」などの行動を入れてあげるとプレイヤーが攻撃できるスキができるかなと思います。
まとめ
今回はAI Brainで敵キャラがプレイヤーを追いかけて攻撃する設定方法について紹介しました。
簡単にまとめると
- 敵を探す(Detecting)
- 敵に向かって移動する(Moving)
- 攻撃する(Attacking)
それぞれに対して実行動作(Actions)と遷移条件(Transitions)を設定することで敵を動かすことができます。今回はDemoにある基本的な動かし方を紹介させていただきましたが、ほかにも「ランダムに動く」、「ルートに従って動く」などもActionsで指定することができるためいろいろと試しに動かしてみるといいかなと思います。
今回は「AIDecisionDetectTargetRadius2D」を用いてPlyaerを探索していますが他にも「ConeOfVision」を用いたPlayerの探索方法があります。興味がある方は以下の記事もご確認ください。
コメント