第四話 Behavior Designer②
【注意】この記事は「とりあえず動いた」を記録するものです。記されている内容は、正しい用法ではない可能性があります。
とりあえず簡単なツリーから作っていきたいと思います。
長くなる可能性があるのでお好きなバーチャルユーチューバー等の雑談を聞きながら作業される事を推奨します。
-
マップを作る
適当に作ってNavmeshを焼いておこう!!!!
-
プレイヤーキャラを作る
セールで買ったPlayMaker(これも積んでた)をここぞとばかりに使いました。プレイヤーキャラというかWASDとかで動く物なら何でもいいと思います。
名前を"Player"とします。
-
AIを適用するキャラを作る
適当な箱にしました。何でもいいと思います。
NavMeshAgentを装備するのを忘れないでね!パラメータはお好みで。
名前を"Enemy"とします。
-
ツリー製作をはじめる
Enemyを選択した状態でBehavior Designerのウィンドウを開くとこんな感じになってると思います。
何もない所を右クリックして新しいタスクを追加しましょう。何を追加すりゃええのという話なんですけどとりあえずRepeaterでも置いておきましょう。タスクを召還すると、一緒にツリーのスタート地点となるEntryも現れます。Repeaterの説明は後でします。
手始めに「視界内にターゲットがいたら追跡する。視界内にターゲットがいなければ何もしない」ツリーを作ってみましょう。
とりあえずSequenceを追加します。
さらにCan See ObjectとSeekを追加します。Seekの代わりにFollowとかでもいいと思います。名前が分かっていればTasksの検索窓に名前を打ち込むと出てきます。右クリックして頑張って探してもOKです。
次にタスク同士をつなぎます。タスクの上下の出っ張りを引っ張ると線が出てくるので良い感じにつなごう。
ツリーができた!
-
タスクの設定をする
お察しの通りこのままでは動きません。まずCan See Objectの設定から始めましょう。これまでにUnityでInspectorと格闘しまくってきた人には何も難しくないと思います。
Can See Objectを選択して、Behavior DesignerのInspectorを開くと次のような項目が現れます。とりあえずTarget Objectさえ指定しておけば動きます。今回はPlayerが視界内に入った事を検知したいのでScene内のPlayerを指定します。後はマップのサイズ等に合わせて視界を調整しておきました。Ignor Layer Maskを指定すると、透視できるオブジェクトを指定できます。今回は指定していないので、地形で視界が遮られることになります。ちなみにUnity側のInspectorでBehavior Designerの項目を展開しておくとScene画面内に選択中のオブジェクトに与えられた視界が表示されます。閉じると消えます。
次はSeekの設定をします。Targetを指定してあげるだけで動きます。今回はPlayerを追跡したいのでPlayerを指定。スピードや到着したと見なされるターゲットとの距離なんかはお好みで決めて遊んでください(加速度の項目がここにないのはなんでだろう…)。
だいたいできました。
次にSequenceの話。この辺の理解が一番面倒くさい。カルネージハートやパンドラプロジェクト等のゲームを遊んでいた人はYES/NOで命令の行き先を変えていたけどこいつはちょっと違う。
Sequenceは自分の下にあるタスクを左から順番に実行して、Trueが返ってくれば右隣の次のタスクを実行してくれる。そしてFalseが返ってきた時点で一番左のタスクに戻る。(戻るわけじゃなくてFalseになるだけな気がする。以下の画像のコメント欄にも「右のタスクに戻る」って書いちゃったけどこれは今回のツリーに限った事であって、Sequenceそのものの機能がそういう事ではないはず。 2018/06/23追記)たぶんツリーを作りまくって体で覚えたほうが早い。
それとAbort Typeというやつを設定しなきゃならない。正直この辺をよく理解せずに先人たちのブログを見ながらこの記事を書いているし、この辺の説明をするにはツリーが小さすぎる。だからここでは、起こった事だけを書いておく事にする。たぶん次の記事でちょっと触れる。今詳しく知りたい人はこの記事のケツに参考にさせて頂いた記事へのリンクを貼っておくのでそっちを読んで欲しい。
とりあえずNoneのままだとCanSeeObjectがFalseを返したきり何も起こらなかった。どうやらCanSeeObjectが再評価されないらしい。このままだと例え視界にターゲットが入ってもCanSeeObjectはTrueを返せない。
という訳でSelf(↓のアイコンが付く)にしてみる。この場合期待通りの動作をしてくれた。ターゲットが視界内にいる場合追跡を行い、視界内に居ない場合は追跡を行わない。
ついでにLower Priority(→のアイコンが付く)にしてみた。すると一度追跡が始まるとターゲットが視界内から居なくなっても追跡は終了しなかった。CanSeeObjectが再評価されていないっぽい?
ちなみにBoth(↓と→のアイコンが付く)はSelfとLower Priorityを合体させた物らしく、これはSelfと同じ動作になった。
Sequenceの項目を書いていてだいぶ疲れたので後はRepeaterをサクっと設定して完成にしたい。設定というかRepeat Foreverにチェックを入れるだけ。これでRepeater以下のタスクは無限に繰り返される。
-
これで完成だ!動かしてみよう!
これは無限にCanSeeObjectがFalseを返しとる所。こんな感じで今実行しとるタスクが緑に光る。
こっちはCanSeeObjectがTrueを返しているのでSeekが実行されている所。この状態で視界内からターゲットが居なくなると↑の状態に戻る。
みんなのツリーも動いたかな????動いたよね????今回はここまで!!!!次回はSelectorとかいう奴が登場して、視界内にターゲットが居ない場合のタスクを作るよ!!!!
-
参考にさせて頂いた記事