この記事は何?
試作中のゲームでBehaviour Treeを実装したので、個人的な整理も兼ねて書き残してみます。
Behaviour Treeって?
ゲームに使うAIの構築手法の一つです。再帰と条件分岐を組み合わせて複雑な思考ルーチンを比較的シンプルに構築できる手法で、人気なのだとか。
詳細はこちらの資料をご参照ください(丸投げ)。自分もこの辺りを見て作成しました。
- http://niconare.nicovideo.jp/watch/kn2055
- http://labs.gree.jp/blog/2015/06/14026/
- https://www.slideshare.net/sindharta/behaviour-treeingriffon
ゲーム用AIの作り方としてステートマシンという手法もあるのですが、Behaviour Treeのほうがより柔軟に書けそうだったため、こちらにしています。
ソースコード
ソースコードはこちら。
あれこれ入っていますが、つまるところBehaviour Treeが関係するのは
と
https://github.com/nakatatsu/BehaviorTreeAIExample/tree/master/Assets/Scripts/Models/BehaviorTree
https://github.com/nakatatsu/BehaviorTreeAIExample/tree/master/Assets/Scripts/Models/CharactorAction
以下のファイルです。
CharactorComponent.cs の中のCharactorComponent.Think()をUpdate()ごとに発火させています。
起動すると赤い四角が小さな青い四角の餌を次々食べていく(という体で動く)はず。
困ったところと、その対応策
- Behaviour Treeは戻り値がbool限定、発火させるときに渡す引数も固定です。
- つまり考えさせた後、結果をそのまま返り値で得られません。。。
- → 仕方ないのでイベントを発行するSubjectを引き回してイベントを聞き出すことにしました。
- 例によってMV(R)Pを基本にしているのですが、AIの作り方からして、Presenterを一つにまとめて中央集権にする手法が向きません。
- 1シーンにPresenterが一つだとすべてのModelが単一のPresenterの中に保持されています。なのでModel同士の通信が簡単にできます。
- ところがAIを使う場合は各ゲームオブジェクトごとにAIを保有したPresenterをアタッチするほうがいいです。
- → 結論、Model同士で直接通信できないので、Presenterを中継させて行うことにしました。
MV(R)Pは下記のように1シーンにPresenterが一つだけの場合Model同士のやりとりも簡単なのですが、
Model - Presenter - View
こんな感じで↓Presenterが複数あるとModel同士のやり取りを直接行うことができません。
ModelA - PresenterA - ViewA
ModelB - PresenterB - ViewB
そこで、相互のPresenterを介してやりとりしています。ModelA → PresenterA → PresenterB → ModelB といった流れになります。
UnityのComponentとしてアタッチするのがPresenterなので、ここを介して通信するのが一番すっきりするかな、ということでこうしました。UnityはComponent志向なのだから当然、なのですがここにたどり着くまで結構かかりました:(
ModelA - PresenterA - ViewA
↑↓
ModelB - PresenterB - ViewB
メタAIの利用
タイトルに反しますが、Behaviour Treeではないシンプルな条件分岐によるAIも使っています。
DirectorComponentがそれです。
実は、このサンプルでは、この記事の↓ 区分でいうところの『キャラクターAI』と『メタAI』の二つのAIが動いています。
詳細はこちらの書籍をご参照ください。ここの考え方がほぼそのまま元となっています。
人工知能の作り方 ――「おもしろい」ゲームAIはいかにして動くのか
https://www.amazon.co.jp/dp/4774186279
こちらの記事にも少し情報があります↓
http://www.4gamer.net/games/999/G999905/20170818117/
キャラクターAIについて補足
キャラクターAIは『知覚』し、『考えて』『行動する』の大きく3つにブロックが分かれています。BehaviorTreeが受け持つのは主に『考えて』の部分です。
なぜそうしているかですが、これも先述の『人工知能の作り方 ――「おもしろい」ゲームAIはいかにして動くのか』をご参照ください。
余談ながら
AIの作り方ですが、一人で作る分にはシンプルに全部コードの中に収めても問題ないと思います。
が、AIを担当するプランナーさんが別にいる場合は、プログラマは部品を作るだけにして、基本プランナーが自分で触れるようエディタ拡張を使うほうがうまく分担できるのではないかと思います。
Behavior TreeとAssetStoreで検索するとよさそうなアセットが結構でてきます:)