Behavior Designerに再挑戦
- BTA(Kelorin Jo)
- 2020年11月1日
- 読了時間: 5分
Unityアセットストア使いだして程なくしてセールで買って、当時はプログラムのプの字もわからず
心折れて封印したBehavior Designer…今再び引っ張り出して再挑戦しました。
高い本体だけ買っても、ちと不便なビジュアルスクリプトにしかなりません。
そう、AIというより本質はビジュアルスクリプトツールです。
オプションのMoveパックを買ってやっとノンコードで使い物になるってとこです。

歴史と実績のあるアセットのわりに、ネットの情報すっげえ少ない!!!!
使うには、BehaviorDesignerウィンドウを開いた状態でオブジェクトを選んだら即生成されますが、

移動関係にはNavMeshAgentを使います。なくてもナビメッシュ使わない系のタスクは使えます
またNavMeshの移動とアニメーションを連動させるには、別途自前でアニメーターと連動用スクリプトを用意する必要があります。画像のコンポーネントNavMeshAgentから下3つは、自作のスクリプトです。
参考記事
※この記事のコードは抜けがあるのか、using UnityEngine.AI;が必要ぽい
また、攻撃・ジャンプモーション制御用のスクリプトも自前で用意する必要があります。
(別売りの攻撃パックがありますが、買ってないので使い勝手はわからないです)
Moveパックは基本、平面の移動しか仕事してくれず、基本のタスクもシーン内のオブジェクトを参照したり外部のスクリプトを実行させる程度はできますが、変数の計算などはできません。
公式の不親切ぶりはもう絶句レベルですが、
タスク(ノード)はコメントが付けられるのと、折りたたんで下階層のタスクを非表示にできるので、ぱっと見なにしてるのかわかりやすいのは救い。

成功の鍵となるタスクは、
Selector
Sequence
Parallel
RandomSelector
Can See Object
Invoke Method
このあたりです。
Selector
IF分岐です。ぶら下がったタスクを左から実行を試み、成立したらそこで終了、成立しなかったら=タスクがfailureと返してきたら、Selectorは右のタスクを実行していきます。
一度仕事したらリピートしても、二度と仕事しません。何度も実行を試みるようにするにはSelector Evaluatorを使います。
Sequence
下層の複数のタスクを左から実行します。不具合を出さないのがわかってる冗長なタスクはこれにまとめて、ブラックボックス化できるでしょう。
全て実行できたらSuccessを返します。途中で実行できなかったら残りのタスクは実行せず、failureと返します。
Parallel
Sequenceとちがって複数のタスクを同時実行します。基本タスクは一つずつしか実行されませんが、キャラの回転と移動と攻撃を同時にさせたいなんて場合に使います。Waitと組み合わせれば、タイミングをずらしてタスクを同時作動させられるでしょう。
RandomSelector
ランダム分岐です。
Can See Object
キャラに視界を与えて索敵を可能にします。検知条件はオブジェクト(複数可)、レイヤー、タグ、キャラモデルのボーンなど。
これがなきゃAIほぼ役立たずの超重要タスクです。ただ癖があって、
レイキャストだけど独自仕様でスキンメッシュ=キャラモデルは検知できない
メッシュレンダラーが非表示でも検知するが、メッシュなしだと検知できない
コライダーを検知するぽいけど、トリガーコライダーは検知できない
イベントシステム不要
という。
キャラを検知するには、静物をキャラに持たせてそれを検知させて対処しました。
公式にもどこにも説明が書いてなかったのでおま環かもしれない。他のアセットでも似たような不具合があって、Unityのバージョンが上がると従来機能も密かに仕様が変わって使えなくなったのかもしれない。
似た機能に、Within DistanceとCan Hear Objectがあります。これも同様に重要で、同様に困った癖がありました。
Invoke Method
外部のアセットのメソッドを実行できます。移動以外の行動、攻撃とかジャンプさせるにはこれを使うしかなさげです。
実行したらノーウェイトで次のタスクが実行されます。同期を取るにはWaitで止めるか、Behavior Designer自体(とNaviMeshAgentを)一時停止するなど工夫が要るでしょう。
実行したら即終了して次にいったり、終了したら二度と仕事しないタスクがいくつかあり、使ってみないとわからない重要な情報なので、一通りの機能は試してメモっとくべきです。
特にナビメッシュとアニメーターを操作するタスクは吟味が必要です。

各タスクは独立してスクリプトを持ってるので、中身を書き換えてカスタムもできるようです。
英語の注釈を翻訳して日本語に差し替えるだけでもだいぶ心が楽になる。
それで結局使えるのかというと、
AIを作るには有効です。
やっと、ビジュアルスクリプトの強みがわかった!
普通にC#コード書いて作ってたら一番苦しむのは、条件分岐のための変数…フラグが膨大に必要なことです。
行動を増やすたびにフラグが増え、フラグ重複のリスクが増えていきます。一つずつしか動作しないはずの処理が同時にされたり、全て動作しなくなったりして、不具合を直すのに見直し箇所が雪だるま式に増えて辛くなっていくのですが
ツリー形式だと必ず一つずつしかタスクを実行しないので、フラグのことは頭から外すことができるんですね。どこでストップしてるのか実行してるのか見れるの大助かり。
ただし、ローカル変数を作って持つことはできても、計算が一切できないのでこれ単体で全ては作れません。
それと、C#の文法を忘れてもいいことでした。
結局ビジュアルスクリプトもc#を把握してしないと満足に使えないのですが、c#は細かい文法がクソゲーなのであり、
すべて対応してるわけではないとはいえ、ボタン一つでコード数行分に相当するタスクがぽんと出るのは良い。うろ覚えでも使えるのが強みなんですね。
常に文法を記憶するために脳がリソース不足になる、文法忘れてググってコードをコピペする手間、それから開放されるとどれだけ快適で時間短縮できるかに気付かされました。
さて、これがパペマスのキャラコンと競合せず組み合わせられるかなあ…?
Comentarios