UE4とOculus Rift DK2を使ってニコニ立体ちゃんと戯れるデモを作ってみた話の続き、今度はAIを作ってみる前編。

プレイヤーについてくる

まずはアリシアちゃんがプレイヤーについてくるようにする。なんでついてくるのかは分からん。アリシアちゃんはプレイヤーが大好きなので片時も離れたくないのかもしれないし、不倶戴天の敵なので見付け次第抹殺しようとしてるのかもしれない。その辺は適当に脳内で補ってください。

とりあえずおいかけっこ

ただ単にプレイヤーを追尾するだけならめちゃくちゃ簡単。

まずはマップにNav Mesh Bounds Volumeを配置する。ビューポート上でP押すか、「表示」から「Navigation」のチェックを入れてやるとAIが歩ける範囲が確認できるので、地面が黄緑色になってるのを確認する。

黄緑色

次はアリシアちゃんのCharacterとAIControllerを作る。キャラクターが親のBP作ってコンポーネントにアリシアちゃんのメッシュを設定し、AIControllerが親のBP作ってCharacterのBPのAIController Classにそれを指定してやる。

AIControllerのEvent GraphにAIの処理を書いてやるんだけど、TickイベントでGet Player ControllerしてSimple Move ToでGoalに設定してあげればいい。こんな感じ。

簡易プレイヤー追跡ロジック

これであとはスケルタルメッシュではなくキャラクターの方をマップ上に配置してプレイしてみると、アリシアちゃんがついてくるようになる。ルートの探索とかはAIControllerが勝手にやってくれるので便利。これだけでも案外楽しい。デフォのMax Walk Speedだと早すぎて一瞬で距離を詰めてくるので、200くらいに設定してみた。

一定の範囲に入ったときだけプレイヤーを発見する

取り敢えず追いかけっこは出来るようになったものの、常についてくるのではなくて条件次第で別の動作もさせてみたい。そのままBPでゴリゴリ書いていってもいいんだけど、どうやらAIの制御をするのにはそれ用にビヘイビアツリーというのがあるようなのでそれも使ってみることにする。

何の事はない、ビヘイビアツリーのクイックスタートガイドにまんまプレイヤーの追跡をするビヘイビアツリーの作り方が書いてあるのでそれをそのまま実装してみる。何か色々やってるように見えるけど読んでみると結構簡単。

まずMultiSphere Trace for Objectで一定範囲内に何らかのActorがあるかチェック。ObjectTypesにはPawnを指定しておくと、WorldStaticに設定されてる床とか壁とかは拾わずプレイヤーとかだけ拾う。

その後、AIがコントロールしてるActor(この場合はアリシアちゃん)の位置からさっき見つけたActorまでLine Traceする(ドキュメントだとSingle Line Traceって書いてあったけど4.5だとノード名がLine Traceになってる模様)。これはUnityだとRaycastってのに相当するみたい。

こちらはfor Objectではなくby Channelになってる。さっきは指定したObject Typeのものを引っ掛けていたのでPawnを指定していればPawnだけ拾ってたけど、今度はコリジョン応答>トレース応答>Cameraのブロックにチェックされてる奴はなんでも拾う。MultiじゃなくてSingleの方を使ってるのが肝で、最初に見つけたのがSphere Traceの時に見つけたのと違う、この場合はプレイヤーとアリシアちゃんの間に遮蔽物がある場合は「見つからなかった」ことにしてる。無事見つけたらブラックボードにプレイヤーActorをTargetToFollowに登録。見つからなかったら削除。

TargetToFollowが設定されてたらツリー上の左側の方の処理が実行される。RapidMoveToタスクは大分大雑把に言うとさっきのAIControllerに直接書いたやつと大体一緒で、AIControllerが制御してるActorをTargetToFollowのActorまで移動させている。

1個戻ってCloseEnoughデコレーターを見てみると、ターゲットと自分との距離を測って指定した距離より近くにいるならfalseでCondition Checkを終えるので、その先の移動処理は実行されない。十分に近付いてるならAI Move Toしないので無駄にAIにルート探索させないし、さっきのだと常にアリシアちゃんがこっち向いてくるので出来なかった「後ろに回りこむ」が出来るようになるし、Acceptable Distanceを長めに取ると一歩下がって遠くから眺めるとかも出来るようになる。

プレイヤーを追いかけていないときは…?

ツリーの左側の処理がプレイヤーを見つけて追いかけている時に実行されるので、プレイヤーを追跡中じゃない時の処理を作りたければ右側の方に書けばよさそうだ。こっちはサンプルとは違う動きを作って行くことにしたのだけど、長くなってきたので一旦切って後編に続きます。