【Unity】簡単!時間制限、計測を画面に表示する方法
こんにちは。あっきーです。
Unityでゲームを制作をしているニートです。
ゲームを制作していると、時間を考慮する必要が出てくるんですよね。
- 制限時間を設定
- タイムアタック機能を追加
- 〇〇秒後にビーム
こういったプログラムを実装する方法をここで紹介していきます。
具体的な内容は以下の通りです。
- 時間のカウントアップ・ダウンのやり方
- 時間を「1:00:00」のように「時間:分:秒」と画面に表示する方法
- 一定時間過ぎた後にある行動を実行する方法
初めにUnityでプロジェクトを開いて、画像のように設定をしておきましょう。
- Canvasを追加
- TextMeshPro(UI)を追加
時間経過では”Time.DeltaTime”が優秀です。
カウントアップ・ダウンのやり方ですが、結論はTime.DeltaTime
を使うのが一番早いです。
先にスクリプトを紹介します。(スクリプト名は”TimerText”としています。)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class TimerText : MonoBehaviour
{
private TextMeshProUGUI timerText;
private float timer;
// Start is called before the first frame update
void Start()
{
timerText = GetComponent();
timer = 0;
}
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
timerText.text = timer.ToString("f2");
}
}
このスクリプトをTimerTextオブジェクト(最初に作ったTMPオブジェクト)にアッタッチして実行します。
すると以下のように、タイマーを作ることができます。
コードの解説をしていきます。
“Time.deltaTime”の使い方
Time.deltaTime
というのは、1フレーム間の時間の長さです。
フレームという言葉が出てきましたが、簡単に言えば、現時点から次の行動に移るまでが1フレームです。なので、行動と行動の間の時間がこのTime.deltaTime
で表せるということです。
これをtimer
という変数にどんどん加えていくことで時間経過を表すことができます。
timer += Time.deltaTime
の中の+=
は「右辺を足していく」という記号です。よく使うので覚えておきましょう。
Time.deltaTime
はUpdate
メソッドの中で使うことで意味があります。というのも先ほどの通りフレームに関することなので、毎フレーム処理を行うUpdate
でこの処理を書くことでカウントアップが可能になっています。
ちなみに、カウントダウンを実装する場合は +=
の部分を-=
にすればOKです。
時間を画面に表示する
時間を表示するには、もちろん時間の値を持ったtimer
を使えば良いんですが、1つ工夫が必要です。
timerText.text = timer.ToString("f2")
のように、ToString
メソッドを利用します。
これは、文字表示なのでstring
型にしないといけないんですが、timer
はfloat
型なので、型を変換させないといけないからです。
ToString("f2")
のように、()内に文字に変換した際の表記方法を設定することができます。今回の”f2″は「小数第2位まで表示する」という意味になります。
時間を表示するには”時間” “分” “秒” で数値をそれぞれ分ける
ゲーム開発をしていくとおそらく時間を”1:23:45″のように「〇時間〇分〇秒」という形式で表示したくなります。
これを実装してみましょう。
先ほどのスクリプトを変更します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class TimerText : MonoBehaviour
{
private TextMeshProUGUI timerText;
private float second;
private int minute;
private int hour;
// Start is called before the first frame update
void Start()
{
timerText = GetComponent();
}
// Update is called once per frame
void Update()
{
second += Time.deltaTime;
if(minute > 60)
{
hour++;
minute = 0;
}
if(second > 60f)
{
minute += 1;
second = 0;
}
timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
}
}
これを実行すると以下のように時間を表示させることができます。
60秒経過すると分の値が1増えて、「1分〇〇秒」と表示できているのが分かりますね。1時間経過しても同様に表示されていきます。
コードの解説に映ります
「60分→1時間」、「60秒→1分」と計算していく
ここでは「時間」「分」「秒」の値を分けて考えます。コードにあるようにhour
, minute
, second
で分けていきます。
second += Time.deltaTime
は先ほど説明した通り、経過時間を表してます。
if(minute >= 60)
{
hour++;
minute = 0;
}
if(second >= 60f)
{
minute++;
second = 0;
}
ここがポイントで、minute
が60を超えたら、つまり60分経つとhour
に1加えるという操作をしています。
同様に、second
が60を越えたら、つまり60秒経つとminute
に1加えるという操作を行っています。
ちなみにhour++
などは「1加える」という意味です。
最後に
timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
と文字表記をすればOKです。
ちなみに、ToString("00")
は「int型(整数)の値を2桁で表示する」という意味で、0を”00″, 1を”01″のように表現できます(見栄えの都合でこういう表記にしています。)
if文で条件をつけることで「一定時間経過」を表現
これについては言葉だけで説明します。
答えはもうお伝えしていて、先ほど「60秒→1分」という操作をした際にif文を使いましたね。これと同じ方式でやればOKです。
ifを使って「5秒後にオブジェクトを生成する」みたいな処理が書けます。これができると「チャージショット」のようなプログラミングも書けるようになります。
まとめ
ということで、今回は時間制限、計測を画面に表示する方法を解説しました。
カウントアップだけの例を見せましたが、カウントダウンも全く同じですね。”+”を”-“に変えるだけでOKです。
では、さっそくUnityライフを楽しみましょう。
それでは、素敵な1日を。
【時間測定のテンプレート。ご利用ください】
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class TimerText : MonoBehaviour
{
private TextMeshProUGUI timerText;
//時間、分、秒を表示する用
private float second;
private int minute;
private int hour;
// Start is called before the first frame update
void Start()
{
timerText = GetComponent();
}
// Update is called once per frame
void Update()
{
second += Time.deltaTime;
//60分→1時間に置き換え
if(minute >= 60)
{
hour++;
minute = 0;
}
//60秒→1分に置き換え
if(second > 60f)
{
minute++;
second -= 60f;
}
//時間を表示
timerText.text = hour.ToString() + ":" + minute.ToString("00") + ":" + second.ToString("f2");
}
}
スポンサードサーチ
人気記事英語学習用SNSをLaravelで作ってみた【システム解説あり】