221Games開発記録

痔と腰痛に苦しみながらゲームを作った記録

第七話 Behavior Designer⑤

【注意】この記事は「とりあえず動いた」を記録するものです。記されている内容は、正しい用法ではない可能性があります。

 

ハウディ~~~~

Steamのサマーセールで脳や財布がユルユルになっているのでBEHAVIOR DESIGNER TACTICAL PACKを買ってしまった。

assetstore.unity.com

買ったのでこれを作った。

youtu.be

視界内に入ると敵が追ってきて一定の距離になると足を止めて撃ってくる。

これを作るためにやった事を書いておく。何がどうなっているかという説明はできない(知能ZERO)。各自買って試して欲しい。

 弾を撃つ

EnemyにGunとBuller Spawn Posを追加した。

f:id:kaninoyokonov:20180627220408p:plain

f:id:kaninoyokonov:20180627220132p:plain

Attackタスクを使うだけで追跡と射撃をしてくれるんだけどちょっと準備が要る。

弾を撃つにはShootable(TacticalPackに付属)とかいうコンポーネントが必要。こいつをEnemyに追加した。

Attack Distanceは射撃開始する時の対象との距離。Repeat Attack Delayは射撃間隔。Attack Angleは撃てる角度のこと(?)。0にすると全然撃たないし360にすると真後ろに居ても射撃が開始される。

このままだとEnemyの中心から弾が生まれてしまいロクな事にならないしGunの先端にあるBuller Spawn Posから弾を出したいのでShootableをちょっと改造してBuller Spawn Posを選べるようにした。

f:id:kaninoyokonov:20180627215645p:plain

こういうのを書き足して

public GameObject BulletSpawnPos;

適当に取得して

BulletSpawnPos = transform.Find("Gun/BulletSpawnPos").gameObject; 

 元からあるInstantiateに細工をする。

GameObject.Instantiate(bullet, BulletSpawnPos.transform.position, BulletSpawnPos.transform.rotation); 

 これで弾の出現位置を指定できた。

BulletはTacticalPackの付属品をそのまま使った。BulletにはBulletというコンポーネントが装備されており、こいつの数値をいじると威力や弾速を変更できる。

f:id:kaninoyokonov:20180628000543p:plain

これで良しと思ったけど、ターゲット以外の物にぶつかった時に弾が消えないっぽかったのでif文の所にelseを増やしてDestroy(gameObject);を付け足した。

f:id:kaninoyokonov:20180628000938p:plain

 

次に被弾可能なオブジェクトにHealth(TacticalPackに付属)とかいうコンポーネントを追加しないといけない。というわけでPlayerに装備した。HPとかもここで設定できる。こいつは改造していない。

f:id:kaninoyokonov:20180627222216p:plain

 

Attackタスクの設定。敵をタグで指定できる。ほかの項目は試していないでち…。こいつ単体で追跡してくれるんだけど、速度や加速度を設定する項目は無い。改造して追加しようとしたけどちょっとよくわからなかった。C#に詳しい人なら出来ると思う。

f:id:kaninoyokonov:20180627222435p:plain

とりあえずこれだけで「近づいて射撃」してくる。

 ツリーにする

こいつを前回までに作ったツリーに組み込む。クッソ汚いツリーになった。おそらく無駄な部分がいくつかあるけど動いたのでよしとする。新要素を黄色で囲んである。Can See Objectは調整して1つ減らした。

f:id:kaninoyokonov:20180627231400p:plain

Seekが変な所にいるけどこいつを使ってAttack中の速度と加速度を変えている。つまりWanderより速度と加速度を高くしてある。追跡はAttackがやってくれる。

 

まず下側にAttackを含むParallelのグループについて。Parallel子タスクを全部一斉に実行してくれる。それ以外はSequenceと同じで、いずれかからFalseが返ってきたら実行が中断される。同じ感じでParallel Selectorとかいう奴もいるらしい。

詳しくはこちらの記事を読んだ方が良い。

qiita.com

 

Rotate Towardsを使ってPlayerの方向を向こうとしているけどAttackがやってくれるので多分いらない。なぜ追加したのかは覚えていない。たぶん旋回速度が欲しかったんだと思う。

 

Rotate Tow Childとかいうタスクを作った。作ったと言ってもRotate Towardsの中身をコピーしてちょっと改造しただけ。こいつはGunを敵の方向に向けるための物。

こういうのを書き足して

public GameObject ChildObject;

transform~になっとる部分をChildObject.transform~に変えたら動いた。適当に置換すると余計な部分まで置き換わってしまうので内容を読みながら作業した方が良い。

f:id:kaninoyokonov:20180628001225p:plain

設定はこんな感じ。ほぼRotate Towardsの内容だけどChild Objectが増えてる。Child Objectに回転させたいオブジェクトを選ぶ。Targetにターゲットとなるオブジェクトを設定する。Rotate EpsilonとMax Look At Rotation Deltaについては文字で説明しづらいので実際に色々な数字をいれてみてほしい。

f:id:kaninoyokonov:20180627230705p:plain

 

そして先ほど作ったAttackがある。Parallelのおかげでこの3つが同時に実行される。少なくともAttackしながらRotate Tow Childすれば正しく動くと思う。

 

次に右側のParallelについて。こっちでは元々あったWanderRotate Tow Childを同時に実行している。

Rotate Tow Childを使ってGunの向きを親であるEnemyと同じ向きにするようにした。Vector3の変数を作って、EnemyのTransformのeulerAnglesを入れた。名前はParentDirectionにした。

f:id:kaninoyokonov:20180627232542p:plain

Rotate Tow Childタスクの設定。Targetは無し。Target Rotationにさっき作ったParent Directionを設定した(Targetが存在しない場合Target Rotationの方向を向いてくれるらしい)。

f:id:kaninoyokonov:20180627232827p:plain

Wanderは前回までと同じ。

 

これで動画の通りの動きになるはずだ!!!!皆も試してみてくれ!!!!

おわり!!!!!!!!