ゲーム開発備忘録

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

【ゼロからアンリアルエンジン5】〔AI編〕⑤視覚から意思決定するNPCを作ってみよう

目次

 

はじめに

バージョンアップしました!

UE5.02→5.03

うまく動かない場合はこちらを読んでね

namiton.hatenablog.jp

 

注意

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

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

 

前回

namiton.hatenablog.jp

 

今回は前回作成した目と耳の情報を元にNPCが意思決定できるようにしていきます。

 

解説

⓪概要

BP_NPC_Controllerで感覚信号を分岐する処理を前回組みました。

この信号をもとにブラックボードの値を書き換えます。

ビヘイビアツリーはブラックボードを参照しているため、値からコンポジットの処理を決定します。

①見つけているかどうかのキーの追加

BB_NPCを開きます。

 

Bool型の変数を作成します。

 

プレイヤーを見つけたかどうかのキーにしたいので名前をFoundPlayerKeyにしました。

 

②追いかける条件の変更

BT_NPCを開きます。

 

既存のSequenceにあるデコレーターを削除します。

 

Wait中でもプレイヤーを見たら追いかけてほしいのでノードの順番を反転させます。

 

このように右側のプレイヤーを追いかける側に変更します。

 

SequenceにBlackboardを追加します。

 

FoundPlayerKeyがNotSet=Falseの場合は、見つけていないので確率に応じた挙動を行います。オブザーバーをBothにしたのはwaitノード中でもFoundPlayerKeyの変更で、すぐに右側の判定を行うためです。

 

FoundPlayerKeyがSetの場合はプレイヤーを追いかけるようにします。


こんな感じになったらOKです。

 

③FoundPlayerKeyのセット

BP_NPC_Controllerを開きます。

ブラックボードを変数化しておきましょう。


ブラックボードのキーに登録するSet Valuw as Boolから見えているかの情報をセットします。

 

実行してみましょう。

視界に入っている場合は追いかけてくるようになりました。

 

④応用!頭の向きに応じたAIPerception

AIPerceptionはRoot Componentを参照しているため、頭の向きに追従しません。

そのためアニメーション由来で索敵(周囲を見回す)などを再生してもAIPerceptionの検出する範囲は変わりません。そのためAIControllerをC++で改変して頭の位置とAIPerceptionの位置と向きを同期させます。

 

こちらのサイトを参考に実装しました。

qiita.com

 

ツールC++から

AIControllerを親としたCustomAIControllerの作成

サイトのように.cppと.hを編集

ビルド、再コンパイル

 

CustomAIControllerクラスを継承したブループリントの作成

 

BP_NPC_Character

HeadSocketの作成

制御元のControllerを変更。

 

BP_CustomNPCController

BP_CustomNPCControllerに既存のAI関連のノードの移植(コピペ)

C++クラスのCustomAIControllerで作成した関数のOverride。

 

BTT_SetActionPoint

ビヘイビアツリーのタスクのAIControllerのキャスト先の変更

 

HeadSocketに依存しているので、より柔軟性の高いAIPerceptionの運用ができるようになります。

 

最後に

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

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

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

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

【ゼロからアンリアルエンジン5】〔AI編〕④AIPerceptionを使ってNPCに”目”と”耳”を持たせよう

目次

 

はじめに

注意

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

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

 

前回

namiton.hatenablog.jp

 



今回は前回のプロジェクトから引き続き、NPCに視界を持たせます。

現在はプレイヤーとNPCの直線距離で追いかけるようにしているため、NPCの後ろからバレずに近づくという行為はできません。そこで視界を持たせることでよりリアルなNPCを作りたいと思います。

 

解説

①感覚コンポーネントの追加

BP_NPC_Controllerを開きます。

 

コンポーネントの追加からAIPerceptionを選択します。



②視覚の設定

パーセプションの詳細からSensesConfigの+を押して追加します。

AI Sight configは視界の追加です。

Detection by Affiliation (所属による検出)はすべてチェックを入れておきましょう。

 

③聴覚の設定

もう一つはAI Hearing configを設定します。

こちらもDetection by Affiliationにすべてチェックを入れておきましょう。

また、聞いた音を忘れるMaxAgeの設定もできます。

 

④イベントの作成

感覚を受け取ると呼ばれるイベントを作成します。

 

まず引数のActorsは感覚が受取ったアクタ≒見たキャラクターなどを返します。

今回はプレイヤーを見た、もしくはなにかしらの音を聞いた、で処理を分岐させます。

 

▼全体

 

