ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【ゼロからアンリアルエンジン5】〔AI編〕②一定距離離れたら諦めるNPCを作る

目次

 

はじめに

注意

UE5.0.2の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

前回

namiton.hatenablog.jp

 

今回は前回のプロジェクトから引き続き、あきらめるAIを作っていきます。

ビヘイビアツリーにおいて諦めるとはどのように実装すればいいのかの参考になればうれしいです。

 

解説

⓪諦めるとは?

前回、AIControllerからブラックボードの変数、ChaseActorKeyにプレイヤーキャラの参照を渡しました。

 

ビヘイビアツリーにはこのChaseActorKeyを参照していてこの指示に従ってAIの行き先を決定しています。


ではここのChaseActorKeyの中身に何も登録されていない場合どのような挙動になるでしょうか?試しにキー登録処理をSkipして実行してみます。

 

するとキャラは一切動かずその場で静止していることが分かります。

つまり、ブラックボードの変数を登録したり解除したりすることでAIの目的や意志の決定を制御することができます。


確認できたら戻しておきましょう。

キーを空にするだけでも静止することはできますが、高度なAIを作る場合は現在の処理が見えづらく、デバッグが困難になりがちです。今回はコンポジットとデコレーターを組み合わせて柔軟な変更ができるAIを作っていきたいと思います。

 

①サービスの作成

まずはプレイヤーとの距離を計算するためのロジックをサービスに記述します。

 

サービスはコンポジットノードにアタッチできる機能で、ノードに遷移している状態で呼ばれ続けるので変数の更新にもってこいな機能です。

 

これがコンポジットのこと。

遷移を管理するノードです。詳細は下で説明します。

 

ビヘイビアツリー、上のメニューから新規サービスを押します。

 

ビヘイビアツリーサービスを略してBTS_を付けましょう。(某音楽グループではありません)

名前をBTS_CheckDistanceとしておきます。

 

作成したサービスを開いて、関数のオーバーライドからReciveTickAIを選びます。

これはアタッチされているコンポジットが呼ばれたときに呼ばれ続けます。

 

試しにログを出してみましょう。

 

ビヘイビアツリーに戻ってSequenceのコンポーネントを右クリックして作成したサービスを追加します。

 

Intervalから呼び出し頻度を変更できます。

最適化する場合に便利です。

 

実行してみましょう。

0.5秒ほどの間隔でログが出力されます。

 

②サービスの編集

プレイヤーキャラ(目的のアクタ)と自身のキャラの距離を計算します。

 

距離をブラックボードの変数に登録しておきましょう。

BB_NPCを開き、

ブラックボードからTargetDistanceKeyというFloat型の変数を作成します。

 

 

作成したサービス、BTS_CheckDistanceを開き、

1.距離をセットするTargetDistanceKey

2.どのアクターかをセットするChaseActorKey

を作成してください。

どちらも型はBlackboardKeySelectorです。

またインスタンス編集可能にチェックを入れましょう。

 

画像のようにノードを組みます。

AIとチェイスアクターの距離をキーに設定しています。

 

ちゃんと設定されているか確認するログも出せるようにしておきます。

 

ブラックボードの変数にビヘイビアツリーのノードからアクセスするにはこのように組みます。

 

ビヘイビアツリーに戻りサービスを選択するとキーが登録できます。それぞれ設定しましょう。

 

実行して距離が変化するのを確認しましょう!

 

③条件分岐、デコレーター

サービスを使って距離を取得できるようになりました。

今度はこの距離から追いかけるというタスクを行うかどうかの判定を行いたいと思います。

 

条件制御にはデコレーターという機能を使います。

 

ビヘイビアツリーに戻り

 

コンポジットを画像のように変更します。

 

Selector、Sequenceとは

遷移を制御するノードです。

 

Selecorは左が成功したらそのまま終了します。

じゃんけんのようにどれかランダムに選ぶようなときが一番イメージしやすいと思います。※この場合は常にグーが出ます。

 

Sequenceは左が成功したら右に遷移します。

画像のように一連の流れで使われます。

 

Sequenceノードを右クリックしてデコレーターのBlackboardを追加します。

 

詳細からDistanceキーを選択して距離が400未満だったらタスクが動作するようにします。また、Selectorが失敗したらWaitタスクに移動するようにします。



この状態で実行してもうまく機能しません。

それはデコレーターのオブザーバーが正しく設定されていないからです。

 

④オブザーバーの設定

デコレーターにはフローコントロールという項目にオブザーバーを中止という項目があります。

 

▼公式サイト

docs.unrealengine.com

ココを設定することでデコレーターが評価されたときの挙動を変更することができます。

今回は400未満のみ機能してほしいので、失敗したらサブツリーを中止してほしいのでSelfを選択します。

これでビヘイビアツリーは完成です。



NPCの移動速度の変更

現在プレイヤーとNPCの移動速度が一緒なので一定距離離れるのは至難の業です。

そこで、NPC側の移動速度を落としたいと思います。

 

BP_NPC_Characterを開きます。

CharacterMovementコンポーネントから

 

MaxWalkSpeedを落とします。

 

実行して移動速度が落ちていたらOKです。

 

作成したNPCを確認しましょう。

400以上離れたら追いかけるのをやめ、再び400未満だと追いかけ始めるようになっていたら成功です!

 

応用すれば、マラソン大会である一緒にゴールしようぜ!!みたいな、途中まで一緒の速度で移動して、途中から置いて行かれるNPCが作れそうですね(笑)

 

次回もお楽しみに!

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。