DirectX11でビヘイビアツリーを実装する
今回は、DirectX11とDirectXTKを用いてビヘイビアツリーを実装していこうと思います!
ビヘイビアツリーとは
まず、ビヘイビアツリーというのはなんなのか??ということからお話させていただこうと思います。
ビヘイビアツリーとは簡単に言えば、敵AIを計画的に実行するための方法です。
例えば、敵がプレイヤーを索敵!
近くにプレイヤーがいる == true; 近くにいない== false;
みたいな感じで、つながっていきます。
こんな感じでさらにこのノードを増やしていくことにより、敵のAIが流れるように処理をしてくれます。
この方の記事がめちゃくちゃわかりやすかったので、まずはこちらの方の記事を一度見てみるととても勉強になると思います!
DirectXで作ってみる
では、ここからはこのビヘイビアツリーをDirectXで実装してみたいと思います。。
必要なノードを作る
まず、ビヘイビアツリーを作るにあたって、ノードが必要となります。
シーケンスノード、コンディションノード、アクションノード、セレクトノードです。
主な役割は、
シーケンスノード
ビヘイビアツリーにおいての流れを作るために必要
コンディションノード
ビヘイビアツリーにおける条件分岐をするために必要
アクションノード
条件においてどのようなアクションをするのか。というために必要
セレクトノード
ビヘイビアツリーにおいて、今どこにいるのか、などの大本のためにも必要。流れの全体をこいつが管理します。
この4つのノードを作ることができたらもうできたも同然です!
ビヘイビアツリーを入れる
Enemy.h、Enemy.cppのようなビヘイビアツリーを管理するための本体をまず作りましょう。
ここからはどちらでもいいのですが、私は
ビヘイビアツリーを作成する為だけのクラスを作りました。
そしたらInitializeで
このような感じにノードをつくりましょう。
これはなにをしているのかというと、
まず、
auto root はノードの分岐の最初、大本を作ります。
次に
auto chaseSequenceは、シーケンスノードを作り、その中に
プレイヤーが見えるかどうかの子をつくります。
また、そこにActionもかいておきます。
これにより、trueならどのようなアクションをするのかができるようになりました。
そして、いたらそいつを追うようにしたいので
auto patrolSequenceでプレイヤーがいたときのためにさらにシーケンスノードを伸ばしていきます。
そして、大本のrootの中にシーケンスノードを渡しています。
このようにすることで、rootの中にプレイヤーがいるかどうかの判定と、プレイヤーを追うかどうかの判定の二つのシーケンスノードができました。
このようにすることでビヘイビアツリーの実装は完了です。さらにここから拡張をしていくのなら、シーケンスを伸ばしていくだけでいいので、とても簡単に拡張することができます!