おもちゃラボ

Unityで遊びを作ってます

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

前回は、Physicsを使って隕石と弾の当たり判定を行いました。
また、アセットストアから爆発のエフェクトをダウンロードして表示できるようにしましたね。

nn-hokuson.hatenablog.com

第5回目の今回は、ゲームオーバの判定とuGUIを使ったスコアの表示をしましょう。

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

uGUIを使ってテキストを表示しよう

UnityにはUIを簡単に作れるuGUIというシステムがあります。
このuGUIを使ってゲームオーバとスコアのテキストをシーンビューに追加しましょう。

ヒエラルキービューから「Create」→「UI」→「Text」を選択して下さい。ヒエラルキービューに「Canvas」が作られ、その下にTextが生成されます。

f:id:nn_hokuson:20160810110649p:plain:w500

Textの名前を「Score」に変更し、インスペクタの設定を下記のように行います。

Anchors Position Font Size Color
右上 (-20, -30, 0) 18

f:id:nn_hokuson:20160810111708p:plain:w500

ゲームオーバのテキストも、同様の手順で配置しましょう。ヒエラルキービューから「Create」→「UI」→「Text」を選択して、作成したTextの名前を「GameOver」に変更し、インスペクタの設定を下記のように行います。

Position Width/Height Text Font Size Alignment Color
(0, 0, 0) (160, 50) なし 32 中央

f:id:nn_hokuson:20160810113131p:plain:w500

スクリプトからスコアを更新しよう

次に、スコアを更新するためのスクリプトを作成します。
プロジェクトビューで「右クリック」→「Create」→「C# Script」を選択し、ファイル名を「UIController」に変更して下さい。

f:id:nn_hokuson:20160810113943p:plain:w550

UIControllerに次のスクリプトを入力します。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class UIController : MonoBehaviour {

	int score = 0;
	GameObject scoreText;

	public void AddScore(){
		this.score += 10;
	}

	void Start () {
		this.scoreText = GameObject.Find ("Score");
	}

	void Update () {
		scoreText.GetComponent<Text> ().text = "Score:" + score.ToString("D4");
	}
}

このスクリプトでは、Start関数の中でシーンビューに配置したUIのText(Scoreテキスト)を検索し、メンバ変数に保存しています。
Update関数内でTextにスコアを代入しています。
Add関数は弾と隕石が衝突したときに呼び出される関数で、この中でスコアの更新を行っています。

ここで一度、動作を確認してみましょう。
プロジェクトビューの「UIController」をヒエラルキービューの「Canvas」にドラッグ&ドロップして下さい。

f:id:nn_hokuson:20160810114833p:plain:w500

実行すると、右上にスコアが表示されます。
でも、隕石を破壊してもスコアが増えずに「0000」のままですね・・・
これはUIControllerに実装したAddScore関数を呼び出していないのが原因です。

f:id:nn_hokuson:20170310174907p:plain:w200

スコアが更新されるようにAddScore関数を呼び出す部分を作成します。
弾と隕石が衝突したときにスコアを増やしたいので、BulletControllerのOnTriggerEnter2Dの中でAddScore関数を呼び出します。
BulletControllerを開いて次のスクリプトを追記して下さい。

using UnityEngine;
using System.Collections;

public class BulletController : MonoBehaviour {

	public GameObject explosionPrefab;

	void Update () {
		transform.Translate (0, 0.2f, 0);

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

	void OnTriggerEnter2D(Collider2D coll) {
		// 衝突したときにスコアを更新する
		GameObject.Find ("Canvas").GetComponent<UIController> ().AddScore ();

               // 爆発エフェクトを生成する	
		GameObject effect = Instantiate (explosionPrefab, transform.position, Quaternion.identity) as GameObject;
		Destroy (effect, 1.0f);

		Destroy (coll.gameObject);	
		Destroy (gameObject);
	}
}

もう一度実行して、スコアが増えることを確認しましょう。

f:id:nn_hokuson:20160810115722p:plain:w200

ゲームオーバを表示しよう

隕石が画面下のラインを超えたときに、画面上にGameOverを表示するため、UIControllerにGameOver関数を追加しましょう。
GameOver関数ではシーンビューのTextに"GameOver"の文字列を代入しています。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class UIController : MonoBehaviour {

	int score = 0;
	GameObject scoreText;
	GameObject gameOverText;

	public void GameOver(){
		this.gameOverText.GetComponent<Text>().text = "GameOver";
	}

	public void AddScore(){
		this.score += 10;
	}

	// Use this for initialization
	void Start () {
		this.scoreText = GameObject.Find ("Score");
		this.gameOverText = GameObject.Find ("GameOver");
	}

	void Update () {
		scoreText.GetComponent<Text> ().text = "Score:" + score.ToString("D4");
	}
}

隕石が画面下のラインを超えたときにゲームオーバと判定します。
画面下端を超えたかどうかはRockControllerで判定していたので、そこでUIControllerのGameOver関数を呼び出します。

using UnityEngine;
using System.Collections;

public class RockController : MonoBehaviour {

	float fallSpeed;
	float rotSpeed;

	void Start () {
		this.fallSpeed = 0.01f + 0.1f * Random.value;
		this.rotSpeed = 5f + 3f * Random.value;
	}
	
	void Update () {
		transform.Translate( 0, -fallSpeed, 0, Space.World);
		transform.Rotate(0, 0, rotSpeed );

		if (transform.position.y < -5.5f) {
			GameObject.Find ("Canvas").GetComponent<UIController> ().GameOver ();
			Destroy (gameObject);
		}
	}
}

ゲームを実行すると次のようになります。かなりゲームっぽくなってきましたね!

f:id:nn_hokuson:20160811085438g:plain

ここまでのプロジェクトファイルを↓からダウンロードできます。

www.dropbox.com

最終回の第6回目は、背景のスクロールや細かい修正などのお化粧をしてゲームを完成させましょう!

nn-hokuson.hatenablog.comhttps://nn-hokuson.hatenablog.com/entry/2016/11/30/205305