UE4ゲーム制作入門十日目
一人UE4ゲーム制作入門アドベントカレンダー十日目です。
今日は昨日のAIを賢くしていきます。今のAIはそもそも見えない位置からでも、どんなに離れていてもこちらを補足して、一心不乱に突っ込んでくるバーサーカークマです。
確かに、そういうのもいなくはないですが、今回のように狭いステージでそのようなAIしかいないのはあまりよろしくはありません。
ビヘイビアツリーの中身
今回作るビヘイビアツリーの全体図から行きます。中身は一新しました。前回の作ったタスクは、結局MoveToに置き換えています。
本当はもうちょっとこういうのが作りたいっていうのがあって色々試していたんですが、うまいこと動かず、時間もないので今回は極め本のものを参考に簡略化したものを使っています。
それでは一つ一つを簡単に説明していきます。コンポジットやMoveToは省略させてもらいます。
デコレーター
①のところには、青い3つのノードがコンポジットの中に入っています。これはデコレーターと言って、条件式を満たしていれば、このツリーを実行するというif文的なのを付与してくれます。
今回の例でいきますと、上から
・ブラックボードのTargetPawn変数の値がセットされていてるか。
・このツリーが実行されて5秒以上立ったら強制的にFalseを返す。
・TimeLimitのあとに1秒クールダウン時間をとる
になります。
サービス
サービスはコンポジットの実行中に、定義された頻度で実行されます。ブラックボードの値などを頻繁に変えたいときなどに使うそうです。(ほぼ初めて使った
今回のこのサービスは、極め本のと差別化を図るべく中身は変えてあり、視線レイが当たったときではなく、一定範囲内にプレイヤーが入ったら捕捉して追ってくるようにしています。
紛らわしい名前で申し訳ありませんが、isMoveという捕捉中にtrueになるbool変数を操作しています。これにより、捕捉中は敵が攻撃していることになります。
AIコントローラに実際の索敵処理が書いてあります。
タスク
左のツリーのMoveToはセットされたターゲット、このビヘイビアツリーではPlayerしかセットしてないので、Playerを追うためのタスクになっています。
極め本のとほぼほぼ中身が同じなので、スクショ上げていいかよくわからないので、説明だけしていきます。
GetPatrolLocation
巡回移動する先のターゲットポイントを配列として持っていて、その中から指定されたIndexのLocationを取り出しています。
二つ目のMoveToは実際に指定された移動先へと移動しています。このツリーはSequenceなので、実際に移動先につくまではFalseが返って、後ろの2つのタスクを飛ばすことができます。
WaitBlackboadTimeは指定したブラックボードのfloat変数の値だけ停止します。
PopPatrolLocation
巡回移動先の配列のインデックスを変更します。剰余で計算しているため、最大数になったときには自動的に0にもどり、始めの巡回先へと移動するようになっています。
攻撃処理
攻撃はisMoveがTrueの間は判定を出すようにしています。
呼び出してるAttack関数に実際にダメージを与える処理を書いています。レイにぶつかったらダメージを与えるというものになっています。これも同じな気がするのでスクショ省略。
ただ、PlayerのCapsuleComponentはコリジョンがVisibllityはヒットしないようになっているので、専用のコリジョンチャンネルを作るか、Cameraにするか、CapsuleComponentのコリジョンを変えましょう。
僕は後で直す(予定)にして、Cameraでとりあえずやっています。
プレイヤーのダメージ処理
ほぼほぼ、BP_Enemyのものと変わりません。ダメージを貰ったら、持っているステータス構造体のHPを減らして、ゼロ以下になったら死亡処理を行います。
できた
死んだグレーマン pic.twitter.com/BU4FoNcLxH
— 故・白鳥隆士@一人UE4アドカレ (@shiratori1221) 2016年12月8日
AIはきちんとしたものは作ったことがないため、こんな形になりました。誰か教えてください。
とりあえず、極め本とか公式のビヘイビアツリーの組み方を見つつ、この説明通りに組めたら、配置したターゲットポイントを巡回しつつ、索敵範囲内へとプレイヤーが入った場合、突進する敵が見れると思います。
一応記事を書いてる途中に、なんとなく組みたかったAIの実装方法を思いついたので、一通りゲームが完成してうまく動いたら番外編であげるかも?
おまけ
迷走しまくったタスクの山(大体が使えない