top of page

Unityで「シューティングゲーム」をつくろう!Vol.21

前回は敵の中ボス(EnemyStationA)の移動を作ってみました。ただ現状ではEnemyStationA を倒すことができません。今回は Player が爆弾を投下して、EnemyStationA を爆発する動きを作ってみましょう。

ただ、「爆弾が EnemyStationA に当たったらダメージを受ける」という動きでは「投下」という演出がいまいちです。投下したら、ゆっくりしたに落ちていくようなイメージを作り、数秒後に爆発させます。爆発のタイミングで爆発エフェクトを生成し、そのエフェクトに EnemyStationA が当たったらダメージを受けるような感じにしましょう。

まとめると・・・、


①Player が「Xキー」を押したときに爆弾が生成

②生成された爆弾は、ゆっくりY座標をマイナス方向に移動

 同時に大きさを徐々に小さくして、奥に移動しているような演出を実現

③4秒後に爆弾が爆発、爆発エフェクトを生成

④爆発エフェクトにEnemyStationAが触れたら、EnemyStationAはダメージを受ける


今回はここまで作っていきたいと思いますよ。

ちょっと長いかもしれませんが、頑張りましょう!


その前に、前回までの EnemyStationA で1か所だけ修正させてください。現状、PlayerがEnemyStationA に触れるとダメージを受けてしまいます。イメージではEnemyStationA の上を通過するだけなので、ダメージは受けませんよね?

ということでタグを変更します。

下の図のように「EnemyStation」というタグを指定して、EenmyStationAにセットしましょう。

では今回の課題を進めていきます。

 

1,爆弾の生成

まずは爆弾を準備します。


①いつもと同じように、取得済みのアセットから「Missile」の画像をとりこみ、Hierarchy上にドラッグ&ドロップ。

サンプルでは、Missile(3) の画像を利用しています。


②素材の画像を選択し、Inspector で Pixcels Par Unit を20 程度にして「Apply」ボタンを押します。これで画像が大きくなります。

Hierarchyにアップした素材を選択し、Inspectorを表示、以下の項目を修正します。


③名前を「Missile」に変えておきます。


④Transformコンポーネントの各パラメータ値を指定します。

 Position は適当で結構です。他のオブジェクトとかぶらないようにしておきましょう。

 Scale も元の素材で修正したので変更なし。大きさ気になるようであれば、ここで調整可能です。


⑤Sorting Layer に「Player」を指定。


⑥続いて「Rigidbody2D」コンポーネントを追加します。

ここでは Grabity Scale を 0 にするだけでOKです。

続いて爆発のエフェクトも作っておきましょう。

現在、[03_Prefab]というフォルダに「Explosion」という爆発プレハブがあると思います。これを複製して、ミサイル用の爆発エフェクトを作ります。


⑦フォルダ内に「Explosion」を複製します。コントロールキーを押したままドラッグ&ドロップで複製可能です。

名前を「MissileExplosion」にしておきます。

上で作成した「MissileExplosion」を修正します。


⑧Tagに「PlayerMissile」を作成しセットします。


⑨Transformコンポーネントの各パラメータ値を指定します。

 Position は適当で結構です。他のオブジェクトとかぶらないようにしておきましょう。

 Scale はXとYを変更し、3倍の大きさにしておきます。

⑩ParticleSystemコンポーネントの各パラメータを修正します。

ここは項目が多いですね?意味がよくわからない場合は、一時的に日本語に変更してしまうのも手です。

今回は下の図のように、継続時間、遅延時間、生存時間、色などを変更しています。

⑪Sorting Layer に当たるものは、ParticleSystemコンポーネント中のRenderer にあります。Sorting Layer ID に「Turret」を指定します。

⑫CircleCollider2D コンポーネントを追加します。

IsTriggert にチェックを入れて、侵入判定用にしておきます。


これでオブジェクトの準備ができたので、プログラミングを書いていきましょう。

まずは「PlayerController.cs」を立ち上げて以下のコードを記述します。


Player の動きは簡単です。

すでに作成済みの関数「Shot()」を改造します。


❶ xキーを押したときに、ミサイルのプレハブを生成する if 文ですね。

生成する関数「 Instantiate()」は何度も使っているのでわかると思います。

 

[SerializeField] GameObject missile; //Missileプレハブ


void Shot() //修正

{

if (Input.GetKeyDown(KeyCode.Space)) //記述済み

{

//記述済み(省略)

}

if (Input.GetKeyDown(KeyCode.X)) //❶X.キーが押されたら

{

//ミサイルプレハブを自分の場所に生成

Instantiate(missile, transform.position, transform.rotation);

}

}

 

出来たら、Inspectorに[SerializeField] で指定したmissile を入れるスペースができていると思います。先ほど作成した、Missile のプレハブを指定しておきましょう。

 

2,爆弾(Missileプレハブ)の動き

続いて投下されたMissileプレハブのプログラムを行います。

スクリプトファイル「PlayerMissile」を作成し、Missileプレハブにアタッチしておきます。「PlayerMissile.cs」を立ち上げて以下のコードを記述します。


まず変数を2つ宣言しています。

1つはいつも使っている、Rigidbody2Dコンポーネントを使うための変数。

もう一つは、この後生成する爆発のプレハブです。上の課題で作成したものですね。


❷この爆弾は4秒後に削除します。n秒後に削除するというプログラムだけなら、Destroy関数で実現可能ですが、消えたタイミングで爆発演出を発動させたいので、コルーチンにしました。