読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ビヘイビアツリー研究② ブラックボードの使い方

妹「ブラックボード? というやつが、ビヘイビアツリーの変数なんだよね? これの設定の仕方もよくわからないんだけど。関係するノードはいくつか見つかったけど、どこにSETするのか決める方法が謎だったりとか」

「とりあえずブラックボードにSETしたりGETしたりする方法で、知ってるのはこんな感じ」

AIControllerから読み書きする場合(主に初期値の設定)

f:id:una_unagi:20160411174547p:plain

Unreal Engine | 7.AI Controller ブループリント:ブラックボードの初期値

「ツリー実行前に初期値を設定したいということがよくあるから、RunBehaviorTreeの実行より前に、ブラックボードの値をSETする方法がある。あんまりやらないだろうけどGETも出来る。この図はAIController型のブループリントで、BeginPlayの段階でビヘイビアツリーを起動させようとしているところ。ドキュメントの内容とだいたい同じだけど、いつくか違いがある。特にピンについてはドキュメントが書かれた時より後に追加されたんだと思う」

. SetValueのところの変数の型が違う
. SETの対象にするKeyName(変数名)を、変数にせずにMakeLiteralNameで直接指定してる
. バージョンアップでUseBlackboardノードに追加されたGET用ピンがあるので、GetBlackBoardノードを使っていない

妹「せっかく作ったブラックボードのピンが、RunBehaviorTreeのノードにつながってないように見えるんだけど。これだと初期値無視されない?」

「UseBlackboardは、AIControllerに特殊なBlackboardコンポーネントを追加するノードで、ピンは初期値の設定に使ってるだけだから。ブラックボード側はコンポーネントがあればそれを使って、なければ新しいのを作って使う仕組みだから、ピンで繋がなくても問題なく動くようになっている」

妹「これってビヘイビアツリーで使うのと違うブラックボードを作って初期値を設定したらどうなるの?」

「そのばあいは設定したものが無視される。RunBehaviarTreeの段階で、必要なブラックボードがないから、空のブラックボードを作って開始しちゃってる。ブラックボードのアセットをコピーして、まったく同じように扱えるようにした状態でも、別物だから使えないと判断される」

妹「じゃあ同じブラックボードが2つあったりしたら? それぞれ別のブラックボードを使ってる、たくさんのビヘイビアツリーを同時に起動するとか」

「そういう細かいところまでは試してないからわからない……」

タスク等から読み書きする場合

f:id:una_unagi:20160411211914p:plain

「こっちの方法はビヘイビアツリーが動きだした後に使うやつ。これもさっきのと同じで型ごとに使うノードが違うけど、BrackboardKeySelecter型でブラックボードのキーを設定して、後は普通のSETやGETと同じようにピンをつなげば読み書きできる」

妹「そのBlackboardKeySelecterというのはあやしいと思ってたんだけど、それでどうやって設定するのかわからなかったんだけど」

「それは変数を経由して、ツリー上で設定するのがいいと思う。BlackboardKeySelecter型の変数を作って、編集可能にチェックを入れておくと、そのサービスやらタスクやらをビヘイビアツリーに追加した後、設定画面でキーの選択画面が出る。この時はどのぐらいの反応する距離を色々変えて試したかったから、距離もここで編集できるようにしてた」

f:id:una_unagi:20160411214348p:plain

妹「ブループリントにMakeBrackboardKeySelecterというノードもあったけど、これは使えないの?」

「それは使い方がわからないし、無理して使うよりツリー側から設定した方がやりやすいと思う」

妹「ビヘイビアツリーからやる時と同じようにブループリントの方でも選択式になってれば簡単だったのに」

「それは無理だよ。だってタスク側からだと、そのタスクがどのビヘイビアツリー、どのブラックボードで使われるかわからないんだから。ビヘイビアツリーの方は自分がどのブラックボードを使うかわかってるから設定出来るけど」

妹「あれ? なぜそんな状態になるんだろう? じゃあタスクにもどのブラックボードを使うか教えるようにすればいい???」

「考え方としてはインターフェースを使う時と同じで、お互いやり取りするパラメータがわかってれば、後の細かいことは気にしなくていいということで、これがわざとそういう仕組みにしてある。こうすると別の変数を使うようにしたい時もすぐ変えられるし、他のビヘイビアツリーで同じ名前のキーがブラックボードになくても動かせる。ビヘイビアツリー全体の設計もそうで、タスクとサービスとデコレーターと、お互いが直接変数やイベントでやりとりできずに、全部ブラックボード経由になってるのはそういう理由」