「簡単にスイカゲームっぽい」落ち物ゲームをUnityで作成する、第3回目です。
はじめに
Part1は下記です。
今回やること
パート1と2で簡単な画面(枠)を作成、ランダムに物体を落として同じ種類が重なった場合は合体(マージ)するようにしました。
今回は、スコアとゲームオーバーを作成していきます。大枠でのゲームができます。
実装開始
Hierarchyで右クリック、「UI」→「Legacy」→「Text」を2つ追加します。「Text-TextMeshPro」でも問題ないですが今回はTextを利用していきます。

「Label」、「Score」として位置とTextを変更します。好きな場所で問題ないです。

左上に表示した場合は下記の様な感じ。

スクリプトの作成
GameManagerスクリプトを下記の様に変更します。全てのスクリプト内容を表示してあります。
using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } public bool isNext { get; set; } public int MaxSeedNo { get; private set; } [SerializeField] private seed[] seedPrefab; [SerializeField] private Transform seedPosition; [SerializeField] private Text txtScore; private int totalscore; void Start() { Instance = this; isNext = false; MaxSeedNo = seedPrefab.Length; totalscore = 0; SetScore(totalscore); CreateSeed(); } void Update() { if (isNext) { isNext = false; Invoke("CreateSeed", 2f); } } private void CreateSeed() { int i = Random.Range(0, MaxSeedNo - 2); seed seedIns = Instantiate(seedPrefab[i], seedPosition); seedIns.seedNo = i; seedIns.gameObject.SetActive(true); } public void MergeNext(Vector3 target,int seedNo) { seed seedIns = Instantiate(seedPrefab[seedNo + 1], target, Quaternion.identity, seedPosition); seedIns.seedNo = seedNo + 1; seedIns.isDrop = true; seedIns.GetComponent<Rigidbody2D>().simulated = true; seedIns.gameObject.SetActive(true); totalscore += (int)Mathf.Pow(3, seedNo); SetScore(totalscore); } private void SetScore(int score) { txtScore.text = score.ToString(); } }
追加したのはスコア部分です。マージした時にスコアを加算しています。
動作確認
GameManagerのパラメータをセット

実行すると下記の様に合体した時にスコアが加算されます。

ゲームオーバーの作成
一定ラインを超えたらゲームオーバーとします。「2DObject」→「Sprites」→「Square」を追加。

名前を「GameOverLine」としてスケールと位置、色を変更。「BoxCollider2D」をアタッチして下記の様にします。

新しく下記のスクリプトを作成します。物体が一定時間ラインに触れていたらシーンをリセットします(ゲームオーバー)。
using UnityEngine.SceneManagement; using UnityEngine; public class line : MonoBehaviour { private float stayTime; private void OnTriggerStay2D(Collider2D collision) { if (collision.CompareTag("seed")) { stayTime += Time.deltaTime; if (stayTime > 4.0f) { SceneManager.LoadScene(0); } } } private void OnTriggerExit2D(Collider2D collision) { if (collision.CompareTag("seed")) { stayTime = 0; } } }
スクリプトをアタッチして、「BoxCollider2D」の「isTrigger」にチェックを入れます。

最後に全てのseedの「Rigidbody2D」の「SleepingMode」を「NeverSleep」にします。

試しに動かしてみると下記の様な感じに、一定時間ラインに触れるとゲームオーバーとなります。

実際にはオープニングなどを含めた見た目やサウンド、得点の保存やランキングなどが必要となりますが、基本的なゲームの形は完成。
プロジェクトファイルのダウンロード
下記からソースなどが入ったプロジェクトファイルのダウンロードができます。
ZIP形式で圧縮してあるので、解凍後にUnityの上部メニュー、「Assets」→「Import Package」→「CustomPakage…」からファイルを選択すると利用できます。
サンプルゲーム
UI、エフェクト、音などを変更して作成したサンプルゲームが下記です。