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関数を呼び出すとか、
他のスクリプトに設定されている何らかの処理を呼び出すというような感じで使用する事になると思います。