今回は、もぐら叩きゲームで、メインシーンにおけるスコアとタイムを表示させる実装をしていきます。
テキストで表示させるだけでなく、ゲーム開始と同時に時間経過を自動できるコードも書いていきますよ。
では、さっそくゲームを作っていきましょう!
Table of Contents
事前準備:見た目を整える
モグラの穴を画像のように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の理解を深めていきましょう。