【Unity】もぐら叩きゲームvol.7『スコアとタイム』を表示させよう!

今回は、もぐら叩きゲームで、メインシーンにおけるスコアとタイムを表示させる実装をしていきます。

テキストで表示させるだけでなく、ゲーム開始と同時に時間経過を自動できるコードも書いていきますよ。

では、さっそくゲームを作っていきましょう!

事前準備:見た目を整える

モグラの穴を画像のように3つに表示させておきたいので、オブジェクトを選択して複製しましょう。

複製は、Ctrl+Dで可能です。

複製したら、シーンビューに切り替えて、マウス操作で直接モグラの穴の位置を調整しましょう。

手順①スコア用のUIを用意する

今まで、Canvasという名前のUIがありましたが、スコアを表示するためのUIも作っておきましょう。

まず、インスペクターのCreate→Canvasを選択します。

そして、名前をScoreCanvasと変更しましょう。

手順②テキストを用意する

テキストをふたつ用意します。

点数を表すScoreTextと残り時間を表すLeftTimeTextです。

作成したら、シーンビューのマウス操作で直接テキストを動かし、上記の画像の上部に移動させましょう。

手順③コードから時間経過の自動設定を行う

まず、Scriptフォルダを選択して、Game Manager.csを作成しましょう。

Game Manager.csをダブルクリックすると、Visual Studioが立ち上がります。

自動で時間をカウントするには、以下の2点が必要です。

  • 「残り時間:30」と書かれたテキストオブジェクトを取得する
  • 取得したテキストオブジェクトから、「30」という数値を減らしていくコードを書く

そして、以下のコードをGame Magager.csに書けば、時間のカウントができます。

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

public class GameManager : MonoBehaviour
{
    public Text leftTimeText;
    float leftTime = 30;
    void Update()
        {
      
            //1秒に1秒ずつ減らしていく
            leftTime -= Time.deltaTime;
            //マイナスは表示しない
            if (leftTime < 0) leftTime = 0;
            leftTimeText.text = "残り時間:" + ((int)leftTime).ToString(); 
        
        }
}
まえぴー

次の章から、上のコードの解説をしていきます。

テキストオブジェクトを取得する

まず、「残り時間:30」と書かれたテキストオブジェクトを取得する必要があります。

取得するには、以下のようにpublicで変数を宣言します。

public Text leftTimeText;

まず、publicで宣言することで、HierarchyからInspectorへ、以下のようにオブジェクトをアタッチできるようになります。

そして、Text型のオブジェクトなので、TextのleftTimeTextと宣言しておきましょう。

Text型を宣言するには、using UnityEngine.UI;」とコードの冒頭で記載する必要があります。

時間を取得する

時間は数値ですので、int型かfloat型のどちらかになりますが、今回は、float型で以下のように宣言します。

float leftTime = 30;

初期設定の時間は、なんでも良いですが、ここでは30秒にしたいので、30にしておきます。

int型とは、整数値を扱う時に宣言します。(例:1、2、3…)
float型とは、小数点を含む数値を扱う時に宣言します。(例:1.2、1.3、1.4…)

1秒に1秒ずつ減らしていく

Update関数の中に、以下のコードを書いていきます。

//1秒に1秒ずつ減らしていく
leftTime -= Time.deltaTime;

leftTime(30)に-= Time.deltaTime;と書くことで、1秒ずつ30が減っていくコードができます。

ちなみに、-=と、「=」の左に「-」とマイナスを書くことで、30から引いていくという意味になります。

逆に、「=」の左に「+」とプラスを書くことで、30から足していくという意味です。

Time.deltaTimeは、1秒ずつ、値を動かしたい時によく使います。

残り時間をテキストに反映させる

1秒に1秒ずつ減らす1行を書いたので、それをテキストに反映させる必要があります。

以下のように、追記しましょう。

leftTimeText.text = "残り時間:" + ((int)leftTime).ToString(); 

宣言したleftTimeTextの変数を書きます。そして、「.text」と続いて、leftTimeText.text

と記載しましょう。

leftTimeText.textは、Inspectorでいう以下の赤枠(leftTimeText)と青枠(text)を指します。

つまり、leftTimeTextというテキストコンポーネントのtext要素を、leftTimeText.textと表現しているということになります。

そして、leftTimeText.textの残り時間:30を変更したいので、「=」と書いて、どう変更したいのかを、イコールの右に書くのです。

"残り時間:" + ((int)leftTime).ToString(); 

そのまま残しておきたいから、””(ダブルクオーテーション)で「残り時間:」を囲っています。

変えたいのは、数値の30ですよね。

leftTimeはfloat型なので、文字列(String型にしなくてはいけません。

=で左辺と右辺を繋いでいるので、両方同じ型ではなくてはエラーが生じます。

そのため、ToString();という関数を使う必要があるのです。

ただし、ここで問題が生じます。

ToString();は、int型→string型にできますが、float型→string型にはできません。

ですから、float型→int型→string型にする必要があります。

したがって、 ((int)leftTime).ToString(); (int)leftTimeで一回、int型にした上で、ToString();を使うのです。

まえぴー

型変換するなら、最初からint型でleftTimeを宣言すればよかったと思う方もいるかもしれませんが、Time.deltaTimeはfloat型にしか使えないので、今回の型変換は仕方ありません。

残り時間のマイナス表示をなくす

現状だと、30秒以上過ぎたら、値がどんどんマイナス表示になっていきます。

0になったら、0で値が止まるようにコードを書く必要があります。

//マイナスは表示しない
if (leftTime < 0) leftTime = 0;

実は、とても簡単で、if文でleftTimeが0より小さいなら、leftTimeを0にするという1行です。

これで、ゲームスタートと同時に、時間のカウントが始まるようになります。

まとめ:時間表示でゲームっぽく仕上げよう!

ここまで、スコアとタイムのテキスト表示と、ゲーム開始と同時にタイムカウントの方法をお伝えしました。

コード的には、数行で終わりますが、短いコードの中には、intやfloat、コンポーネントの概念など、いろんな知識が必要となります。

実際に、ゲームを作りながら、Unityの理解を深めていきましょう。

コメントを残す

メールアドレスが公開されることはありません。