【UE4 AI入門】簡単なNPCの作成から学ぶUE4のAI

スポンサーリンク
AI
スポンサーリンク

ゲームに欠かせない敵キャラやNPCは、全てプログラミングによって移動などの制御を行っています。今回は簡単なAIを作成することで、UE4におけるAIControllerやビヘイビアツリーについて解説していきます。

作成するAIはリスポーンした位置から周囲5mを探索するNPCとします。

前準備(プロジェクトやキャラクター作成)

まずAIを作成するためにプロジェクトを作成しましょう。

今回はトップダウンを選択し、プロジェクト作成しました。(プロジェクト名は自由です。)

[新規プロジェクト]→[トップダウン]を選択
プロジェクト作成をクリック

プロジェクト作成後はAIを搭載するためのキャラクターを作成します。

新しく「AI」と名付けたフォルダを作成し、中にCharacterクラスを派生した新規クラスを作成しましょう。

右クリックメニューから[ブループリントクラス][Character]を選択し作成
作成後はブループリントに「BP_NPC」と命名。

 

作成後はブループリントに対して「BP_NPC」と名前を付けておきましょう。

 

作成した「BP_NPC」にキャラクターのガワを設定していきましょう。「BP_NPC」をダブルクリックで開いて、左上のコンポーネントタブから「Mesh」を選択して下さい。

右側に詳細タブがあるので、「Mesh」項目から[なし]と表示されたリストをクリックし、「SK_Mannequin」を選択しましょう。

「BP_NPCの設定」
コンポーネントタブから「Mesh」を選択
詳細タブの「Mesh」項目から「なし」と記載のリストをクリック
「SK_Mannequin」を選択
 

 

すると、お馴染のUE4のマネキン君が現れます。マネキン君をクリックし位置を調整してあげましょう。「Wキー」で上下左右前後の移動、「Eキー」で角度の変更になります。

表示されているカプセルの位置と矢印の向きに変更してあげましょう。目測で構いません(これはキャラクターの当たり判定(カプセル)とキャラクターの向き(矢印)になります。)

※なお「Rキー」で大きさの変更ができます。僕的に最も使うショートカットのうちの3つですね!覚えておいて損はないと思います!

「Wキー」で移動モードにして、マネキンの位置をカプセルに合わせる
「Eキー」で角度モードにして、マネキンの向きを矢印に合わせる
 

 

次の工程が前準備の最後になります!最後はアニメーションを設定しましょう!

コンポーネントタブのMeshを選択し、Animation項目の「Anime Class」のリストを選択。「ThirdPerson_AnimBP」を選択しましょう。ここまで来たらブループリントの内容の反映と保存のためにコンパイルと保存を行いましょう。

なお、保存は逐一行いましょう・・・作業途中にUE4が落ちてしまって作業が飛んでしまったら、そこで嫌になって作業を辞めてしまう可能性があります。管理人はそうでした。

Animation項目の「Anime Class」のリストを選択
「ThirdPerson_AnimBP」を選択
コンパイルと保存を実施

 

ここまで終われば次からはAIに関する作業になります!

AIが歩ける場所を作成(NavMesh)

AIが移動する際には、どこまで進んでいいのかといったエリア情報が必要になります。

トップダウン形式のプロジェクトを作成した場合は既にマップの中に組み込まれているので、一旦見てみることにしましょう。Mapの画面に戻り、「Pキー」を押下するとAIの歩けるエリア情報(ナビメッシュ)が緑で表示されます。

「Pキー」でナビメッシュを表示

 

もし、自分で追加する場合は左側のモードタブから[ボリューム]を選択し、ナビメッシュバウンズボリュームをビューにドラッグ&ドロップすることで追加できます。

[ボリューム]からナビメッシュバウンズボリュームをドラッグ&ドロップ

 

この時、間違えないようにしたいのがナビモディファイアボリュームです。ナビモディファイアとはモディファイア(修飾)とあるように、ナビメッシュの空間に対して優先順位を付けたり、横断不可にしたり等できるものになります。

後々、実践的な使い方を記事できればと思っていますので、少々お待ちください!

ナビメッシュバウンズボリューム

AIが探索できるエリア情報をマップ内に配置できるコンポーネント
ナビモディファイアボリューム ナビメッシュバウンズボリュームに対して、修飾ができるコンポーネント(優先順位や横断不可能にする)

 

AIの作成

お待たせいたしました!いよいよAIの作成になります!

ただ、AIをプログラミングするには、いくつか部品を生成しておいて、なおかつそれらを連携しなければいけません。準備の手順が多くなりますが、これからUE4でAIを作成していくにはかなり重要な工程ですので、根気よく頑張りましょう!

AIのコア(脳)「AIコントローラー」

