【Unity 入門】Time.deltaTimeを使って制限時間を設定する|カウントアップ・カウントダウン


Unityでゲームを開発しているときに「時間制限をつけたい!」と思うことが多いのではないでしょうか。

そこで今回はTime.deltaTimeを利用して制限時間を設定する方法をご紹介します。

時間の管理はカウントアップ方式カウントダウン方式の2種類の方法を解説します。

deltaTimeアイキャッチ

Time.deltaTimeについて

まずはじめに「Time.deltaTime」とは何かについてご説明します。

Time.deltaTimeは最後のフレームを完了するのに要した時間(秒)のことです。

フレームとは「処理をして画面に描画する」までのひとかたまりのことです。

ざっくり説明するとUnityはUpdate関数の処理とレンダリングをひたすら繰り返しています。

この各フレームにかかった時間を「Time.deltaTime」で取得することができます。

deltaTimeの説明図
Time.deltaTimeの説明図

図中のフレームをつなぐ矢印の部分(空白の時間)は実際には存在しません。

つまり、Time.deltaTimeを足し合わせることで経過時間を取得することができます。

また、下のTime.deltaTimeの取得結果から分かる通り、処理やレンダリングは各フレームごと違うのでTime.deltaTimeの値は一定ではありません

deltaTimeの取得結果
Time.deltaTimeの取得結果

参考記事)【Unity】Unityで「時間」を扱うときに注意すべきこと

制限時間の設定方法

先ほども説明した通り、制限時間を設定する方法を2つご紹介します。

1つ目はカウントアップ方式で2つ目がカウントダウン方式です。

どちらの方法でも基本的に問題ありませんが、ゲームの種類によってどちらを使うべきかが変わってきます

例えばレースゲームなどではカウントダウン方式よりもカウントアップ方式の方がタイムを測ることもできるので向いているかもしれません。脱出ゲームのようなゲームではカウントダウン方式にしたほうが緊張感が生まれて良いかもしれません。

このようにどちらの方法が優れているというわけではありませんが、2種類の方法を知っていることで後々のゲーム開発の役に立つことは間違いありません。

前提条件

2つの方法をご紹介する前に前提として今回は特定の時間を指定して、その時間になったらカウント終了という例を元に解説をしていきます。

カウントが現在どのような状態なのかをわかりやすくするためにテキストを準備してそこに時間、終了時のコメントを出力します。テキストの色やサイズ、フォントの種類は任意です。

時間を表示するテキスト
時間を表示するテキスト

参考記事)uGUIテキストについて

カウントアップ方式

まずはじめにカウントアップ方式についてご紹介します。

カウントアップ方式はだんだん数値が増えていく数え方です。

マラソンなどの陸上競技の時間計測方式がカウントアップ方式の例です。

カウントアップ方式の場合はレースゲームなどで特定オブジェクトがゴールをした瞬間などをトリガーにカウントを終了するということが多いと思いますが、基本原理は同じですのでぜひご参考ください。

早速スクリプトを作成します。「TimeCounter」スクリプトを作成して以下のように編集してください。

 

deltaTimeをカウントアップ変数に足すことでカウントアップを実現しています。

作成したら空のオブジェクト「TimeCounter」を作成してスクリプトをアタッチします。

publicで宣言してあるタイムリミットを決定する変数「timeLimit」に任意の制限時間を設定し、時間を表示するための変数「timeText」に先ほど作成したTextオブジェクトをアタッチすれば実行可能です。

タイムリミットを5秒にして実行してみましょう。

カウントアップ方式
カウントアップ方式

想定通りの動きをしてくれました。

特定アクションまでの時間を計測する

基本的な構造は全く同じですが、特定アクション(ここでは画面をクリック)までの時間を表示するスクリプトに書き換えます。これはゴールをした瞬間の時刻の取得などに応用できるのでぜひご参考ください。

それでは先ほど作成した「TimeCounter」スクリプトを以下のように編集してください。

先ほどと同じように任意のオブジェクトにアタッチして実行してみましょう。

カウントアップ方式(クリックで終了)
カウントアップ方式(クリックで終了)

この構造を応用することでほとんどの時間(レース・迷路etc…)を計測することができます。

カウントダウン方式

次にカウントダウン方式についてご紹介します。

カウントダウン方式はだんだん数が減っていく数え方です。

「オリンピック開催まであと〇〇日!」というような時間計測方式がカウントダウン方式の例です。

カウントアップ方式よりもシンプルなので制限時間を設けたいだけの方はカウントダウン方式の方が使いやすいかもしれません。

先ほど作成した「TimeCounter」スクリプトを以下のように編集してください。

カウントダウンですのでdeltaTimeを足すのではなく引いています。

また、カウントアップと違ってカウントダウン変数自体に制限時間を設定しておけばよいのでシンプルな構造になっています。

それでは制限時間を5秒にして実行してみましょう。

カウントダウン方式
カウントダウン方式

実行できていることが確認できました。

また、カウントアップ方式でご紹介した特定アクションがあったときに時間を計測する仕組みをカウントダウン方式にも適用すれば同じように残り時間を計測できます。

この仕組みを使えばポーズ(時間を止めておくこと)も簡単に作成することができます。

ポーズができるようにする

時間を止めておく方法をご紹介します。

クリックするとポーズになって、改めてクリックすると時間が進む仕様に変更します。

プログラムの詳細はコメントに記載がありますのでそちらをご参考ください。

仕組みを簡単に解説すると、ポーズ中かどうかをブーリアン型の変数で管理して、クリックされたときにポーズ状態にするか進行状態にするかを場合分けします。ポーズ中のときにはreturnでカウントダウンを進めないようにして、ポーズ中はそれがわかるようにテキストの内容を変更しています。

それでは実行して確認してみましょう。

カウントダウン方式(ポーズあり)
カウントダウン方式(ポーズあり)

まとめ

いかがでしたでしょうか。

今回はTime.deltaTimeを利用して制限時間を設定する方法をご紹介してきました。

カウントダウン方式とカウントアップ方式の2種類を知っておくことでどんな場合にも柔軟に対応できるのではないでしょうか。

本記事が皆様のUnityライフをより充実させるきっかけになれば幸いです!


deltaTimeアイキャッチ

この記事はいかがでしたか?よければシェアをお願いします。

Furui