障害物ランを作ろう~10~の続きです。
時間経過を表すタイマーを作ります。ゲームスタートしてから0→1→2となるような感じですね。
前提条件
【Unity3Dサンプルゲーム】障害物ランを作ろう~10~まで終わらせておいてください。
今回の流れ
- UIオブジェクト「Text」を作成する
- Textの名前を「TimeText」と変更する
- 位置を右上に設定する
- 位置を調節する
- 「TimeText」にスクリプトの追加,アタッチする
- 【Time】スクリプトを開く
- スクリプトを書く
- 動作確認
UIオブジェクト「Text」を作成する
●「Text」を作成する
【Hierarchy】→【Create】→【UI】→【Text】
「Text」作成後のHierarchy
Canvasの子に「Text」が作られます。Aの中に入っているBというオブジェクトがあるとしたら、そのBは「Aの子」といいます。
この場合ではCanvasの子ですね。
Textの名前を「TimeText」と変更する
●「Text」の名前変更
【Text】→【右クリック】→【Rename】→【TimeText】
Cubeの名前を変更したときと同じですよ。
名前の変更の仕方がわからない方は戻るか、【unity】物体(ゲームオブジェクト)の名前変更をわかりやすく説明をご覧ください
位置を右上に設定する
●位置を右上にする
【TimeText】→【React Transform】→【右上(top-right)】
上手く説明できないので、上のGifをご覧ください。
位置を調節する
●【TimeText】の位置を調節
【TimeTextを選択】→【Inspector】→【Transform】→【上記のように数値を変更】
テキスト・サイズ・色を変更する
●テキスト・サイズ・色を変更する
【TimeTextを選択】→【Inspector】→【Text(Script)】→【上記のように設定】
今のままだと、時間がみにくいので、テキスト・サイズ・色を変更しています。色は緑じゃなくていいです。
色の変更の仕方
この円の中の四角や周りの円をさわれば、色が変わります。緑じゃなくてもいいですよ。
ここまでの確認
GameビューがこうなっていればOKです。
「TimeText」にスクリプトの追加,アタッチする
●【TimeText】にスクリプトの追加,アタッチする
【TimeText】→【Inspector】→【Add Component】→【New script】→【Timerを入力】→【Create and Add】
【Timer】スクリプトを開く
●【Timer】スクリプトを開く
【Projectウィンドウ】→【Assets】→【Timerをダブルクリック】→【Visual StudioかMonoDevelopが開く】
Visual StudioかMonoDevelopどっちが開いても同じコードを入力してください。自分はVisual Studioです。
スクリプトを書く
以下のコードを書いていきます。コードが小さくてごめんなさい。お使いのブラウザで拡大してご覧ください。検索すれば出ると思われます。
あと、最後の「}」を忘れないでください。「//」はコメントなので、実行されません。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 1.UIシステムを利用するときに利用(今回でいう「Text」)
using UnityEngine.UI;
public class Timer : MonoBehaviour
{
// 2.時間経過を示す「time」変数
public static float time;
// Use this for initialization
void Start()
{
// 3.ゲーム開始時は「time」は「0」
time = 0;
}
// Update is called once per frame
void Update()
{
// 4.まだゴールをしてなかったら
if (Goal.goal == false)
{
// 5.経過時間を追加
time = time + Time.deltaTime;
}
// 6.小数点以下を切り捨てる
int t = Mathf.FloorToInt(time);
// 7.「Text」Componentを取得して、「uiText」に格納
Text uiText = GetComponent<Text>();
// 8.テキストを編集
uiText.text = "Time = " + t;
}
}
スクリプトの説明
1.UIシステムを利用するときに必要なライブラリ読み込む
// 1.UIシステムを利用するときに利用(今回でいう「Text」)
using UnityEngine.UI;
【Hierarchy】→【Create】→【UI】→【Text】
でテキストを作成しましたよね。その「Text」を利用するため、このライブラリを使います。
2.時間を表す変数「time」
// 2.時間経過を示す「time」変数
public static float time;
「time」という変数に何秒とか表すようにします。
3.ゲーム開始時の時間は「0」秒とする
// Use this for initialization
void Start () {
// 3.ゲーム開始時は「time」は「0」
time = 0;
}
void Start () {} | ゲーム開始時の処理を書く |
---|---|
time = 0; | ゲーム開始時の時間は「0」 |
ゲーム開始時の処理を書いています。ゲーム開始時は時間はたっていないので、「time」変数に0を入れます
4・5.ゴールしていないときの処理を書く
// 4.まだゴールをしてなかったら
if(Goal.goal == false)
{
// 5.経過時間を追加
time = time + Time.deltaTime;
}
if(A.B == false){C} | もしAスクリプトのB変数の値が「false」のときCをする |
---|---|
time = time + Time.deltaTime; | timeに時間経過を表してくれる「deltaTime」を追加する |
if(Goal.goal == false){}は「Goal」スクリプトの「goal」変数が「false」だったときという、if文を表しています。
「Goal」スクリプトの「goal」変数を覚えていますか?前の記事で設定した変数ですよ。ここでフラグ回収です。
time = time + Time.deltaTime;で1、2,3(本当は少数点以下まである)と時間を「time」に追加してくれます。
まとめると、Goalスクリプトのgoal変数がfalseだったらね→time変数に時間を追加するよ
6.少数点を切り捨てる
// 6.小数点以下を切り捨てる
int t = Mathf.FloorToInt(time);
Mathf.FloorToInt(A); | A変数の少数点以下を切り捨てる |
---|
Mathf.FloorToInt(time);でtime 変数「time」の小数点以下を切っています。そして小数点以下がない「time」を「t」変数に格納しています。
7.「Text」Componentを取得して「uiText」に格納
// 7.「Text」Componentを取得して、「uiText」に格納
Text uiText = GetComponent<Text>();
GetComponent<A>() | 「A」というComponentを取得する |
---|
オブジェクトを選択したときにInspectorにあるのが「Component」です。
今回は「Text」というComponentを持ってきています。その持ってきたComponentを「uiText」に入れてます。
8.「Text」のTextを編集する
// 8.テキストを編集
uiText.text = "Time = " + t;
7で取得した「Text」Componentの「Text」の文言を変えます。つまり「Time = 0」の文言を変えます。
0の部分が変化するように、"Time = " + t;となっています。
スクリプト全体の説明
まとめると、時間を表す「time」変数を用意するよ→ゴールするまではtimeに経過時間を追加するよ→timeの小数点を切ってt変数に格納するよ→「Text」Component取得したやつをuiTextに格納するよ→最後に時間の経過がわかるようにテキストを変更するよ。
スクリプトを保存
Visual Studioの場合→【ファイル】→【すべて保存か〇〇の保存】(WindowsでCTRL + Sでも可)
MonoDevelopの場合→【File】→【Save】
動作確認
上部の【▶】でゲームを開始してみてください。
●確認事項
- ゲーム開始するとTimeの値が変わる
- ゴールまでいくとTimeが止まる
では次のゴール時のテキストを作っていきましょう。
コメント