てんちょーの技術日誌

自分がつまづいたこととかメモ

【UE4】ぷちコンで作ったAIとEQSのお話

はじめに

ぷちコンで作ったもろもろ紹介編2です

元記事

shop-0761.hatenablog.com

今回のテーマがAIだったので作ってみました。簡単な概要とかは極本23章(P395-)などを参照するかといいと思います。

AIやビヘイビアツリーに関する情報が少ないのでちょっと苦労しましたw

AI トロン編

全体はこんな感じ

f:id:shop_0761:20160426003447p:plain

やや複雑に見えますがやってることは大きく分けて、移動するか、装備を使うか、の2種類です。

移動するほう

f:id:shop_0761:20160426003635p:plain

  1. TargetLocationを見つける
  2. 移動する
  3. 条件によってはその場で一回転する
  4. 待つ

といった感じです。

移動に関してはこちらを見てください。

shop-0761.hatenablog.com

回転するのは、SetActorRotationを使って1回転させようとすると荒ぶってしまったのでRotatingMovementを使っています。

f:id:shop_0761:20160426011901p:plain

RotatingRateを(0,0,180)にしてあるので2sだけdelayしてます。すると大体でいいなら1回転します。

で、装備を使う方はこちら

f:id:shop_0761:20160426004239p:plain

他の装備を使うところもほぼ同じ作りなので写真は割愛します。

処理の流れとしては

  1. LineTraceでHitしたActorのタグを取得
  2. そのタグによって分岐
  3. 現在のトロンの装備によって装備切り替え
  4. その装備のアクションを実行(BPInterfaceで実装した)

となってます。

ビヘイビアツリーではif文にあたりそうな処理が見当たらなかったのでBlackboardBasedConditionでEqualとNotEqualの2つを作って分岐させてます。

ConditionalLoopは設定した条件である限りループできるので装備のタグがCannonでない間はループし続けます。 そして、その装備をまだ持っていない可能性もあるのでTimeLimitで設定した時間だけループさせて、時間が来たら処理を中断させてます。

ほんとはタグを使ったswitch文的なのが表現出来ればよかったんですが、ビヘイビアツリーはそういう使い方ではないのでやや冗長な感じになってしまっている感はあります。

そしてなぜBPみたいにコメント出来ればいいのに…(そのノードに関するコメントしか書けない

最後にこれ

f:id:shop_0761:20160426005545p:plain

ChangeSightをしている間はトロンは動きません。ここでBoolをセットしてます。

これAIを単純に止めるだけで良いのであれば、こちらを参照してください。

qiita.com

でも今回はどっちかというとポーズ処理なので、完全に止めてしまうとまずいわけで…

C++にはIsPaused()があるのでこちらを使っても良いかなと思ったんですが、今回はやめました。

AI ボス編

f:id:shop_0761:20160426005433p:plain

流れとしては

  1. EQSを使って良さそうな移動先を見つける
  2. LocationとRotationを生成する
  3. 時々攻撃したり、ワープしたりする

です。EQSはこちらにチュートリアルがあります。実装した時はまだまだ不安定な時があったので思うように動かなかったりしました。

docs.unrealengine.com

今回使ったEQSはこれ

f:id:shop_0761:20160426010630p:plain

f:id:shop_0761:20160426010823p:plain

f:id:shop_0761:20160426010837p:plain

というような感じでScoreを設定して、場所を探っていけます。ほんとはもっといい感じにしたかったんですが、EQSのTraceが上手く使えなかったので断念しました…

まとめ

と、書いてみると意外と大したことない感じの中身でもそれっぽく動いてくれるので便利です。ただ使用例とかが少ないのでいまいちイメージが掴めないってのが現状な気がします。 ぜひ一度作ってみて、こんな処理してるよみたいなのが見たいので挑戦してみてください。