前回は、Physicsを使って隕石と弾の当たり判定を行いました。
また、アセットストアから爆発のエフェクトをダウンロードして表示できるようにしましたね。
第5回目の今回は、ゲームオーバの判定とuGUIを使ったスコアの表示をしましょう。
第1回 ロケットを動かそう
第2回 弾を発射しよう
第3回 隕石を落下させよう
第4回 当たり判定をしよう
第5回 ゲームオーバを判定しよう
第6回 お化粧をしよう
uGUIを使ってテキストを表示しよう
UnityにはUIを簡単に作れるuGUIというシステムがあります。
このuGUIを使ってゲームオーバとスコアのテキストをシーンビューに追加しましょう。
ヒエラルキービューから「Create」→「UI」→「Text」を選択して下さい。ヒエラルキービューに「Canvas」が作られ、その下にTextが生成されます。
Textの名前を「Score」に変更し、インスペクタの設定を下記のように行います。
Anchors | Position | Font Size | Color |
右上 | (-20, -30, 0) | 18 | 白 |
ゲームオーバのテキストも、同様の手順で配置しましょう。ヒエラルキービューから「Create」→「UI」→「Text」を選択して、作成したTextの名前を「GameOver」に変更し、インスペクタの設定を下記のように行います。
Position | Width/Height | Text | Font Size | Alignment | Color |
(0, 0, 0) | (160, 50) | なし | 32 | 中央 | 白 |
スクリプトからスコアを更新しよう
次に、スコアを更新するためのスクリプトを作成します。
プロジェクトビューで「右クリック」→「Create」→「C# Script」を選択し、ファイル名を「UIController」に変更して下さい。
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」にドラッグ&ドロップして下さい。
実行すると、右上にスコアが表示されます。
でも、隕石を破壊してもスコアが増えずに「0000」のままですね・・・
これはUIControllerに実装したAddScore関数を呼び出していないのが原因です。
スコアが更新されるように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); } }
もう一度実行して、スコアが増えることを確認しましょう。
ゲームオーバを表示しよう
隕石が画面下のラインを超えたときに、画面上に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); } } }
ゲームを実行すると次のようになります。かなりゲームっぽくなってきましたね!
ここまでのプロジェクトファイルを↓からダウンロードできます。
最終回の第6回目は、背景のスクロールや細かい修正などのお化粧をしてゲームを完成させましょう!
nn-hokuson.hatenablog.comhttps://nn-hokuson.hatenablog.com/entry/2016/11/30/205305