冒頭の手順では、AIを搭載させるためのキャラクターを作成しました。でも今の状態ではキャラクターの身体(メッシュ)とアニメーション(動き)を載せているだけなので、マップに配置しても待機モーションの状態でハァハァしてるだけになってしまいます。

この状態に「考えて行動」を持たせるためには、どのようなことを行うか指示するものが必要になります。

実際のゲームではリアルの人間がコントローラーを使って、ゲーム内キャラクターに指示を出しますが、ゲーム内NPCはその指針となる入力がありません。そのため、AIに指示を出すためのコントローラーが必要になります。それが「AIコントローラー」です。

それでは実際にAIコントローラーを作成してみましょう。

右クリックメニューから「ブループリントクラス」を選択
ウィンドウの検索ボックスに「AI」と入力
検索結果から「AIController」を選択しクラスを作成
作成後はAIコントローラーに「AIC_NpcController」と命名

 

本当はここからAIコントローラーに処理を記述していきたいのですが、まずはAIコントローラーの入力基準となるファイルを作成していかなければいけません。

次にも詳しく記載させていただきますが、AIコントローラーは以下のような「ブラックボード」と「ビヘイビアツリー」と呼ばれる部品を用いてNPCの振る舞いを決定づけていきます。

AIの記憶領域「ブラックボード」

ゲーム上のキャラクターは判断・行動するために色々な情報が必要です(キャラクターの位置等)それらを格納するのがブラックボードです。

ブラックボード上で定義された情報はビヘイビアツリーと関連付けることができ、情報から行動・判断を実施できるようになります。実際に作成してみましょう。

右クリックメニューから「AI」を選択
「ブラックボード」を選択
作成後はブラックボードに「BB_NPC」と命名

 

本来は変数の設定等をしますが、それは後の手順にて行います。

AIの行動「ビヘイビアツリー」

AIのキモとなるのがビヘイビアツリーになります。ビヘイビアツリーは行動・振る舞いを定義する部品になります。行動・判断を行うので、人間の脳と同様に常に処理が実施されます。ブループリントでいうTickのような処理です。

ブラックボードと紐付けることにより、AIが識別した情報に対応する行動が実施できます。実際に作成してみましょう。

右クリックメニューから「AI」を選択
「ビヘイビアツリー」を選択
作成後はブラックボードに「BT_NPC」と命名

上記までがAIに関する部品の作成になります。

実際に次からは、これらをプログラミングしたり組み合わせたりして簡単なAIを作成してみましょう。

AIのプログラミング

実際にプログラミングを行っていきましょう。

作成したブラックボードとビヘイビアツリーの紐づけ

ビヘイビアツリー処理のためにも元となる情報が必要です。そのためにもビヘイビアツリーとブラックボードを紐づける必要があります。

作成したビヘイビアツリー「BT_NPC」を開く
詳細タブから[Blackboard Asset]をクリック
作成したブラックボード「BB_NPC」を選択する
 

AIコントローラーでのブラックボードとビヘイビアツリーの紐づけ

上記でも記載した通り、AIの動きはAIコントローラーが司ります。そのため、AIコントローラーに対して、作成してあげた「BB_NPC」と「BT_NPC」さらにキャラクターのブループリントを紐づけてあげることでゲーム内キャラクターへ動作指示をあげることができます。

まずは、ブラックボードとビヘイビアツリーを紐づけましょう。

AIコントローラー「AIC_NpcController」を開く
「Use BlackBoard」ノードを追加し、「BB_NPC」を選択する
「Run Behavior Tree」ノードを追加し、「BT_NPC」を選択する

このノードたちは読んで字のごとくそれぞれを使用したり、実行するためのノードになります。

Use BlackBoard Behavior Tree

ブラックボードを使う宣言をするノード。BlackBoard Assetに対象のブラックボードを指定する。返り値として成功判定の可否と使用するブラックボードの変数を取得することができる。

ビヘイビアツリーを実行するノード。BTAssetに対象のビヘイビアツリーを指定する。返り値として成功判定の可否を取得することができる。

 

AIコントローラーとキャラクターの紐づけ

肝心な部分である、コントローラーとキャラクターの紐づけができていないので、ここの手順で紐づけをしましょう。

紐づけ方はとても簡単で、最初に作成したキャラクター「BP_NPC」からAIコントローラーのクラスを指定するだけです。これにより、ゲーム開始時にAIコントローラーの処理が呼び出されます。

キャラクターブループリント「BP_NPC」を開く
[クラスのデフォルト]をクリック
右側の詳細タブから[AI ControllerClass]のリストをクリック
「AIC_NpcController」を選択

 

ブラックボードの設定

今回は、リスポーンした位置から周囲5mを探索するAIを作成します。そのためにも必要な情報は以下の2つになります。