▼まずNPCと受け取ったアクタ間の感覚情報を引き出します。

▼構造体を分解し、LastSensedStimuliから感覚ごとに分岐させます。

▼視覚についてはプレイヤー以外を排除したいので判定を入れたのち、結果を表示します。

▼視覚については発生した音がプレイヤー由来かどうかの判定は入れていません。

ココは仕様によりますが、NPCが音だけで敵か味方か判定するのは困難のため。

 

デバッグしてみよう

移動されると困るので、ビヘイビアツリーが走らないように切断しておきます。


デバッグツールをショートカットに登録しておきます。

編集→プロジェクト設定

 

アクティベーションキーを任意のキーにしてください。

また、テンキーのないキーボードの場合はカテゴリースロットも別のキーに振りましょう。


ゲーム中にアクティベーションキーを入力するとAIのデバッグ画面に入ります。

 

カテゴリースロットの5(デフォルトだとテンキーの5)を入力すると視野の情報が表示されます。

 

設定を変更してみて視野に変化があることを確認してみてください。

 

このようにAIデバッグツールを使用するとブラックボードのキーの値やナビメッシュなどAIに関する様々な情報を表示できます。

 

デバッグ時はログが呼ばれていることを確認しましょう。

 

⑥爆発するエフェクトが出るアクタを作ろう

NPCの耳に対するアクションを確認するために音のなるアクタを作成します。

アクタを継承したブループリント、BP_SparkGrenadeを作成します。

 

StaticMeshコンポーネントを追加して、

Cylinderを割り当てます。

 

5秒おきに爆発するナイアガラエフェクトを出すノードを作成します。

 

レベル上に配置して5秒おきに再生エフェクトが出れば成功です。

 

NPCがこの爆発を検出できるようにする

アクタにNPCが音を検出できるようにする仕組みを追加します。

Tagに追加したものはこちらで分岐できるので音の種類に応じた処理も可能です。

 

こちらも詳細から距離を変更できるので確認してみましょう。

個々の範囲はMaxRangeから編集できるので、こちらも併せて設定&検証してみましょう。

 

次回は感覚を元に行動するようにビヘイビアツリーを編集します。

最後に

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

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

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

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

【UE4・UE5】〈Tips〉アニメーション通知をカスタマイズして便利に使おう

目次

 

はじめに

 

今回はアニメーション通知をカスタマイズしてより便利に利用する方法について解説します。

 

アニメーション通知とはその名の通りアニメーションに通知を付けることで、そのタイミングにアニメーションブループリントで実装されているイベントを呼んでくれる機能です。

足音や剣などの当たり判定など、非常に便利な機能です。

 

通常のアニメーション通知は通知に対応したイベントを1対1で作成します。

しかし、それでは通知の種類が増えるたびにイベントを増やす必要があり可読性に欠けます。

▼アニメーション通知それぞれにイベントを追加している

 

そこでアニメーション通知をカスタマイズして、インターフェース経由でイベントを呼び出せるように編集していきたいと思います。

 

▼一つのイベントで済む

 

この記事ではTPサンプルを使って足の接地タイミングを通知で取得することを題材に解説します。



解説

①カスタマイズするアニメーション通知を作成

コンテンツ右クリックからブループリントクラスを選択します。

 

検索にAnimNotifyと入れこれを選択します。

 

名前はBP_CustomAnimNotifyとしました。

 

②インターフェースの作成と編集

コンテンツ右クリックからブループリントインターフェースを作成します。

 

名前はブループリントインターフェースからBPI_を付けて、BPI_ReceiveAnimNotifyとしました。

 

インターフェースを開いて受け取り用のイベントを作ります。

インプットにName型の変数をそれぞれつけておきましょう。

 

③インターフェースの実装

アニメーション通知を受け取りたいブループリントに作成したインターフェースを実装します。

今回はThirdPersonテンプレートを使っているのでBP_ThirdPersonCharacterに実装します。

 

クラス設定からインターフェースを実装します。

 

イベントを実装を押します。

 

これでインターフェースの準備は完了です。

 

名前でスイッチして処理を入れたり、アニメーションブループリントにもインターフェースを実装してイベントを呼び出せるようにするのもアリです。



④アニメーション通知の編集

作成ブループリントを開いてReceived Notifyをオーバーライドします。

 

そうするとこのようなノードが現れます。

 

変数NotifyNameを作って編集可能にします。

 

あとはインターフェースの実装を確認して呼び出すだけです。

 

⑤使用方法

 

アニメーションからアニメーション通知を追加します。

 

