前回は敵の中ボス(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関数で実現可能ですが、消えたタイミングで爆発演出を発動させたいので、コルーチンにしました。
Start関数では2つの処理を行っています。
まずはいつも通り、Rigidbody2Dコンポーネントを取得して、宣言した変数に代入。
❸もう一つは❷で作成した関数を発動しています。コルーチン型関数を発動するときは、「StartCoroutine(関数名())」でしたよね?
Update関数でも2つの処理を行っています。
❹まずはRigidbody を使って移動を行っています。velosity の yに、0.005 だけ力を与えています。
❺さらに落下の演出を実現するために、大きさで落ちていく様子を表現しています。LocalScaleのx、y とも0.0005 ずつ小さくしています。
❹❺、さらに❷のWaitForSecondsで指定した消滅までの時間に関してはそれぞれ好きな値を指定し、オリジナルの動きを作ってみましょう。
Rigidbody2D rb2d;
[SerializeField] GameObject explosion; //爆発のプレハブ
IEnumerator shot() //❷コルーチン型関数(爆弾の動き)
{
yield return new WaitForSeconds(4f); //4秒待つ
Destroy(gameObject); //自分自身を削除
Instantiate(explosion, transform.position, Quaternion.identity); //爆発を生成
}
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
StartCoroutine(shot()); //❸コルーチン型関数を発動
}
void Update()
{
rb2d.velocity -= new Vector2(0, 0.005f); //❹移動の力を与える
transform.localScale += new Vector3(-0.0005f, -0.0005f, 0); //❺徐々に小さく
}
MissileプレハブのInspectorに[SerializeField] で指定したExplosionのスペースができているはずです。ここに最初の課題で作成した、「MissileExplosion」をセットしておきましょう。
これでミサイルが投下され、Y座標を少しずつマイナス方向に移動、大きさが徐々に小さくなり、4秒後に爆発、までができました。
3,EnemyStationAのダメージ
今回はダメージを受けるところまで作っておきます。
スクリプトファイル「EnemyStationAManager」を立ち上げて以下のコードを追加します。
ここではダメージ判定の動きを追加します。
まず hp を宣言し、Start関数で初期値:20を代入します。
❻ではイベント関数「TriggertRnter2D()」で侵入判定を行っています。
侵入したオブジェクト(collision)が持っているタグを調べて、指定した"PlayerMissile"だったら以下の処理を行います。
hp--; これは hp = hp - 1 という意味でしたよね?デクリメントといいます。
さらに確認のため、 Debug.Log() でhp を言わせてみましょう。
以前に記述したデバッグが残っているかもしれないので、「"中ボスHP:"+hp」と指定します。これで中ボスのHPがわかりやすくなります。
int hp;
void Start()
{
hp = 20 //hp に20を代入
}
private void OnTriggerEnter2D(Collider2D collision) //❻侵入判定
{
if (collision.tag == "PlayerMissile") //侵入したタグが"PlayerMissile"なら
{
hp--; //hpを1ずつ減少
Debug.Log("中ボスHP:"+hp); //デバック
}
}
では保存をして動かしてみましょう。
現段階では比較的簡単に倒せると思います。爆弾の発射制限も必要そうですね。
下の図のようにConsoleにデバッグで指定した文字も表示されますよ。
ハイ、では今回はここまで。
次回は中ボスを倒して、倒した際の爆発演出もやってみたいと思います。
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。
お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。
過去の作品はこちらから。
Vol.01~Vol.10 は下のVol.11 文末のリンクからどうぞ
Comments