スイカゲームっぽい落ち物ゲーを作ってみる。Part3.スコアとゲームオーバー【Unityゲーム作成】

「簡単にスイカゲームっぽい」落ち物ゲームを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、エフェクト、音などを変更して作成したサンプルゲームが下記です。

タイトルとURLをコピーしました