Behavior Designer使い方まとめ

  1. どうもききです。
    今回はunityでAIを簡単に作成できるアセットBehavior Designerの使い方をまとめて紹介したいと思います。

Behavior Designerとは

木構造モデルのAIを作成できるアセットで高度なAIを簡単に作成することが可能です。
一つの要素をタスクと呼びAIを動かすための一つの命令になります。
沢山のサンプルタスクが用意されておりスクリプトが苦手な方でも扱いやすいです。
他のサードパーティとの統合が可能です。
モバイルにも対応しています。

ツリーの作成とNavmashAgentを設定する


Behavior Designerを適応するキャラクターを選択して【tool】→【Behavior Designer】→【Editer】するとこのような画面が開きます。

キャラクターにはNavmashAgentコンポーネントを追加しておく。

左のバーからタスクをクリックすると画面に追加されます。

一応テストで次のような簡単なツリーを作成します。


次にステージ全体をBakeします。
staticをクリックしてその中のNavigationStaticを選択します。

次に上のツールバーから【window】→【Navigation】を選択すると
Inspectorの横にNavigationが出てきます。


Navigation画面を開いてBakeを選択その下のBakeボタンをクリックします。


青いのが出たら準備完了です。

タスクには大きく分けて4種類あります。

コンポジットタスク,コンディショナルタスク,アクションタスク,デコレータータスク

コンポジットタスクSequenceやSelectorのようなタスクのことをいい子を内包するタスクです。
コンディショナルは条件式タスク
アクションは実際の行動に関するタスク
デコレーターは条件の結果などを操作するタスクです。
内包する側を親タスクその下に配置している側を子タスクといいます。
parallel(パラレル)
各タスクを同時に実行します。
Selector(セレクター)
or回路に似ていて子タスクのうち一つが成功ならセレクタータスクは成功を返します。
Sequence(シーケンス)
and回路に似ています子タスクが全て成功を返したときシーケンスタスクは成功を返します
PrioritySelector
(プライオリティセレクター)通常左の枝から順に実行され左に行くほど優先度が高いですがこのタスクは優先順位を変更できます
ParallelSelector
(パラレルセレクター)子タスク全てを同時に実行しその内一つでも成功を返した場合成功を返します。
ParallelSequence
(パラレルシークンス)子タスク全てを同時に実行しすべての子がが成功を返した場合成功を返します。
Repeater
子タスクを永続的に実行させるタスク失敗を返したら終了など条件を設定できる。
Inveter
子タスクの成功と失敗を逆転させるタスク。子が成功を返したなら失敗を返す。
Return Success
結果関係なく常に失敗を返します
Return Failuer
結果に関係なく常に成功を返します
Until Success
成功するまで子を実行し続ける

MovementPackのタスク

Behavior Designerと別途でsampleタスクが10$で販売されています。
CanseeObject(視界に入ったら
Seek(追跡する)
WithinDistance(範囲内に入ったら)
RotateTowerds(ターゲットの向きに回転)
などを使うにはこのアセットの購入する必要があります。
他にも沢山あります。
説明すると長くなるのでこちらの動画をご覧ください。

ツリーの構造

ツリーは次のような構造になっています。
Entryからスタートし左の枝から順に実行していきます。(左に行くほど優先度が高いです。)
このツリーはターゲットが視界にいるときターゲットを追いかける。
それ以外の時はパトロールという構造になっています。

ここで注目してほしいのがSequenceタスクです。
このブランチではCanseeObjectがコンディショナルタスク(条件式)でSeekがアクションタスクになります。
左の条件タスクが成功を返したなら右のSeekを実行するという構造になります。
またここでデコレータータスクを使用して次のコンボを発動させることができます。


Inveterは子の成功と失敗を逆転させて返却するタスク。
この例だと視界に入らなかったら成功を返し追いかけるという構造になります。
これと同様に範囲内にいなかったら追いかけるという風にもできます。
またこの機能を利用してReturn Successを使い右側の子を必ず実行させるというやり方もあります。

Abort Type(アボートタイプ)

Abort Typeとはコンポジットタスク(Selsector,Sequence)に設定できる条件のようなもの。
これを設定することで失敗の再評価アクションタスクの停止などがおこなえます。
Abort Typeには次の3つがあります。
Self,Lowpriority,Both
まずAbort Typeを設定しなしデフォルトの状態を知っておきましょう。
デフォルトの状態だと失敗したタスクは再評価されません。
ターゲットが視界に入っていない状態から視界に入っても動きません。
スタートした時点でのタスクを実行してもうそれで終了になります。
ただし一番上ののSelectorは別で設定しなくても大丈夫です。

 

 

Selfはコンディショナルタスクが失敗を返したとき右のアクションタスクを停止させます。デフォルトだとSeekが実行中にCanseeObjectが失敗を返しても動き続けます。
デフォルト同様失敗したタスクは再評価されません。
上の画像だと左が失敗を返した後右のpatrolが実行されます。

Lowpriorityは優先度が高いほうのコンディショナルタスクが成功を返せる状態なら
優先度の低いほうを停止して高いほうを実行させます。
停止したタスクには戻ってこれません。

BothはSelfとLowpriorityの両方の機能を持っています。
優先度が高いほうのコンディショナルタスクが成功を返せる状態なら
優先度の低いほうを停止して高いほうを実行させます。
停止したタスクにも戻ってこれます。

この違いを知っておくことはとても重要です。

共有変数

共有変数とはオブジェクトに設定されているScriptの変数(HPとか)とリンクさせてその変数の値が変化した場合共有変数も自動的に更新されます。例えるならオリジナルがクローンがいてオリジナルが死んだらクローンも死にます。
分身のようなものですね。
ではまずvariablesを開いてください
HPを設定します。float型の共有変数を作ってください。
その変数にHPが変動するscriptのHPの変数にリンクしてください。

次にスクリプトSharedはプロパティの変数に先ほど設定したvariablesの値に関連付けするために必要です。
HPが0になったらtrueを返して終了します。

hpは共有しているのでこちら側で更新しなくても勝手に変わります。

ツリーのsample

次のツリーはターゲットが範囲内にいないときターゲットを追いかける。
範囲内にいてかつ視界にいるときターゲットの方向へ向くという構造です。
ReturnSuccessを使用しているので必然敵に右の枝が実行されます。
Seekを停止させ次の枝を問題なく実行するためにAbort Typeはselfを使用します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)