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

記事内に広告が含まれています。

今回はUnityでゲームのプレイ時間を表示する機能、制限時間を設けて持ち時間が減っていく機能を作成します。

時間経過で特定のイベントを発生させたり、レースゲーム等では必須の機能ですね。

スポンサーリンク

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

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

タイマー1

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

タイマー2

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

タイマー3

Timerの子要素にTextを作成し、設定を上のようにします。

これでUI部分は完成しました。

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

Add ComponentでNew Scriptを選び新しいスクリプトTimerScriptをTimerの子要素のTextに設定します。作成します。

minuteは分、secondsは秒を表します。

timerTextフィールドは計算した結果を表示するTextになります。

Startメソッド内でminute、secondsを0で初期化します。

secondsにTime.deltaTimeの値を足していきます。

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

60秒を超えたらminuteに1を足し、seconds = seconds – 60で秒数から60を引いて秒数に再度代入します。

細かい秒数を捨てないようにします。

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

secondsとoldSecondsはfloatなのでintにキャストして比較をしています。

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

分と秒を表示する箇所は

のようにしてますが、

minite.ToString(“00”)としている部分は分の値が一桁の場合に1と表示するのではなく01と表示する為の処理です。

の部分ではsecondsをint値にキャストし、その上でToString(“00”)で二桁で秒数を表示します。

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

timer4

上が実行結果です。

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

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

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

そんな時は、Time.deltaTimeを足していた個所を制限時間から引いていけばいい事になります。

数値を減らしていく場合は、分と秒を一旦足して、全体の秒数を求めてからTime.deltaTimeを引き、その後、再度分と秒を計算するというやり方にしてみます。

制限時間が来たら、コンソールに『制限時間終了』という文字を表示するCountDownTimerスクリプトを作成します。

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

制限時間がなくなったら、今回の場合はコンソールに『制限時間終了』という文字を表示していますが、

通常ならばゲーム全体を管理するスクリプト等に、ゲームオーバー処理をさせる為に作成したGameOver関数を呼び出すとか、

他のスクリプトに設定されている何らかの処理を呼び出す、というような感じで使用する事になると思います。

Time.timeを使った時間計測

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

Timerに新しいスクリプトTimerTimeを作成し取りつけます。

Time.timeはUnity起動後の時間なのでStartメソッドでスタート時のTime.timeの値をセットします。

経過時間はTime.timeからstartTimeを引くと得られますので、それを使って分と秒を計算します。

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

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

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

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

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

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

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

DateTime構造体とTimeSpan構造体を使った時間計測

2020/06/04に追記した内容です。

DateTime構造体とTimeSpan構造体を使用して経過時間を計算する場合はTimeSpan構造体のプロパティ値を使えるので独自の分や秒の計算は要りません。

StartメソッドでDateTime.NowでDateTimeのNowプロパティで現在の日時データであるDateTimeを取得し、startDateTimeに入れます。

Updateメソッドで現在の日時データ(DateTime.Now)からスタート時の日時データ(startDateTime)を引いて時間間隔のTimeSpan構造体を計算します。

TimeSpan構造体のMinutesやSecondsプロパティで分と秒を取得し、それをToString(“00”)を使って必ず二けたになるように整形しテキストに出力します。

Time.timeScaleを0にしても時間を進める

Time.timeScaleでゲームを止めている状態でも時間計測を続けたい事もあります。

Time.deltaTimeはTime.timeScaleが0だと取得出来ないので、Time.realtimeSinceStartupを使ってゲーム開始からの時間を取得しタイマーに使います。

Time.timeを使ったサンプルの処理をそのままTime.realtimeSinceStartupに変えただけです。

Time.timeScaleを0にしても時間を進めるサンプル

Time.timeScaleを0にしても時間計測がされているのがわかると思います。

タイトルとURLをコピーしました