おもちゃラボ

Unityで遊びを作ってます

【Unity入門】60分で作るシューティングゲーム 第2回

前回はUnityのプロジェクトを作成し、キーボードでロケットを動かすところまで作りました。

nn-hokuson.hatenablog.com

今回はシューティングゲーム作りの第2回です。スペースキーを押したら、ロケットの先端から弾が発射されるようにします。

第1回 ロケットを動かそう
第2回 弾を発射しよう
第3回 隕石を落下させよう
第4回 当たり判定をしよう
第5回 ゲームオーバを判定しよう
第6回 お化粧をしよう

弾のスプライトを配置しよう

ロケットから弾を発射する流れは次のようになります。

  1. 弾を1つだけ表示して画面上方向に移動するようにします。
  2. 作成した弾をもとにして弾のPrefab(設計図)を作ります。
  3. スペースキーを押すたびにPrefabから弾のインスタンスを作ります。

ロケットを配置した時と同じように、弾のスプライトを画面上に配置しましょう。
プロジェクトビューから「bullet」を選択し、シーンビューにドラッグ&ドロップして下さい。
弾を配置する座標は後ほどスクリプトで指定するので、ここでは適当でかまいません。

f:id:nn_hokuson:20160703131017p:plain:w500

弾が配置できたら、次は弾を上方向に移動させるスクリプトを作成します。
プロジェクトビューで右クリックし「Create」→「C# Script」でスクリプトを作成し、ファイル名を「BulletController」に変更します。

f:id:nn_hokuson:20160703131228p:plain:w500

作成した「BulletController.cs」を開き、次のスクリプトを入力して下さい。

using UnityEngine;
using System.Collections;

public class BulletController : MonoBehaviour {
	void Update () {
		transform.Translate (0, 0.2f, 0);

		if (transform.position.y > 5) {
			Destroy (gameObject);
		}
	}
}

ここでもロケットを動かしたときと同じようにTranslate関数を使って弾を毎フレーム0.2fづつ上方向(y軸方向)に移動しています。

ただし、このままだと弾が画面の外にでてからも動き続けることになります。
見えない場所で動かし続けるのはCPUの無駄使いなので、画面の上端(y=5)をこえた場合にはDestroyメソッドを使って弾を破棄します。


ファイルを保存できたら、ロケットの時と同様にスクリプトをアタッチしましょう。
プロジェクトビューの「BulletController」を「bullet」にドラッグ&ドロップして下さい。

f:id:nn_hokuson:20160703131433p:plain:w500

スクリプトがアタッチできたら、ゲームを実行してみてください。弾が上方向に移動しましたね。

f:id:nn_hokuson:20160703131736g:plain

弾のPrefabを作ろう

UnityにはPrefabという仕組みが用意されています。
Prefabは設計図のようなもので、一度作っておけば同じものを簡単に複製できるという特徴があります。詳しくは「Unityの教科書」で説明しているので、そちらを参照して下さい。

弾のPrefabを作るためヒエラルキービューから「bullet」を選択し、プロジェクトビューにドラッグ&ドロップします。
作成したファイル名を「bulletPrefab」に変更します。

f:id:nn_hokuson:20160703131918p:plain:w500

Prefabが作れたら、画面上に配置した弾は不要です(設計図があればいつでも作れるため)ヒエラルキービューから「bulletPrefab」を選択し、右クリック→「Delete」を選択します。

f:id:nn_hokuson:20160703132034p:plain:w500

Prefabからインスタンスを作ろう

次はスペースキーが押されるたび、弾のPrefabをから弾のインスタンス(複製)を作るスクリプトを作成しましょう。

前回作成した「RocketController.cs」を開いて次のようにスクリプトを修正します。

using UnityEngine;
using System.Collections;

public class RocketController : MonoBehaviour {

	public GameObject bulletPrefab;

	void Update () {
		if (Input.GetKey (KeyCode.LeftArrow)) {
			transform.Translate (-0.1f, 0, 0);
		}
		if (Input.GetKey (KeyCode.RightArrow)) {
			transform.Translate ( 0.1f, 0, 0);
		}
		if (Input.GetKeyDown (KeyCode.Space)) {
			Instantiate (bulletPrefab, transform.position, Quaternion.identity);
		}
	}
}

このスクリプトではGetKeyDown関数を使ってスペースキーが押されたことを検知し、弾のPrefabから弾のインスタンスを作っています。
GetKeyDown関数はGetKey関数と違って、キーが押下された時に一度だけtrueになる関数です。
 
弾のPrefabからインスタンスを作るために、Instantiate関数を使っています。
Instantiate関数は、第一引数にPrefab、第二引数にインスタンスを生成する位置、第三引数にはインスタンスの回転角を指定します。
ここではRocketControllerの中でtransform.positionと書いているので、ロケットの位置に弾を生成しています。



最後に、作成したbulletPrefabとスクリプト内で宣言した変数とを関連付けます
ヒエラルキービューからrocketを選択し、インスペクタから「RocketControllerスクリプト」の項目を探し、「bullet Prefab」の欄に、プロジェクトビューから「bulletPrefab」をドラッグ&ドロップして下さい。

f:id:nn_hokuson:20160703152733p:plain:w500

ここまで出来たら、実行してみましょう。スペースキーを押すたびに弾が発射されるようになりました。

f:id:nn_hokuson:20160703153002g:plain

今回はここまでです。今回作成したプロジェクトファイルを置いておきます。

www.dropbox.com


 次回は、障害物となる隕石を出現させます。隕石も今回と同じようにPrefabを使ってインスタンスを作成します。Prefabを使ったインスタンスの作り方は毎回同じなので、今回の内容を覚えておくと後が楽ですよ〜

nn-hokuson.hatenablog.com