Unity学習サイト

ホーム / 得点、制限時間

さて!ゲーム講座も終盤に入ってきました!
前回までの講座では、カメラの追従と敵?キャラを作りましたね。
今回は得点やタイマー機能の追加など盛りだくさんです!気合を入れていきましょう。

今回の講座では下のミニゲームの内容まで作ることができます。

この講座での最終完成形

得点の追加

ゲームといえば得点ですね、このゲームでの得点は捕まえた ネギの数を得点とします。
それではやっていきます!まず、得点を表示するテキストボックスを用意します。 ヒエラルキーウィンドウで右クリック→UI→Textでヒエラルキーウィンドウに Canvasとその配下にTextが追加されたと思います。CanvasはUIの土台のようなものです。 しかし、Canvasが画像のようにとても大きいサイズで表示されていると思います。これを直していきます。

CanvasをMainCameraのサイズに合うように変更していきます。ヒエラルキーのCanvas を選択してインスペクターを確認してください。Canvasコンポーネントがあるのでその コンポーネントの一番上のRender ModeをドロップダウンからScreenSpace-Cameraを選択してください。

するとどのカメラに合わせるかという項目が出てきますので、None(Camera)となっているところの右側の 小さい丸を押してポップアップしてきたSelectCameraウィンドウでMainCameraを選択してください。

これで、CanvasをMainCameraのサイズに変更することができました。
次に、UIのサイズを変更 したいのですがその前にゲーム画面のアスペクト比を固定しましょう。固定しないとゲームを書き出すときに UIが崩れて悲惨なことになります。シーンウィンドウをゲームウィンドウに切り替えて、Standaloneの ドロップダウンをクリックして一番下の⊕をクリックしてください。
Widthを960 Heightを540にしてOKを押してください。これで画面のアスペクト比を固定することができました。

シーンウィンドウに戻してTextの位置を調節していきましょう。ヒエラルキーのTextをクリックして インスペクターのRectTransformコンポーネントのPos XとPos Y の値を変更して位置を調節しましょう。 Xを-350 Yを230にしてくださいこれでいい位置に設定できました。
次にフォントを調節していきます。TextコンポーネントからFontStyleをBoldへFontSizeを20へ Alignmentを中心のものへ変更してフォントを整えましょう。

いよいよ、スクリプトを書いていきます。新しくスクリプトを作ってください、名前はTextcに してください。Script→右クリック→Create→C#
まずは、usingのところにUIを使うことを宣言します。

using UnityEngine.UI;

次に捕まえたネギを数えるための箱をフィールドに用意します。staticはシーンが変遷しても 変数の保持が可能になるコードです。クリアシーンに変遷したときに捕まえたネギの 数を渡すためにStaticwを使っています。

public static int negi;

次にスタート関数にスタート時ネギの本数が0と表示するコードを書きます。先ほど作った テキストボックスのテキストの文字を書き換えるコードです。スタート時に0を代入する 理由として、ネギの本数はシーン変遷をしても破棄されず残るようになっているため Start関数でシーン開始時にネギの本数に0を代入してリセットしています。

negi = 0;
        GetComponent<Text>().text = string.Format("ネギ{0}本", negi);

次に、ネギの本数をカウントするコードを書いていきます。publicでSetScoreという 新しい関数を作ります。publicで作った理由は、他のスクリプトからこの関数を使えるように するためです。
この関数が使用されたら、negiの箱に+1してその都度テキストを書き換えるというスクリプトです。

public void SetScore()
    {
        negi += 1;
        GetComponent<Text>().text = string.Format("ネギ{0}本", negi);
    }

以上でテキストを変更するための下準備が完了しました。Textにスクリプトをドラックアンドドロップして 登録しておきましょう。
Textcスクリプト全文です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Textc : MonoBehaviour
{
    public static int negi;

    // Start is called before the first frame update
    void Start()
    {
        negi = 0;
        GetComponent<Text>().text = string.Format("ネギ{0}本", negi);
    }

    public void SetScore()
    {
        negi += 1;
        GetComponent<Text>().text = string.Format("ネギ{0}本", negi);
    }

}