NotifyNameに分岐で使用する名前入力します。

 

あとは呼び出し側で実装してください。

 

こんな感じに呼ばれていたら成功です、


 

⑥問題点と解決策

この仕組みには少し問題があります。

このように同時にイベントが呼び出される場合、受け取る側は1つしかないためイベントが片方のみしか呼ばれないことがあります。

 

解決策として、

1.ずらす

通知をずらして同時に呼ばれないようにします。

 

2.カテゴリー別にイベントを作成して分散する。

Enumなどでカテゴリーで分け、インターフェースの呼ばれる側を複数にします。

 

Enumカテゴリー

▼通知に変数の実装

▼スイッチでインターフェース呼び出しを変更

▼通知のカテゴリーを変更

▼同じタイミングでも、カテゴリーが異なればしっかり呼ばれます。

 

最後に

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

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

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

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

【ゼロからアンリアルエンジン5】〔AI編〕③確率で行動を変更するNPCを作る

目次

 

はじめに

注意

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

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

 

前回

namiton.hatenablog.jp

 



今回は前回のプロジェクトから引き続き、確率で行動を変更するNPCを作ります。

具体的には一定間隔で行動を起こすNPCを作成して、デコーダーを使った確率分岐で移動先を決定してみようと思います。

①~⑨までは移動先ポイントの実装なので本題だけ知りたい人は⑩から進めてください。

 

解説

 

①移動先の作成

AIの移動先を作成します。

柔軟な変更をできるようにブループリントを作成して参照できるようにします。

 

コンテンツ右クリックからActorを親としたブループリント、BP_AIActionPointBaseを作成します。

 

コンポーネントからStaticMeshとBillboardを追加します。

画像のようにトランスフォームとメッシュ変更します

コリジョンはNoCollisionにしておきます。

 

Construction Scriptに画像のように組み

NewSpriteを変数化します。

 

コンパイル後変数のデフォルト値に適当な画像を設定しておきます。

 

次にName型の変数を作成してこちらもインスタンス編集可能にします。

 

②移動先の配置

作成したBP_AIActionPointBaseをマップに配置します。

アイコンを編集してそれぞれActionNameをA,B,Cとしておきました。

 

間隔を空けて配置しました。

 

③移動先の登録

このアクション地点の情報はAIControllerに所有させます。

BP_NPC_Controllerを開いて画像のようにレベル上のポイントをすべて取得して、配列AIActionPointsという変数を作成してセットします。



 

④ビヘイビアツリーの編集

ビヘイビアツリーを画像のように変更します。

 

流れを説明すると、プレイヤーを追いかけていない場合は0.5秒待機した後に、ChaseActorKeyに設定された場所に移動します。

 

現在ChaseActorKeyには何も設定されていないので正しく動作しません。



 

⑤移動先登録タスクの作成

ブラックボードのChaseActorKeyにコントローラーブループリントのAIActionPointsからアクションに応じて設定する必要があります。

そこでChaseActorKeyに設定するというタスクを作成します。

 

ビヘイビアツリーから新規タスクを押します。

 

ビヘイビアツリーのタスクなのでBTT_を頭につけます。

名前はBTT_SetActionPointとしました。

 

設定は一度行えばいいのでタスクが開始されたときに呼ばれるReceiveExecuteAIをオーバーライドします。

変数を追加します。どちらも編集可にしてます。



画像のように組みます。

Controllerにアクセスして登録したPointsが存在するかチェックして指定したActionNameと同じ場合はキーを登録してタスクを終了します。

 

FinishExecuteはタスクの結果を設定するノードです。

コンポジットの挙動が変化するので忘れずにつけましょう。

 

⑥タスクの配置

ビヘイビアツリーに戻り

作成したタスクを配置してアクション名を入力します。

 

これでキーが常にAのアクションを行うようになりました。

 

しかし一度行動してしまうと二度とプレイヤーを追いかけることができなくなってしまいます。そこでプレイヤーキャラの位置を再設定するタスクも作ってみましょう。

 

⑦プレイヤーキャラを登録するタスクを作る

二回目以降はBTTask_BlueprintBaseを選択しましょう。


名前はBTT_SetPlayerPointとします。

先ほどと同じようにキーを作成して今度はプレイヤーの参照をセットしましょう。

 

コンパイル後プレイヤーを追いかけるノードの前に配置します。

 

⑧サービスを修正する

BTS_CheckDistanceですが、常にプレイヤーとの距離を検出したいので名前をBTS_CheckPlayerDistanceとリネームします。

 

