【Unity 入門】Time.deltaTimeを使って制限時間を設定する|カウントアップ・カウントダウン
Unityでゲームを開発しているときに「時間制限をつけたい!」と思うことが多いのではないでしょうか。
そこで今回はTime.deltaTimeを利用して制限時間を設定する方法をご紹介します。
時間の管理はカウントアップ方式とカウントダウン方式の2種類の方法を解説します。
Time.deltaTimeについて
まずはじめに「Time.deltaTime」とは何かについてご説明します。
Time.deltaTimeは最後のフレームを完了するのに要した時間(秒)のことです。
フレームとは「処理をして画面に描画する」までのひとかたまりのことです。
ざっくり説明するとUnityはUpdate関数の処理とレンダリングをひたすら繰り返しています。
この各フレームにかかった時間を「Time.deltaTime」で取得することができます。
図中のフレームをつなぐ矢印の部分(空白の時間)は実際には存在しません。
つまり、Time.deltaTimeを足し合わせることで経過時間を取得することができます。
また、下のTime.deltaTimeの取得結果から分かる通り、処理やレンダリングは各フレームごと違うのでTime.deltaTimeの値は一定ではありません。
参考記事)【Unity】Unityで「時間」を扱うときに注意すべきこと
制限時間の設定方法
先ほども説明した通り、制限時間を設定する方法を2つご紹介します。
1つ目はカウントアップ方式で2つ目がカウントダウン方式です。
どちらの方法でも基本的に問題ありませんが、ゲームの種類によってどちらを使うべきかが変わってきます。
例えばレースゲームなどではカウントダウン方式よりもカウントアップ方式の方がタイムを測ることもできるので向いているかもしれません。脱出ゲームのようなゲームではカウントダウン方式にしたほうが緊張感が生まれて良いかもしれません。
このようにどちらの方法が優れているというわけではありませんが、2種類の方法を知っていることで後々のゲーム開発の役に立つことは間違いありません。
前提条件
2つの方法をご紹介する前に前提として今回は特定の時間を指定して、その時間になったらカウント終了という例を元に解説をしていきます。
カウントが現在どのような状態なのかをわかりやすくするためにテキストを準備してそこに時間、終了時のコメントを出力します。テキストの色やサイズ、フォントの種類は任意です。
参考記事)uGUIテキストについて
カウントアップ方式
まずはじめにカウントアップ方式についてご紹介します。
カウントアップ方式はだんだん数値が増えていく数え方です。
マラソンなどの陸上競技の時間計測方式がカウントアップ方式の例です。
カウントアップ方式の場合はレースゲームなどで特定オブジェクトがゴールをした瞬間などをトリガーにカウントを終了するということが多いと思いますが、基本原理は同じですのでぜひご参考ください。
早速スクリプトを作成します。「TimeCounter」スクリプトを作成して以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TimeCounter : MonoBehaviour { //カウントアップ private float countup = 0.0f; //タイムリミット public float timeLimit = 5.0f; //時間を表示するText型の変数 public Text timeText; // Update is called once per frame void Update() { //時間をカウントする countup += Time.deltaTime; //時間を表示する timeText.text = countup.ToString("f1") + "秒"; if(countup >= timeLimit) { timeText.text = "時間になりました!"; } } } |
deltaTimeをカウントアップ変数に足すことでカウントアップを実現しています。
作成したら空のオブジェクト「TimeCounter」を作成してスクリプトをアタッチします。
publicで宣言してあるタイムリミットを決定する変数「timeLimit」に任意の制限時間を設定し、時間を表示するための変数「timeText」に先ほど作成したTextオブジェクトをアタッチすれば実行可能です。
タイムリミットを5秒にして実行してみましょう。
想定通りの動きをしてくれました。
特定アクションまでの時間を計測する
基本的な構造は全く同じですが、特定アクション(ここでは画面をクリック)までの時間を表示するスクリプトに書き換えます。これはゴールをした瞬間の時刻の取得などに応用できるのでぜひご参考ください。
それでは先ほど作成した「TimeCounter」スクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TimeCounter : MonoBehaviour { //カウントアップ private float countup = 0.0f; //時間を表示するText型の変数 public Text timeText; //クリックされたかどうか private bool isClick = false; // Update is called once per frame void Update() { //クリックされたかどうか if(isClick) { //クリックされた後は以降の処理を実行しないためにreturn return; } //時間をカウントする countup += Time.deltaTime; //時間を表示する timeText.text = countup.ToString("f1") + "秒"; //クリックした瞬間 if (Input.GetMouseButtonDown(0)) { timeText.text = "時間は" + countup.ToString("f2") + "秒です"; isClick = true; } } } |
先ほどと同じように任意のオブジェクトにアタッチして実行してみましょう。
この構造を応用することでほとんどの時間(レース・迷路etc…)を計測することができます。
カウントダウン方式
次にカウントダウン方式についてご紹介します。
カウントダウン方式はだんだん数が減っていく数え方です。
「オリンピック開催まであと〇〇日!」というような時間計測方式がカウントダウン方式の例です。
カウントアップ方式よりもシンプルなので制限時間を設けたいだけの方はカウントダウン方式の方が使いやすいかもしれません。
先ほど作成した「TimeCounter」スクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TimeCounter : MonoBehaviour { //カウントダウン public float countdown = 5.0f; //時間を表示するText型の変数 public Text timeText; // Update is called once per frame void Update() { //時間をカウントダウンする countdown -= Time.deltaTime; //時間を表示する timeText.text = countdown.ToString("f1") + "秒"; //countdownが0以下になったとき if (countdown <= 0) { timeText.text = "時間になりました!"; } } } |
カウントダウンですのでdeltaTimeを足すのではなく引いています。
また、カウントアップと違ってカウントダウン変数自体に制限時間を設定しておけばよいのでシンプルな構造になっています。
それでは制限時間を5秒にして実行してみましょう。
実行できていることが確認できました。
また、カウントアップ方式でご紹介した特定アクションがあったときに時間を計測する仕組みをカウントダウン方式にも適用すれば同じように残り時間を計測できます。
この仕組みを使えばポーズ(時間を止めておくこと)も簡単に作成することができます。
ポーズができるようにする
時間を止めておく方法をご紹介します。
クリックするとポーズになって、改めてクリックすると時間が進む仕様に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TimeCounter : MonoBehaviour { //カウントダウン public float countdown = 10.0f; //時間を表示するText型の変数 public Text timeText; //ポーズしているかどうか private bool isPose = false; // Update is called once per frame void Update() { //クリックされたとき if(Input.GetMouseButtonDown(0)) { //ポーズ中にクリックされたとき if(isPose) { //ポーズ状態を解除する isPose = false; } //進行中にクリックされたとき else{ //ポーズ状態にする isPose = true; } } //ポーズ中かどうか if (isPose) { //ポーズ中であることを表示 timeText.text = "ポーズ中"; //カウントダウンしない return; } //時間をカウントする countdown -= Time.deltaTime; //時間を表示する timeText.text = countdown.ToString("f1") + "秒"; //countdownが0以下になったとき if (countdown <= 0) { timeText.text = "時間になりました!"; } } } |
プログラムの詳細はコメントに記載がありますのでそちらをご参考ください。
仕組みを簡単に解説すると、ポーズ中かどうかをブーリアン型の変数で管理して、クリックされたときにポーズ状態にするか進行状態にするかを場合分けします。ポーズ中のときにはreturnでカウントダウンを進めないようにして、ポーズ中はそれがわかるようにテキストの内容を変更しています。
それでは実行して確認してみましょう。
まとめ
いかがでしたでしょうか。
今回はTime.deltaTimeを利用して制限時間を設定する方法をご紹介してきました。
カウントダウン方式とカウントアップ方式の2種類を知っておくことでどんな場合にも柔軟に対応できるのではないでしょうか。
本記事が皆様のUnityライフをより充実させるきっかけになれば幸いです!
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!