前回は敵の中ボス(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関数で実現可能ですが、消えたタイミングで爆発演出を発動させたいので、コルーチンにしました。