また、内容もキーの情報ではなくプレイヤーの情報に書き換えます。

 

キーにプレイヤーの情報を設定するタスクを作成したので、AIControllerに設定する必要がなくなったので削除します。

 

⑨プレイヤーが優先されるように編集する

アクションポイントに移動中、プレイヤーにあったらプレイヤーを優先して追いかけるようにします。

 

コンポジットにデコレーターを追加します。

プレイヤーとの距離が400以上なら移動処理をキャンセルするようにします。

⑩確率操作用のデコレーターを作る

とても遅くなりましたが、いよいよ本題です。

BTT_SetActionPointで移動先を決定していますが現在は一番左が常に呼ばれています。

なのでデコレーターを使って一定の確率で失敗するようにします。

そうすると一つ右のタスクが検証されて、、、を繰り返すことで確率っぽいことをできます。

 

新規デコレーターを選択します。

 

名前をBTD_TaskProbabilityとします。

 

デコレーターの検証用関数PerformConditionCheckAIを使用します。

パーセンテージという変数を作成します。

ランダムに0~1まで生成してそれが入力された値より大きいか小さいかで判定します。

 

クラスのデフォルトからコンディションを変更します。

 

⑪デコレーターの適応

最後にSetActionPointにデコレーターを適応します。

左から検証されるので偏りが出る場合はパーセンテージを操作していい感じの確率を目指してみてください。

 

このように、プレイヤーが近づいたら追いかける。離れたらランダムなアクションポイントに移動するようになったら成功です。

 

最後に

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

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

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

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

【ゼロからアンリアルエンジン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のフォローなどしていただけるとありがたいです。

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

【ゼロからアンリアルエンジン5】〔AI編〕①プレイヤーを追いかけるAIを作ろう

目次

 

はじめに

注意

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

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

 

前回

namiton.hatenablog.jp

 

 

解説

①ナビメッシュの配置

AIがマップ上を移動するにはナビメッシュと言われるアクタを配置して移動ができる範囲を指定する必要があります。

 

アクタを配置からNavMeshBoundVolumeを配置します。

 

表示→ナビゲーション、もしくはPキーを押すことで移動範囲を可視化することができます。

 

ブラシセッティングの値を調整してマップ全体を囲うように配置します。

これでAIの移動範囲を指定することができました。

 

②ブラックボードに変数を追加

AIがプレイヤーを追いかけるにはプレイヤーの位置を取得する必要があります。

そのためにプレイヤーの参照を渡すために変数を作成します。

 

前回作成したBB_NPCを開きます。

新規キーからObjectとVectorの2つの変数を追加します。

それぞれ名前をChaseActorKey,LocationKeyにして、

ChaseActorKeyはBaseClassをActorにします。

 

③ビヘイビアツリーの編集

ビヘイビアツリーを編集してプレイヤーを追いかけるロジックを組みます。

 

BT_NPCを開きます。

ルートノードの下からドラッグして

Sequenceノードを出します。

 

SequenceからMoveToを検索して配置します。

 

MoveToの詳細からブラックボードキーにChaseActorKeyを設定します。


このようになっていたら完成です。

これでChaseActorKeyに設定されたアクターへ移動できるようになりました。

 

④ChaseActorKeyにプレイヤーの参照を設定

BP_NPC_Controllerからブラックボードが持っているChaseActorKeyにプレイヤーキャラの参照を持たせます。

 

BP_NPC_Controllerを開きます。

イベントグラフからどのブラックボードを使うか指定するノードUseBlackboardを配置します。アセットには作成したものを設定しましょう。

 

GetPlayerPawnからプレイヤーの操作キャラを取得します。

また存在するか検証するためIsVaildでチェックしてあげましょう。

 

ブラックボードコンポーネントからオブジェクト型を設定するSetValueasObjectノードを配置します。

 

KeyNameは型の名前です。
ChaseActorKeyを指定してプレイヤーのPawnを接続します。

 

最後にビヘイビアツリーを開始させるRunBehaviorTreeノードに接続し

使用するビヘイビアツリーを指定します。

 

NPCキャラをマップ上に配置して実行してみましょう。

 

ぴったりとくっついてくるはずです。

 

アニメーションしていないと思うので修正します。
※ バージョンによってアップデートで修正されました。
アニメーションしている場合は飛ばしていただいて問題ありません。

⑤アニメーションさせる

アニメーションの詳しい説明は以下の記事で解説しているのでここでは詳しく説明を行いませんので予めご了承ください。

namiton.hatenablog.jp

 

