前回までの作業で、今回のゲームもシューティングゲームとしては大体完成といって良い出来になりました。しかし今のままでは隕石をたくさん撃ち落としても特に何もないので、ゲーム的には「スコア」の概念を導入したいところです。
そこでここではスコアを計算する仕組みを作り、自分がどれだけの得点を稼いだのかを視覚的に分かるようにしてみましょう。
スコア用UIの作り方
では、まずはスコア用のUIを作ります。新しいキャンバスを作り、その子として下の画像のようにテキストを配置しましょう。
スコアシステムの作り方
次にGameManagerのC#スクリプトを変更してスコアを記録したり、計算したりする処理を追加します。下記に変更部分の抜粋を掲載しますので、「★追加」と書かれている部分を追記してください。
using UnityEngine; using UnityEngine.UI; // ★追加 public class GameManager : MonoBehaviour { // -- 省略 -- [SerializeField] Canvas gameOverCanvas = null; [SerializeField] Text scoreText = null; // ★追加 // ★追加 int score = 0; // ★追加 public int Score { set { score = Mathf.Clamp(value, 0, 9999999); scoreText.text = score.ToString(); } get { return score; } } void Start() { player.gameObject.SetActive(false); SetActiveSpawners(false); // タイトル画面を表示 gameStartCanvas.gameObject.SetActive(true); // ★追加 Score = 0; } public void GameStart() { // ★追加。スコアをリセットする Score = 0; // タイトル画面やゲームオーバー画面を非表示 gameStartCanvas.gameObject.SetActive(false); gameOverCanvas.gameObject.SetActive(false); // -- 省略 -- } // -- 省略 -- }
変更できたら次の作業を行ってください。
- GameManagerコンポーネントの「Score Text」に先ほど作ったスコア用UIのテキストを登録
- GameManagerオブジェクトのタグを「GameController」に変更
敵のC#スクリプトの変更
そうしたら更に敵のC#スクリプトも変更して、隕石が撃墜されたときにスコアが加算されるようにします。こちらも抜粋を掲載しますので「★追加2」と書かれた部分を追記してください。
using UnityEngine; public class MeteorController : MonoBehaviour { // -- 省略 -- void Damage(int value) { if(value <= 0) { return; } hp -= value; if(hp <= 0) { // ★追加 Instantiate(explosionPrefab, transform.position, Quaternion.identity); // ★追加2 GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>().Score += score; Destroy(gameObject); } } }
テストプレイして動作を確認しよう
では最後にテストプレイして動作を確認してみましょう。隕石を破壊したときにスコアが加算されていれば成功です。