第七話 Behavior Designer⑤
【注意】この記事は「とりあえず動いた」を記録するものです。記されている内容は、正しい用法ではない可能性があります。
ハウディ~~~~
Steamのサマーセールで脳や財布がユルユルになっているのでBEHAVIOR DESIGNER TACTICAL PACKを買ってしまった。
買ったのでこれを作った。
視界内に入ると敵が追ってきて一定の距離になると足を止めて撃ってくる。
これを作るためにやった事を書いておく。何がどうなっているかという説明はできない(知能ZERO)。各自買って試して欲しい。
弾を撃つ
EnemyにGunとBuller Spawn Posを追加した。
Attackタスクを使うだけで追跡と射撃をしてくれるんだけどちょっと準備が要る。
弾を撃つにはShootable(TacticalPackに付属)とかいうコンポーネントが必要。こいつをEnemyに追加した。
Attack Distanceは射撃開始する時の対象との距離。Repeat Attack Delayは射撃間隔。Attack Angleは撃てる角度のこと(?)。0にすると全然撃たないし360にすると真後ろに居ても射撃が開始される。
このままだとEnemyの中心から弾が生まれてしまいロクな事にならないしGunの先端にあるBuller Spawn Posから弾を出したいのでShootableをちょっと改造してBuller Spawn Posを選べるようにした。
こういうのを書き足して
public GameObject BulletSpawnPos;
適当に取得して
BulletSpawnPos = transform.Find("Gun/BulletSpawnPos").gameObject;
元からあるInstantiateに細工をする。
GameObject.Instantiate(bullet, BulletSpawnPos.transform.position, BulletSpawnPos.transform.rotation);
これで弾の出現位置を指定できた。
BulletはTacticalPackの付属品をそのまま使った。BulletにはBulletというコンポーネントが装備されており、こいつの数値をいじると威力や弾速を変更できる。
これで良しと思ったけど、ターゲット以外の物にぶつかった時に弾が消えないっぽかったのでif文の所にelseを増やしてDestroy(gameObject);を付け足した。
次に被弾可能なオブジェクトにHealth(TacticalPackに付属)とかいうコンポーネントを追加しないといけない。というわけでPlayerに装備した。HPとかもここで設定できる。こいつは改造していない。
Attackタスクの設定。敵をタグで指定できる。ほかの項目は試していないでち…。こいつ単体で追跡してくれるんだけど、速度や加速度を設定する項目は無い。改造して追加しようとしたけどちょっとよくわからなかった。C#に詳しい人なら出来ると思う。
とりあえずこれだけで「近づいて射撃」してくる。
ツリーにする
こいつを前回までに作ったツリーに組み込む。クッソ汚いツリーになった。おそらく無駄な部分がいくつかあるけど動いたのでよしとする。新要素を黄色で囲んである。Can See Objectは調整して1つ減らした。
Seekが変な所にいるけどこいつを使ってAttack中の速度と加速度を変えている。つまりWanderより速度と加速度を高くしてある。追跡はAttackがやってくれる。
まず下側にAttackを含むParallelのグループについて。Parallelは子タスクを全部一斉に実行してくれる。それ以外はSequenceと同じで、いずれかからFalseが返ってきたら実行が中断される。同じ感じでParallel Selectorとかいう奴もいるらしい。
詳しくはこちらの記事を読んだ方が良い。
Rotate Towardsを使ってPlayerの方向を向こうとしているけどAttackがやってくれるので多分いらない。なぜ追加したのかは覚えていない。たぶん旋回速度が欲しかったんだと思う。
Rotate Tow Childとかいうタスクを作った。作ったと言ってもRotate Towardsの中身をコピーしてちょっと改造しただけ。こいつはGunを敵の方向に向けるための物。
こういうのを書き足して
public GameObject ChildObject;
transform~になっとる部分をChildObject.transform~に変えたら動いた。適当に置換すると余計な部分まで置き換わってしまうので内容を読みながら作業した方が良い。
設定はこんな感じ。ほぼRotate Towardsの内容だけどChild Objectが増えてる。Child Objectに回転させたいオブジェクトを選ぶ。Targetにターゲットとなるオブジェクトを設定する。Rotate EpsilonとMax Look At Rotation Deltaについては文字で説明しづらいので実際に色々な数字をいれてみてほしい。
そして先ほど作ったAttackがある。Parallelのおかげでこの3つが同時に実行される。少なくともAttackしながらRotate Tow Childすれば正しく動くと思う。
次に右側のParallelについて。こっちでは元々あったWanderとRotate Tow Childを同時に実行している。
Rotate Tow Childを使ってGunの向きを親であるEnemyと同じ向きにするようにした。Vector3の変数を作って、EnemyのTransformのeulerAnglesを入れた。名前はParentDirectionにした。
Rotate Tow Childタスクの設定。Targetは無し。Target Rotationにさっき作ったParent Directionを設定した(Targetが存在しない場合Target Rotationの方向を向いてくれるらしい)。
Wanderは前回までと同じ。
これで動画の通りの動きになるはずだ!!!!皆も試してみてくれ!!!!
おわり!!!!!!!!
第六話 Behavior Designer④
【注意】この記事は「とりあえず動いた」を記録するものです。記されている内容は、正しい用法ではない可能性があります。
今回はEnemyをPrefab化する話をします。
-
Prefab化するぞ
しました。
すると…
SeekやCan See ObjectのInspectorをみるとTargetがNoneになっとるやんけ!!!!
Scene内のPlayerをTargetにすると怒られます。
というわけでツリーの中に「追跡対象を取得する」を実装しよう!!!!
-
変数をつくる
Variablesから変数をアレできます。今回はPlayerというGameObjectをゲットしたいのでGameObjectを選びます。名前はPlayerObjectにしました。
Addを押すかName欄でエンターキーを押すと追加されます。
-
Playerを取得する
という訳でタスクを追加していきましょう…なんか見覚えのある名前がたくさんありますね!!!!
今回は大人しくGameObjectのFindを選びます。
Game Object Nameの欄には取得したいGameObjectの名前を入力しましょう。今回はPlayerと入力します。次にStore Valueを先ほど作ったPlayerObjectに指定します。これでPlayerと言う名前のGameObjectをPlayerObjectに格納してくれるようになりました。
このタスクを一番初めに実行してほしいので、Sequenceの一番左に設置します。これでPlayerを取得してからほかの処理が実行されるようになったぞ!
これで完成…と言いたいところなんだけどもうちょっとだけ付き合ってくれ!
-
おまけ:視界の問題
この状態でPrefabをいくつか配置して追いかけっこしてみるとお分かり頂けると思うんだけど、EnemyがEnemyによって視界を遮られるので、Enemyの後ろのEnemyが追跡を止めてしまう問題が起こります。
なので、第四話でちょっと話した気がするIgnor Layer Maskを使ってEnemyはEnemyを透視できるようにしましょう。やり方は簡単というか皆様お察しの通り透視できるLayerを選ぶだけです。
まずEnemyにLayerを指定します。今回は適当にEnemyというLayerを作りました。
次にすべてのCan See ObjectのIgnor Layer MaskにEnemyを追加しましょう。
これでOK!!!!!!!!縦に並んで追ってくるようになった。
これでAIっぽいものが組めました。
次回のネタは考え付いていません。お疲れ様でした。
みんなもBehavior Designerを買って楽しいAI製作ライフをおくろう!!!!
第五話 Behavior Designer③
【注意】この記事は「とりあえず動いた」を記録するものです。記されている内容は、正しい用法ではない可能性があります。
ハウディーーーーーーーーーーーーーーーーーーーーーーーーー今日も元気にツリーを作るぞ!!!!!!!!
-
タスクを追加してツリーを改造しよう
今回は前回作ったツリーを改造して、「視界内にターゲットが居ない場合、マップ上を散歩する」ようにします。さっそくタスクを追加していきましょう。
早速SelectorをRepeaterとSequenceの間に追加し、Wanderを追加してSelectorにつなぎましょう。↓こんな感じになる。
ついでにSequenceのAbort TypeをBothに変えると、これだけで動く。以上!作業完了!お疲れ様でした!
-
説明
SelectorはSequenceと同じく子タスクを左から順番に実行してくれますが、Falseが返ってきた際に右隣の子タスクを実行してくれます。今回のツリーでは、CanSeeObjectがSequenceにFalseを返した場合Wanderを行ってくれます。
という訳で実行中の子タスクがTrueのとき次の子タスクを実行するSequenceと実行中の子タスクがFalseのとき次の子タスクを実行するSelectorを組み合わせてツリーを作っていくことになります。もちろんこれらのタスクにTrueかFalseかを返すタスクも必要です。今回はCanSeeObjectしか使ってないけどね。
Wanderは勝手にマップ中をうろうろしてくれるすごい奴です。使い方に関してはInspectorを見ていただいた方が早いと思います。一方で指定の経路をパトロールさせたい場合にはPatrolというタスクを使います。今後使うかもしれません。
SequenceのAbort TypeをBothに変えた件に関しては、超絶ふわっとした事を言う感じになってしまって申し訳ないのですが、タスクに表示される矢印のアイコンとタスクの位置が関係してるんじゃないかと思い始めています。前回はSequenceから見て下にあるCanSeeObjectとSeekに遷移するだけでよかったので↓矢印が表示されるSelfでよかったのですが、今回はSequenceの右隣にあるWanderに遷移する必要が出てきました。なので↓矢印と→矢印を兼ね備えたBothを選択することで正しく動作することが出来るようになったのではないかと考えています(この記事はBehavior Designerを初めて1週間も経っとらん奴が書いています)。
-
おまけ
CanSeeObjectを増やして視界範囲をそれっぽくしてみたよ。Selectorを使って1つめの視界がFalseのとき次の視界の判定に遷移するようにしたよ。いずれかの視界からTrueが返ってきたとき、SequenceによりSeekが実行されるよ。また、Abort Typeは遷移すべきタスクが下にも右にもあるのでBothにしたよ。しかしLower Priorityでも動作する事が判明。その上この状態でSequenceのAbort TypeをLower Priorityしても問題なく動作した。ちょっとよくわからない。
謎が深まりまくるBehavior Designer。使い続ける事で理解できる日が来るのだろうか。
という訳で「動いたけどなんで動いてんのかいまいち理解していない話」でした。次回はEnemyをPrefabにした時のアレを書くかも。
第四話 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とかいう奴が登場して、視界内にターゲットが居ない場合のタスクを作るよ!!!!
-
参考にさせて頂いた記事
第三話 Behavior Designer①
いよいよ本題のBehavior Designerを使っていきます。
この記事は明日の僕およびBehavior Designerを買ったけど詰んどる奴に向けて書かれているためUnityの説明とかはありません。
Behavior Designerの説明もたぶんありません。「こうやったら動いた」を記録するだけです。ご了承ください。
-
Behavior Designerで何すんの?
ゲームに登場するキャラのAIを作ります。
↓こういうのを作ると(カルネージハートのアレではない)
↓こういうのができます
何をしとるかと言うと
1.追跡対象(プレイヤー)のゲームオブジェクトを取得する
2.視界内に追跡対象があるかを判定する
3.無ければゆっくり散歩する
4.有れば全速力で追う
をしています。2以降がループしているので視界内に出たり入ったりする事で3になるか4になるかが変わります。
何がヤバいかと言うと一切プログラミングしとらんという点です。僕が瀕死になりながらC#で作ったRTSの敵キャラの動きが数時間で組めると思います。
-
Behavior Designer: Movement Packを買え!!!!
AIを作る上で必要不可欠な移動に関するタスクが入っている所謂DLCです。Behavior Designerではタスク(命令の中身とか分岐の中身とかのチップみたいな奴)を自作する事ができるのですが、自作の苦しみと10ドルを天秤にかけた結果、買えという結論に至りました。買え!!!!!!!!
-
Behavior Designerを装備しよう
ダウンロードしてインポートしたらさっそく召喚しましょう。
たぶんToolsに入ってるのでEditorを押すとウィンドウが出ます。
これで準備は完了です。次回からツリーを作っていくよ~~~~!!!!
第二話 活動記録
- せっかくのブログなので何か記事を書こうと思い、これまで作ったゲームを振り返ってみようと思うよ。ゲームはここで遊べたり遊べなかったりするよ。
-
1作目 ぷにひくずし
Unityを初めて1週間くらいで作った。何も考えずにUnityのチュートリアルを見ながら製作したので初期のゲームはJavaScriptで動いている。バーや球が壁を突き抜けたり何もしとらんのに勝手にゲームクリアになったりするバグを抱えとる。
-
2作目 プニヒドライブ
物理演算に味を占めて作ったクソゲー。プログラミングの知識は皆無だった(今も無い)けどこの頃は純粋に作るのが楽しかった。
-
3作目 バトルプニヒ(仮)
調子に乗って作ったTPS。この頃からUnityの闇に吞まれ始める。バグが多く放置されており、しんどかった形跡が見える。人類で初めてTPSを作った人間は相当イカれているなあと思った。いずれ作り直したい。
-
4作目 ウルトラプニヒボール
Unityの本を入手し、JavascriptからC#に乗り換えた。C#の練習がてら本を見ながら作ったモノだけど最高傑作と名高い。ゲームの楽しさというのはだいぶ原始的な部分が評価されてるんじゃないかと思い始める。
-
5作目 パチンコプニヒ
これも教本を見ながら作った。前作と比べると明らかにつまらない。
-
6作目 フランカスロウクリッカー
プログラミングとかボタンとかの練習のための作品。明らかに悪ふざけである。元ネタはAge of Emipires II: HD Editionに登場するフランク文明のユニークユニット。
-
7作目 プニヒエアレース
個人的にお気に入りの作品。この頃は3Dモデルに関する知識がゼロで、このゲームのモデルは元々趣味で使っとったCADソフトを使ってモデリングされておる故、機体やプニヒのポリゴン数がえらいことになっている。余裕で5ケタポリゴンを超えている。それでも動くんだからUnityはすごい。でも当然場面によっては重い。これは是非作り直したい。
-
8作目 プニヒコマンダー
こんなものは素人が一人で作るものではない。人類で初めてRTSなんてモノを作った奴は完全にイカれとる。初めは冗談でRTS作りてえなあ~作るか~とか言っていたのだが、Youtubeにアップされとる外国人兄貴のチュートリアル動画のプログラムを丸写しにしとったら動いちまったんで後戻りできなくなった。この頃Blenderとかも初めて、プニヒのモデルを作った。なんだかんだで結局1年ほどかかった。
なんとかゲームシステムが完成した辺りで、(6月でサービスを終了する)ロボットアナル掘削選手権大会とかいうゲームで知り合った殺人水上機が力を貸してくれるようになる。敵キャラクターや背景オブジェクトの3Dモデルを作ってもらった。有り難い話である。
マジでしんどかったので、頼むからダウンロードして遊んでくれ。動画を見るだけでもいい。ちなみにコレも作り直したい。俺たちはRTSで義務教育を済ませているからな。
♥動画♥
-
9作目 プニヒVS水棲生物軍団
モデリングとアニメーションの練習。雑魚キャラの歩行サカナはミスター殺人水上機の作品。小粒なゲームながら時間がかかってしまった。アニメーションをうまく制御する方法を見つけるなり買うなりせにゃならん。WebGl版は重さとの戦いだった。なんか軽くなるいい方法ありませんか。
この頃からゲーム開発Discordの人数が増える。これまでは殺人水上機と二人でロボットケツ掘り大会の話しかしとらんかったのが、一気に華やかになった。皆それぞれのDO IT地獄をやっとる。頼もしい。
-
10作目 ぷにひくずし改二
ぷにひくずし改は存在しとらん。
10作目という事で気合入れてもう一回ブロック崩し作ったろという事で作った。正直な所途中で飽きてしまい適当な出来になっとる気がする。というのも、ここに来てオブジェクトの親子関係とコライダーの関係の闇に吞まれてしまい、当たり判定系との長い戦いが発生してだいぶ疲れてしまった。なお、このゲームには実装されとらんが弾痕の表示とかも研究した。シューティングゲームを作る期会があれば実装したい。
-
10.5作目 牛巻と一緒に作ったじゃんけんのゲーム
牛巻りこという素晴らしいバーチャルユーチューバーが居る。彼女の特技はなんとUnity。一時間の生配信でゲームを作る回があり、その際に製作した。こんなブログ読んどらんでいますぐお前もUnityをダウンロードし、牛巻の配信のアーカイブを見に行った方が良い。
♥動画♥
【必見】牛巻様の配信アーカイブはこちらです。
【アイドル部】牛巻と牧草でじゃんけんゲーム作ろう企画【一時間Unityゲーム制作】【視聴者参加型企画】 https://youtu.be/CjenTLPBUKk
-
11作目 ギリギリ労働
unityroomさんの1週間ゲームジャムに参加した作品。納期があるとパキパキ作れて良い。サクっと作ろうと思ってたのに絵を出したり文字を出したりして疲れた。
Discordでお前らも出ようぜって言ったらマジで殺人水上機が出てくれた。ありがとう。
♥動画♥
以上です。
この記事を書くのにすごく時間がかかった。
肝心のBehavior Designerの記事を作る体力は果たしてあるのだろうか…。
第一話 終わりの始まり
- このブログは蟹野横信がゲームを作ったり作らなかったりした記録を残すための物です。
- 殺人水上機という男にBehavior Designer(セールの時に買って積んでる)の記録を残し給えと言われたので忘備録として残しておこうという事になった次第です。
- 普段はYoutubeに日記代わりの製作記録動画をアップロードしているので今までの僕の活動を確認してやるという奇特な方は動画を見て欲しい。でも僕の動画よりもバーチャルユーチューバーを見た方が良い。