ABP_Mannyを複製してABP_NPCとリネームします。

 

BP_NPC_CharacterのメッシュからAnimClassをABP_NPCに変更します。

 

ABP_NPCを開き、AnimGraphからShouldMoveの接続を変更します。

 

ちゃんとアニメーションするようになりました。

 

⑥ソーシャルディスタンスさせる

ご時世的に『 密です 』なので

一定の距離を保つようにします。

 

ビヘイビアツリーを開き、MoveToのAcceptableRadiusの値を大きくします。

試しに200にしてみましょう。

 

S o c i a l・D i s t a n c e !!

 

次回はあきらめるAIを作ります。

最後に

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

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

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

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

【ゼロからアンリアルエンジン5】〔AI編〕⓪プロジェクト作成からNPCキャラに必要なアセットの準備

目次

 

はじめに

注意

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

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

 

解説

⓪AIとは

NPCとはプレイヤーに操作されずに動くキャラクターのことです。

このNPCを動かすギミックにAIを使用します。

はじめは単純なプレイヤーを追いかけるNPCを作成して、徐々に周りの状態から行動を判断できるAIを作ってみたいと思います。

アンリアルエンジンにはAIを作成するための機能が備わっています。特に行動を決定するビヘイビアツリーは非常に優秀で、これを理解することが強力なAIを作る何よりもの近道となります。

 

それではやってみましょう。

 

この記事から始める人のために1からプロジェクトを作成しますので、前後のシリーズを読んでいない方でもNPCを作成できますので、よろしくお願いいたします。

 

①プロジェクトの作成

プロジェクト名はNPCSample、

TPSテンプレートを使いブループリントで作成します。

②フォルダの作成

コンテンツブラウザからコンテンツを右クリックして新規フォルダから名前をNPCとしておきます。

以後NPC用のアセットはこちらのフォルダにまとめるようにします。

 

③AIControllerの作成

コンテンツ右クリックからブループリント、AIControllerを検索して作成します。

名前はBP_NPC_Controllerにします。

 

AIControllerはその名の通りPlayerControllerのAI版です。

Pawn(キャラクター)を制御するのがプレイヤーか?AIか?の制御系をControllerに記載します。ただし、管理が大変になるので小規模制作ではControllerではなくPawnに直書きしがちです。



④キャラクターの複製とコントローラーの適応

キャラクターは所有される側なので同じBP_ThirdPersonCharacterをAIに制御させたり、プレイヤーが操作することも可能です。

 

しかし、NPCが不必要なプレイヤー用の関数を持つとパフォーマンスに影響が出るので、今回は別ブループリントとして作成します。

 

ある程度仕様が固まっているのであればキャラクターのスーパークラスを定義して基本的なロジックはそこに記述。そして、プレイヤー、NPC、ボスキャラを派生クラスで作成してそれぞれに必要なコンポーネントを追加するのも有効な設計です。

 

BP_ThirdPersonCharacterを複製します。

名前をBP_NPC_Characterにします。

 

作成したBP_NPC_Characterを開いて

クラスのデフォルトからAIControllerClassに先ほど作成したBP_NPC_Controllerを割り当てます。

これでこのキャラクターはBP_NPC_Controllerに制御されるようになりました。

 

試しにレベル上に配置してみましょう。

 

実行してみてキーを入力してみてください。

どちらも同じブループリントですが、NPC_CharacterのほうはAIコントローラーに制御されているため、プレイヤーの入力を受け付けません。

 

 

⑤ビヘイビアツリーとブラックボードの作成と解説

ついにAIの思考決定の仕組みを作っていきます。

 

コンテンツ右クリックからビヘイビアツリーとブラックボードを作成しましょう。

 

ビヘイビアツリーには頭文字のBT_を、

ブラックボードにも頭文字のBB_を付けておきました。



ビヘイビアツリーを開いてみましょう。

詳細にブラックボードを割り当てる場所があります。

BB_NPCが割当たっていない場合は設定しましょう。

 

ビヘイビアツリーは木のように枝分かれさせて行動決定を行う場所です。

セレクターやシーケンスと呼ばれる条件分岐に従ってタスク(行動)を決定します。

 

ブラックボードはビヘイビアツリーの中で自由に扱うことができる変数を定義する場所です。脳の一時記憶のような場所で、受け取った情報を設定したりリセットしたりすることで、人間らしい立ち振る舞いのAIを作成することができます。

 

次回、プレイヤーを追いかけるAIを作ろう!お楽しみに

 

最後に

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

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

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

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