簡単な2Dシューティングゲーム作成の第5回目を進めていきます。今回はスコア表示とゲームの終了を作成していきます。一旦ゲームの仮完成になります。仮というかベースですね。
はじめに
Part1は下記から
簡単なおさらいと今回やること
これまでで機体から弾が出るようにして、マトも作りました。今回はスコア表示とゲームオーバーを作っていきます。
ゲーム作成開始
では、まずは「スコア(点数)表示」を作成していきます。
スコア表示の作成
まずはスコアを表示する場所を作成。Canvas内に「UI」→「テキスト」を追加。名前をScoreにしておきます。

ゲーム画面の左上に表示されるように位置、サイズなどを調整します。テキストの中身はスクリプトで変更するので仮設定みたいなものです。無しでもOK。

次にScriptフォルダ内で右クリック。作成からC#スクリプトを選択し、ScoreManagerと言う名前でファイルを作成します。このスクリプトで「スコアを管理」していきます。

ScoreManagerの中身は下記のように変更。SetScoreを呼ぶことで点数を加算してテキストの内容を書き換えています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ScoreManager : MonoBehaviour { public Text txtScore; int iScore = 0; public void SetScore() { iScore += 10; txtScore.text = "Score:" + iScore.ToString(); } }
このスクリプトをScoreManagerオブジェクトに追加。変数にScoreをセットします。

別クラスのメソッドを呼び出す
次に、弾がマトに当たった時に「ScoreManager」の「SetScore」が呼ばれるようにしていきます。Targetスクリプトを下記のように変更します。他のクラス(別クラス)のメソッドを呼び出す方法はいくつかありますが、一番基本的な方法だと思います(たぶん)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Target : MonoBehaviour { ScoreManager sManager; private void Start() { sManager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>(); } void Update() { transform.position -= new Vector3(0, 1.5f * Time.deltaTime, 0); } private void OnTriggerEnter2D(Collider2D collision) { Destroy(gameObject); Destroy(collision.gameObject); sManager.SetScore(); } }
これで実際に動かしてみます。弾がマトに当たれば10点づつスコアが加算されていればOKです。
ゲーム終了画面の作成
次にゲーム終了画面の作成をしていきます。
タグの設定
まずは各オブジェクトに「タグ」を付けていきます。「タグを追加」を選択して「Bullet」と「Target」を追加。


BulletとTargetにタグを設定、初期で用意されているPlayerタグも設定します。


参考
タグは以前、玉転がしゲームでマトだけが消えるように設定したものですね。オブジェクトの区別に使える機能です。
終了テキストの作成
Canvas内に「UI」→「テキスト」を追加。名前をFinishにしておきます。位置やサイズ、テキストを変更しておきます。

ScoreManagerのスクリプトを下記のように変更。Startで終了画面(終了テキスト)を無効に、スコアをリセット。GameOverが呼び出されたら終了画面を表示するようにしています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ScoreManager : MonoBehaviour { public GameObject objFinish; public Text txtScore; int iScore = 0; void Start() { objFinish.SetActive(false); txtScore.text = "Score:"; } public void SetScore() { iScore += 10; txtScore.text = "Score:" + iScore.ToString(); } public void GameOver() { objFinish.SetActive(true); } }
ScoreManagerオブジェクトの変数にFinishオブジェクトをセット。

Targetスクリプトを下記のように変更。タグを利用して場合分け。マトが弾にぶつかった場合はスコア更新、マトがプレイヤーに当たった場合はゲームオーバーです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Target : MonoBehaviour { ScoreManager sManager; private void Start() { sManager = GameObject.Find("ScoreManager").GetComponent<ScoreManager>(); } void Update() { transform.position -= new Vector3(0, 1.5f * Time.deltaTime, 0); } private void OnTriggerEnter2D(Collider2D collision) { if(collision.CompareTag("Bullet")) { sManager.SetScore(); } else if (collision.CompareTag("Player")) { sManager.GameOver(); } Destroy(gameObject); Destroy(collision.gameObject); } }
一旦これで実行。弾がマトに当たればスコアが更新され、機体にマトがぶつかるとゲームオーバーという「一連の基本的な流れ」が動けばOK。