次に、このTextcスクリプトを作動させる コードをTamagoスクリプトに書いていきます。卵スクリプトがネギに衝突してTextc スクリプトを 作動させる仕組みです。
ネギに衝突したときにTextゲームオブジェクトを探しrecodeTextという箱に探してきたTextオブジェクトを格納し てその中のTextcスクリプトのSetScore関数を実行するというコードです。以前からTamagoスクリプトに書いてあった void OnTriggerEnter2D(Collider2D other)関数のnegiのif文にコードを追加します。

GameObject recodeText = GameObject.Find("Text");
            recodeText.GetComponent<Text>().SetScore();

以上で完了です。アタッチして確認してみましょう。下記がvoid OnTriggerEnter2D(Collider2D other)関数の全文です。

void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("negi"))
        {
            Destroy(this.gameObject);
            Destroy(other.gameObject);
            GameObject recodeText = GameObject.Find("Text");
            recodeText.GetComponent<Text>().SetScore();
        }
        if (other.gameObject.CompareTag("Ground"))
        {
            Destroy(this.gameObject);
        }

    }

ネギの本数がゲームの左上の表示されるようになりましたね! コードの役割を確認してみましょう。

実際に動かして確認してみましょう

タイム計測

ネギの本数が数えられるようになったので次はタイム計測をつけていきます。まずは、 先ほどと同様、時間を表示するテキストボックスを作りましょう。
ヒエラルキーで右クリック→UI→Textでテキストボックスを作ります。名前をTimeで保存してください。 テキストボックスの位置を決めていきます。ネギの本数の時と同じ手順です。xを350 Yを230にしてください。 次に、フォントを整えます。TextコンポーネントでStyleをBold、Sizeを20、Alignmentは真ん中に設定します。 色は何でもいいのですが私はわかりやすく赤にしました。色の替え方は下の画像を参考にしてください。

テキストボックスの設定が終わったので次はスクリプトを書いていきます。スクリプトフォルダ→右クリック→Create→C# 名前をTimecにしてください。それではコードを書いていきましょう。

usingのところにUIを使うことを宣言します。また、制限時間が0になったらMissシーンをロードするようにしたいので シーンマネージャーを使うことも宣言します。

using UnityEngine.UI;
using UnityEngine.SceneManagement;

次にフィールドに60秒が入った箱を作ります。

public float time = 60f;

次にアップデート関数に60秒を減らしていくコードを書いていきます。60秒が入ったtimeという箱から シーンが再生され時からの経過時間である Time.deltaTimeを引くことで60秒の制限時間を作っています。
また、小数点以下がテキストボックスのサイズいっぱいまで表示できてしまうので二行目でInt型にして小数点以下 を取っています。

time -= Time.deltaTime;
        GetComponent<Text> = ((int)time).ToString();

また、時間が0になったらMissシーンをロードするコードを書いていきます。timeが0以下になったらというif文になります。

if (time < 0)
        {
            SceneManager.LoadScene("miss");
        }

以上でTimecスクリプトは完成です。時間が減っていくことを確認しましょう。

コードの役割を確認してみましょう

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Timec : MonoBehaviour
{
    public float time = 60f;

    void Update()
    {
        time -= Time.deltaTime;
        GetComponent<Text>().text = ((int)time).ToString();

        if (time < 0)
        {
            SceneManager.LoadScene("miss");
        }
    }
}

応用編

本編とは関係ないですが、応用編として今度は数字が増えていくscriptを作ってみます。 まず、フィールドのtimeを0秒に変更して代入しておきます。次に、time -= Time.deltaTime;のマイナス を+に変更しましょう。これで、数字が増えるscriptが完成したのですが、このままだと増え続けるので 60秒超えたらMineシーンをロードするようにIf文をつけておきました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class timer : MonoBehaviour
{
    public float time = 0;

    void Update()
    {
        time += Time.deltaTime;
        GetComponent<Text>().text = ((int)time).ToString();

        if (time > 60)
        {
            SceneManager.LoadScene("Main");
        }
    }
}

コードの動きを確認しましょう

以上で今回の講座は終わりです。お疲れ様でした。


次の講座へ

ホームへ