・リスポーンしたキャラクターの位置
・探索するために移動したいキャラクターの位置
これらをブラックボードで宣言して、ビヘイビアツリーで使えるようにしてみましょう。
作成したブラックボード「BB_NPC」を開く
[新規キー]からVector型のキーを2つ作成する
それぞれ、名前を「HomeLocation」「MoveLocation」に変更する
HomeLocation・・・リスポーンしたキャラクターの位置
MoveLocation・・・探索するために移動したいキャラクターの位置
 
 
上記の手順で2つのキーが宣言されました。続けて「HomeLocation」にキャラクターのリスポーンされた位置を定義してあげましょう。
ブラックボードに初期の値をセットするにはAIコントローラーから実施します。AIコントローラーを開いてセット用のノードを記載しましょう。
 
作成したAIコントローラー「AIC_NpcController」を開く
「Use BlackBoard」ノードの「Set Value as Vector」を作成する
それぞれ、
「Key Name」には「Make LiteralName」にて「HomeLocation
「Vector Value」には「[GetControlledPawn]→[GetActorLocation]」
をつなげる
 

これにより、ブラックボードの「HomeLocation」キーに現在のNPCキャラクターの位置が保存されます。今回はSet Value as Vector を使用しましたが、作成するキーの形式により IntBoolObject 等の様々な形式を用いることもあります。

ビヘイビアツリーによるプログラミング

いよいよ実際にAIの行動をプログラミングしていきましょう。

作成したビヘイビアツリーを開いて必要な部品を追加していきます。まずは処理の元となる「ルート」に対して、コンポジットと呼ばれる部品を追加してみましょう。コンポジットとはその後に作成する処理の流れを制御する部品になります。今回はコンポジットの「Sequence」を追加します。

作成したビヘイビアツリー「BT_NPC」を開く
「ルート」からコンポジット「Sequence」を追加する。
 
ビヘイビアツリーでは実際の処理はタスクと呼ばれる部品によって行います。タスクには元々UE4側で用意されているタスクがあり、なおかつ自分でも作成することができます。まずは自分でタスクを作成してみましょう。
 
ビヘイビアツリー上部から「新規タスク」をクリック
「BTTask_BlueprintBase」を選択
 
作成されたタスクに対して処理を記載していきます。まずはブラックボードの値を使用できるように変数として宣言しましょう。
 
作成したタスクを開き、変数を追加する
変数の型は「Blackboard Key Selector」インスタンス編集可能とし、名前をそれぞれ
「BBK_Home Location」「BBK_MoveLocation」とする。
 
 
次にMoveLocation(探索するために移動したいキャラクターの位置)の値をランダムに決定する処理を作成してみましょう。
「Receive Execute」をオーバライドした関数を作成
「Receive Execute」イベントに「Set Blackboard Value as Vector」をつなげる
SetするVectorの値は「Home Location」を元にしたランダム数値とする
(Random Point in Bounding Box)
「Finish Execute」ノードを作成し、SuccessをTrueにする(チェックを入れる)
 
ここまで出来たらマップ画面に戻って新規作成したタスクの名前を変更しましょう
作成したタスク「BTTask_BlueprintBase_New」の名前を変更
「BTT_GetMovePoint」とする
 
最後にビヘイビアツリーにタスクを登録します。
今回作成した、GetMovePointに加えてUE4標準に搭載されている
「MoveTo」「Wait」タスクを用いて簡単な探索AIを実現してみます。
 
作成したビヘイビアツリー「BT_NPC」を開く
Selectorから「BTT_GetMovePoint」を作成し変数をそれぞれ
「BBK_HomeLocation」→HomeLocation
「BBK_MoveLocation」→MoveLocation に変更する
Selectorから「MoveTo」を作成し、KeyをMoveLocationに変更する
Selectorから「Wait」を作成する
 
 
ここまでできればAIは完成です。最初に作成したキャラクターのブループリント(BP_NPC)をマップに配置してプレイを実施すれば動き回るAIを確認できます。
作成した「BP_NPC」をビュー内にドラッグ&ドロップ
画面上部にあるプレイをクリック
 
 
プレイを押した後、キャラクターが動いては止まってを繰り返していたら成功です!
お疲れさまでした!

まとめ

今回は簡単なAIを作成しながらAIコントローラーやビヘイビアツリー、ブラックボードの簡単な概要と作成の仕方を学びました。

最後まで実施していただいた方の中には「コンポジットって何?」「ブラックボードの値はなんでこんな面倒なことしなきゃいけないの?」等の色々な疑問を持った方がいらっしゃると思います・・・1記事の中では紹介しきれない事がたくさんありましたので、今後の記事にて解説していこうと思います!

今後もこの入門記事は都度、更新していくので何か疑問がありましたらコメントお願いいたします!

 

コメント

  1. sup より:

    とても参考になりました!
    この記事との出会いに感謝。
    BTが画像だとSELECTだけど、たぶんSEQUENCEかな
    (文だとそうなっていましたし)
    一応?と思ったのでコメ

タイトルとURLをコピーしました