top of page

【UE4/AI/ビヘイビアツリー】空中で動くAIを作ってみよう 第2回~BPで移動を改善する~

更新日:2020年10月18日

こんにちは。夏隣です。


前回の続き


今回もUE4で「空中」で移動するAIを作成していきます。 前回までに移動するBP自体は組めていますが問題が2つありました。

今回はその2つを改善し、よりより動きにしていきます。


↓今回使用している機能を使ったウォーキングシューティングゲームを作っています。よかったら無料ですのでぜひ遊んでみてください!感想お待ちしているのじゃな!


目次

1.手順

2.問題点を考える

3.移動を改善しよう

4.新たな問題点を考える

5.新たな問題点を改善しよう

6.最後に



1.手順

まず完成図を共有します。

今回の完成図はこちら。

・常にキャラクターの方向に向くAI

・一定距離近づかないようにする

を目指します。


前回までの動画はこちらです。比較してみてください。

「AIが空中の周りを回らず一定距離で止まる」との「距離がいい感じに空いている」ことが確認できたかと思います。


早速作っていきます!



2.問題点を考える

今回問題がある2点はこちらとなります。

・問題1「AIが空中の周りを回らず一定距離で止まる

 原因 カプセルコリジョン同士なので周りをまわってしまう。


・問題2「距離が近すぎる」

 原因 プレイヤーとAIの一定距離近づかない処理を入れていない


私の解決策のフローを振り返ると

・プレイヤーとAIどっちかをボックスコリジョンに変更すれば?

←×キャラの移動はカプセルコリジョンに依存することが大きいので難しい

 制作を始めた頃は知らなかったとはいえ、恐ろしいことを考えてる・・・🙄


             ↓

・カプセルコリジョンの横幅の大きさを大きくして近づけなくすれば?

←×近づけなくなりますが、当たり判定が大きくなり見た目上通れる道が通れなかったり、ダメージを受ける箇所が多くなりのちのちのことを考えても辞めたほうがいい


             ↓

移動するノードに一定距離空けて近づく処理をする

←△移動系ノードに一定距離空けて近づく処理が見つけられない(※BTではあります)。

ネットでもBT系の情報が多く、BPでの実装は私のほうでは見つけられませんでした。

(´;ω;`)ウゥゥ・・・


移動するノードの前にプレイヤーとAIの距離を取得し、ブランチで一定距離離れると移動するノードを実行し、一定距離内になると移動を停止するノードを実行する。

←〇問題点両方解決できそうです。こちらの実装を目指します。



3.移動を改善しよう

2に基づいて実装としては以下を目指します。

①移動するノードの前にプレイヤーとAIの距離を取得

②範囲内か?

③範囲内なら移動を辞め、範囲外ならプレイヤーを追跡する


まず前回作成したAIの移動処理を関数化して分かりやすくしましょう。

新規関数を作成。名前は任意でいいですがここでは「AIMovement」としました。


「BP_AI_Enemy」を開き、前回作成分を切り取り


「AIMovement」関数に張り付けます。


イベントグラフに戻り、Tickノードのに「AIMovement」関数をくっつけます。

実行してみて前回と同じ動作が確認できればOKです。


次に①移動するノードの前にプレイヤーとAIの距離を取得を実装します。

新規関数「AIDistance」を作成します。


プレイヤーとAIとの距離をブランチの条件として使いたいので、

アウトプットにFloat型で変数を作成します。名前は「ReturnDistance」としました。


AIとのキャラとプレイヤーとの距離を取得する関数を実装します。


イベントグラフに戻り、以下のように接続しAIDistance関数を呼びます。

これで①移動するノードの前にプレイヤーとAIの距離を取得が完了しましたね。


次に②範囲内か?を実装します。

今回は距離が300以下の場合動かず、300より大きい場合、移動処理を実行できるブランチをサクッと作りました。「AIDistance」関数で距離を返してくれているので、接続し条件に使います。


最後に③範囲内なら移動を辞め、範囲外ならプレイヤーを追跡するを実装していきます。

移動は既に上記ノードで完成しているため、移動を止めるノードを追加します。

左上のCharacterMovementから引っ張ってくるかイベントグラフを右クリックして「StopMovementKeepPathing」ノードを使います。

これで実装が全て完了しました。動きを確認してみましょう!


距離も一定間隔空いていてきちんと止まっています。

ただ新たに問題が発生しています。それは動きが止まった時、常にキャラクターの方向に向いてくれません。

こちらの問題も解決していきましょう。



4.新たな問題点を考える

・問題3「移動が止まった時、キャラクターの方向に向いてくれない

 原因 今まではAIMovement関数でキャラクターの向きを取得できていたが、

    ブランチがTrueの場合キャラクターの方向を向く処理がないため


なので実装としてはキャラの方向を向かせる処理さえ追加してあげればよさそうですね。

今後動きを止める処理は追加で何度か発生するかもしれないので最初のほうに入れてあげればよさそうです。


5.新たな問題点を改善しよう

3の実装方法を以下に変更します。

①キャラクターの方向に向く処理 ←追加

②移動するノードの前にプレイヤーとAIの距離を取得

③範囲内か?

④範囲内なら移動を辞め、範囲外ならプレイヤーを追跡する


新規関数を作成。名前は「AITargetRotation」とします。


以下のように実装。キャラクターの方向に向く処理は色々ありますのでぜひ調べてみてください。


イベントグラフに戻り「AITargetRotation」関数を追加します。


お疲れさまでした。

完成動画と同じ動きになっていれば完成です。



6.最後に

これでBPにて空中で移動するAIを作成は終了です。

プレイヤーとAIの距離を取得する方法をしっかり覚えておきたいです。


次回はBTやろうと思います。


前回


次回





    

閲覧数:380回
bottom of page