Unityで経過時間、制限時間を表示する機能を作成する

今回はゲームのプレイ時間を表示する機能を作成します。
時間経過で特定のイベントを発生させたり、レースゲーム等では必須の機能ですね。

まずは時間表示をするUI部分を作成していきます。

スポンサーリンク

時間表示用のUIを作成する

タイマー1

上のように弾数等、装備スロットを表示しているStatusUIに新しく、Timerという名前のPanelを作成します。

タイマー2

Timerパネルは上のような位置に設定します。
Anchorsは横はStretchで縦がCustumになります。

タイマー3

Timerの子要素にTextを作成し、設定を上のようにします。
これでUI部分は完成しました。

経過時間の計算と表示をするスクリプトSetTimerを作成する

Add ComponentでNew Scriptを選び新しいスクリプトSetTimerを作成します。

miniteは分、secondは秒を表します。今回は使っていませんがtimeFlagを使ってタイマーのOn・Offを使いたい時にフラグを切り替えて秒数を進ませないという風にも作成出来ます。
textField変数は計算した結果を表示するUI.Textになります。

Start関数内でminite、secondを0で初期化します。
Update関数内ではTime.timeScale > 0の時だけ実行します。
つまりゲームを中断していない時は時間の計測をするようにします。

secondにTime.deltaTimeの値を足していきます。
Time.deltaTimeは最後のフレームを完了するのに要した時間なので、Update関数が呼ばれる度にsecondに値を足していけば時間を計測出来ます。

60秒を超えたらminiteに1を足し、second = second – 60;で秒数から60を引いて秒数に再度代入します。
細かい秒数を捨てないようにします。

oldSecondは同じ秒数だった時にUI.Textを更新しないようにする為に用意しています。

テキストのアップデートを常に行っていると処理速度に影響を与える為、最小限の更新に留めておきます。

最後に

textField.text = minite.ToString(“00”) + “:” + parseInt(second).ToString(“00”);

として、テキストUIに時間を表示します。
minite.ToString(“00”)としている部分は分の値が一桁の場合に1と表示するのではなく01と表示する為の処理です。

parseInt(second).ToString(“00”)

の部分のparseIntはsecondはfloatで宣言しているので、floatからintへと変換させています。
その上でToString(“00”)で二桁で秒数を表示します。

それではUnityの実行ボタンを押して確認してみましょう。

timer4

上が実行結果です。

1分に切り替わる部分を切り取ってみました。
ゲームの中断をした時はしっかりと時間の経過を止めて、再開した時は時間経過が進むようにもなっています。

時間をカウントダウン形式にして制限時間を計りたい場合

経過時間を計測するのではなく、制限時間を設定して時間を減らしていき残り時間が0秒になった時になんらかの処理をしたい事もあります。

そんな時はTime.deltaTimeを足していた個所を制限時間から引いていけばいい事になります。
数値を減らしていく場合は分と秒を一旦足して全体の秒数を求めてからTime.deltaTimeを引き、その後また分と秒を計算するというやり方にしてみます。
制限時間が来たらコンソールに『制限時間終了』という文字を表示するCountdownTimerスクリプトを作成します。

制限時間を計算する時も経過時間とそんなに変わる事はないと思います。

制限時間がなくなったら今回の場合はコンソールに『制限時間終了』という文字を表示していますが、
通常ならばゲーム全体を管理するスクリプト等にゲームオーバー処理をさせる為に作成したGameOver関数を呼び出すとか、
他のスクリプトに設定されている何らかの処理を呼び出すというような感じで使用する事になると思います。

Time.timeを使った時間計測

Update関数内でTime.deltaTimeを足していく事で時間計測する事が出来ましたが、Unity起動からの実行時間Time.timeを使っても時間計測をする事が出来ます。

それではTime.deltaTimeとTime.timeを比較するサンプルを作成してみます。

Time.deltaTimeとTime.timeのヒエラルキー

↑のようにヒエラルキー上で右クリック→UI→Textを2つ作りTime.deltaTimeとTime.timeという名前を付けます。

タイマーUIのサンプル

Time.deltaTimeが上、Time.timeが下になるようにしました。

Canvasに時間を比較する為のスクリプトを作成し取りつけます。

比較の為Time.deltaTimeの処理があるので長いです。

マウスの左クリックで一時停止と解除をする事が出来るようにしました(一時停止中は時間計測しないか確認する為)。

Time.timeの処理は

↑の部分ですね、Time.timeはUnityが起動してからの時間なので値はずっと増えていきます。

その為スタート時のTime.timeの値を取っておき、それを現在のTime.timeから引く事で経過秒数を取得する事が出来ます。

秒から分を計算するには経過秒数を60で割った商になります。

second2の値を書き換えてしまうと難しくなるので時間を表示する時にsecond2 % 60を使って秒数を表示するようにして分を考慮した秒数を表示する事が出来ます。

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

タイマーの比較サンプル動画

↑のようにTime.deltaTime、Time.timeで計算した時間表示が同じになっていますね。

7秒の時にマウスの左クリックをして一時停止した後、再度マウスの左クリックで時間計測を再開しています。

Time.deltaTime、Time.timeどちらでも時間の計測が出来るのでお好みで選択するといいと思います。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます