現場レベルのゲーム制作が、すべてここで学べます。
前回(第6回)では、ウェーブを作って、敵オブジェクトの出現パターンを制御する仕組みを用意しました。
前回の記事↓

見た目だけは大分ゲームらしくなってきましたが、まだ敵を倒すことが出来ません。 今回は敵の当たり判定(Collider2D)の作成、弓(Bow)と矢(Arrow)の作成をやっていきたいと思います。
例えばシューティングゲームなら自機の移動や弾を撃つところ -
などから作り始めることが多いのですが、タワーディフェンスは「守る」ゲームなので敵が来ないと始まらないため、このような順番になっています。
敵オブジェクトに当たり判定を付ける
敵オブジェクトを攻撃(探索)するためには、画像だけでは駄目で、当たり判定(Collider2D)とレイヤーをセットする必要があります。
用意した敵オブジェクトのprefabが Assets/Prefabs の中にあると思います。

まず、このEnemy (1) に当たり判定(Collider2D)を追加したいです。
既に作ってあるプレハブに何かComponentを追加するには「プレハブ編集モード」に入る必要があります。
Enemy(1) をダブルクリックしてください。
すると、HierarchyビューとSceneビューが、このようにダブルクリックしたEnemy(1)のコンテンツだけになると思います。

これが「プレハブ編集モード」です。
敵キャラの当たり判定(Collider2D)の追加
この状態で Enemy(1) を選択し、InspectorビューでAddComponentをします。

この敵は四角いので、BoxCollider2D というものを追加します。


この薄い緑色の線が当たり判定です。
ですが見ての通り実際の画像に比べてあたり判定が大きくなってしまっているので調整しましょう。
InspectorのBox Collider 2D の Edit Collider というボタンを押します(画像内赤枠)

するとSceneの方のCollider表示に緑の小さい■がつきます。
これをドラッグすることで、Sizeを変更することができます。画像に合わせて調整をしてください。

(※もしくは、Size の X に直接 0.6 と入れてもよいです。マウス操作が苦手な方はこちらの方法で)

敵キャラクターのレイヤーの指定
次に、レイヤーの指定をします。
Inspectorの上部に Layer という項目があります。何も設定していないので、「Default」になっているはずです。
このLayerをクリックしてドロップダウンからEnemyを選択します。


すると、以下のダイアログも表示されると思います。 これは、子要素を持つオブジェクトのレイヤーを設定しようとすると必ず出てきます。

子要素のLayerも一緒に変更するかどうか。
を尋ねられているので、Yes change children を選択します。
Layerの設定が終わりましたら、プレハブ編集モードから抜けます。
プレハブ編集モードから抜けるにはHierarchyビューの「<」またはSceneビューの「Scenes」をクリックします。

その他全てのEnemyオブジェクトに当たり判定とLayerの設定を行いましょう。
同じ要領で、Enemy(2)にもColliderを付け、LayerをEnemyに変更します。


最後に、Enemy にもColliderを付けたいのですが、Enemyは四角ではなく楕円なので、BoxCollider2D ではなくCapsuleCollider2Dを付けます

こちらもちょっと画像とColliderがあっていないので、Edit Colliderボタンを押して修正します。

(※もしくは、Size に直接 X 0.6、Y 0.97 と入れてもよいです) そして、忘れずにLayerをEnemyに変更しておいてください。

これで、攻撃をする準備が出来ました。
弓(Bow)の作成 コルーチンを用いて指定時間ごとに処理を行う
次に攻撃をするためのユニット、弓(Bow)を作りましょう。まず、弓の空オブジェクトを作っていきます。
Hierarchyビューに、新規オブジェクト(CTRL+SHIFT+N)を作成し、新規ScriptもAddComponentしておきます(いつもの流れですね)
- 名前:Bow
- スクリプト名:Bow
なお、Transform の Position は
- X : -2
- Y : -2
- Z : 0
にしておいてください。 次に弓の画像として、Assets/Images/item_bowを使います。
このitem_bowをHierarchyビューの先ほど作ったBowオブジェクトの子要素になるようにドラッグアンドドロップします。 この子要素として配置されたitem_bowは
- Transform を Reset(PositionのX,Y,Zを0に)
- Order in Layer を 10
にしておきます。

今から作成するのは弓なのですが、矢がないとちょっと分かりづらいですね。
というわけで、矢の画像も追加しましょう。
Assets/Images/item_arrowを使います。
このitem_arrowもHierarchyビューの先ほど作ったBowオブジェクトの子要素になるようにドラッグアンドドロップします。
この子要素として配置されたitem_arrowは
- Transform を Reset(PositionのX,Y,Zを0に)
- Order in Layer を 11
にしておきます。

Hierarchy上はこのような階層になります。
では、Bowスクリプトの中身を書いていきます。 このBowに必要な要件としては
- 一定間隔で周囲の敵を探す
- 矢(Arrow)を撃つ
になります。
まだ、矢(Arrow)は作ってませんので、この「一定間隔で周囲の敵を探す」を実装していきます。
この「一定間隔」で処理を行いたい場合、Update関数で上手く時間を計測して処理をするように書くこともできますが、コルーチンという機能を使うと直感的に処理を書くことが出来ます。
Bowスクリプトを以下のように書き換えます。
おさらいと次回予告
今回は当たり判定の設定と、弓矢の作成をしました。
ついに攻撃が出来ました。 次回はこの弓矢をプレイヤーが配置出来るようにしていきます。
次回の記事↓

現場レベルのゲーム制作が、すべてここで学べます。






コメント
弓矢を作成した段階で実行を押すとUnity自体がフリーズしてしまい先に進めません。
弓矢のオブジェクトを削除すると動くのでBowScriptに問題があるのだと思いますがエラーが出ないため解決策が分かりません。
どうすればいいでしょうか?解決策などがあれば教えて頂けると幸いです。
最後までちゃんとできるはずですし、できた読者さんがいるので過去の記事含めて作ってる途中でどこかミスしてるのかなと思います。
この質問だとちょっと答えようがないです汗
この回を3回やりなおしたのですが、
矢のデストロイや矢が飛びません。
unity6で行っておりますが、アップデートは難しいでしょうか?
この回までは普通に作成できました。
アップデートをお願いします
unity6以降とそれ以前ではエディタや機能の変化も大きめなので自力解決できない場合はひとまずエディタのバージョンを変更しての開発をお勧めします。
よろしくお願いいたします。