ビヘイビアツリーを使ってみよう!

  • 11
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

UE4でのAIを設計するために必要なこと

UE4でAIを作るとき何をすべきか?
どうやればAIを作れるのかを解説したいと思います。

1,4コマまんがを描く
2,AIの構成要素
3、体の実装
4、センサー実装(視覚)
5,センサー実装(聴覚)
6,思考(ビヘイビアツリー)

4コマまんが風に描く

作りたいキャラがどんな動きをするのか、
絵にしてみましょう。
今回は3パターンに分けて描いてみました。
1,敵正面からプレイヤーが来る
2,敵背面からプレイヤーが攻撃
3,敵背面から来たプレイヤーが音を出す。
になります。

パターン1、正面から視野へ入る場合

1.jpg
1,自分(プレイヤー)と敵が居ます。

2.jpg
2,自分が敵の視野に入りました!

3.jpg
3,敵が自分の方向を向きます!

4.jpg
4,敵が自分へ特攻を掛けます!

5.jpg
5,攻撃範囲内に入ったらチクっと攻撃します。

6.jpg
自分(プレイヤー)を撃破、もしくは見失いました。

7.jpg
定位置へ帰ります。

パターン2、裏から回り込む場合

[uploading 13.jpg...]()

敵の裏側に自分(プレイヤー)が回りこみました。
10.jpg
この場合は視野に入らずに裏から攻撃できます。

パターン3、音を出してしまった場合

11.jpg
音を出してしまいました!

12.jpg
敵がこちらを振り返ります!

※実際には紙とペンだけで十分です。

実際に描く場合は紙とペンで十分です。
UE4を開く前にどのような動きにしたいのか絵を描きましょう。

AIの構成要素

下記のように分けます。

AIの置かれた環境
1. 体(敵)
2. センサー(目、耳、を持ちます)
3. 行動(攻撃、振り向き、追跡、帰還、)

AIの考えている事
1. 思考(ビヘイビアツリー)
2. 記憶(BlackBoard)

各項目を1つずつ実装する必要があります。

次章以降で「4コマまんが風に描く」で描いた絵を元に、
AIの置かれた環境、AIの考えていることを実装していきます。

AIグラフ.jpg

体の実装

Mixamoのパッケージを使用しました。
https://www.unrealengine.com/marketplace/mixamo-animation-pack
Mixamoのアニメーションパックを開くと
全キャラクターのベースになっているActorに”MixamoCharacter_Master”が入っています。
コレをコピー&ペーストし、MixamoCharacter_Master_Enemyを作成します。

次にMixamoCharacter_Master_Enemyの下記BPを全て削除します。
これ等は全て人がキャラを操作するための物なので、AIには不要なものになります。
master actor.jpg
コレ全部削除

派生されたCharacterである「Mixamo_Jill」たんのParent class に先ほど作成した
"MixamoCharacter_Master_Enemy"に設定します。
zombie.jpg
このゾンビたん(Mixamo_Jill)を使用しました。

baseclass.jpg
ゾンビたん(Mixamo_Jill)のParent class に設定します。

センサーの実装(視覚)

センサーは下記のようにサービス内での実装になります。
「BTPlayerFinder」というサービスが「視覚」を実装しているサービスになります。
処理完了後は”全体の流れ”の図の通りBlackBoardへ書き込みます。

service.jpg

基本的には公式チュートリアルのこれ
https://docs.unrealengine.com/latest/JPN/Engine/AI/BehaviorTrees/QuickStart/11/index.html
を参考に作成しました。
この処理だけだとキャラの周囲全て見てしまうので
http://www.sousakuba.com/Programming/gs_two_vector_angle.html
ここのページを参考に下記の処理を作成しました。
siki.jpg
この関数は引数で
自キャラの座標
敵キャラの座標
自キャラの正面を示す単位ベクトル
を入力すると、自キャラの正面に対する敵キャラ位置の角度を計算してくれます。

センサーの結果はブラックボードへ書き込みます。
blackboard.jpg
Targetが見つけたターゲット
TargetFindedが、ターゲットを見つけた状態の場合はTrueにします。

センサー実装(聴覚)

聴覚は通常のBPで実装します。
キャラの周りに聴覚エリア用のコリジョンを用意し、
コレにSoundObjectがOverLapした場合にBlackBoardへ書き込みます。
今回はプレイヤーがボタンを押すとSoundObjectをバラ撒くように設定しました。
結果はBlackBoardのSounded、SoundedPosへ書き込みます。

collide.jpg
聴覚用コリジョンエリア
soundObject.jpg
SoundObject
blackboard.jpg
聴覚用コリジョンエリアにSoundObjectが接触した時にBlackBoardのSounded、SoundedPosへ書き込むよう設定します。

行動の実装について

今回は下記の行動を実装しました。
・追跡(UE4に標準で入ってる)
・振り向き
・帰還(UE4に標準で入ってる)

思考(ビヘイビアツリー)

ビヘイビアツリーは階層化されたステートチャートと認識して下さい。
ノードの一つ一つは全て何らかのステートであり、名前を付けられるように設計して下さい。
下の図はUMLで言う所のステートチャートの区切りを赤枠で囲った図です。
ビヘイビアツリーは階層型ステートチャートなので下図のような形で、ステートの中にステートチャートが入っている構造になります。

ビヘイビアツリー.jpg

ビヘイビアツリーのステートチャートは下記の「IsNumEqual」デコレータで作成します。
「ブラックボードの数字」と「設定した数字」が同じ時、trueを返します。
非常に簡単なデコレータですが、最重要デコレータになります。
ブラックボード内の「stMain」が「メインのステート遷移」のステート番号を管理しています。
例えば「待機中=0」「探索中=1」「特攻中=2」と言った形で番号を振り、
デコレータの「IsNumEqual」でステート遷移を作ります。
is num equal.jpg

blackboard.jpg
stMainがメインのステート遷移を維持しています。
尚、stCautionは作る予定で間に合わなかった残骸です。

※なお、このやり方は我流です。
 どっかのお手本とか参考にしてないのでセオリーではない可能性が高いです。

この投稿は Unreal Engine 4 (UE4) Advent Calendar 201515日目の記事です。