今日はUnityでの時間関連の処理を見ていきましょう。時間、と単に言っても実感がわかないかもしれませんが、その有用性はとても大きいです!
たとえばレースゲーム。タイムを表示したいですよね!それには時間の計測が必要です。他にも、カウントダウンにも時間計測が必要ですね!こう考えるとその需要に気づいてもらえると思います。
それでは今回のアジェンダです。
- [基本]Timeクラスとは?
- [基本]経過時間を行おう!
- [基本]カウントダウンを作ろう!
- [応用]見栄えをよくしよう!
- [おまけ]簡単!1行でスローモーションを実装!
まずはUnityで時間関係の処理を行ってくれるTimeクラスについて学びましょう。続けてそれを利用し、経過時間計測・カウントダウンを実装してみましょうか。
最後におまけとしてスローモーションの実装方法を記載しました。うまく使えば、面白い作品が作れそうですね!
Timeクラスとは?
Timeクラスを一言でいうと時間情報を取得するためのクラスと言えます。なんとTimeクラス内部で、すでに色々と計算して、様々な便利な時間を計算してくれているんです。
ユーザーは、Timeクラスの関数を使用し、それを取得するだけ!すばらしいですね!
何ができるの?
なんと現時点で、17種類の関数が存在し、それぞれ便利な時間を取得可能です。とはいえ全てを羅列しても覚えきれないと思います。
そのため今回は、需要の高いTime.time関数を使っていきましょう。この関数を使いこなせれば、基本は完璧です!
Time.timeとは
Time.time関数はゲーム開始からの時間を、秒で返してくれる関数です。より正確には、ゲーム開始からの現在のフレームの開始時刻を秒で返してています。
そのため、同一フレーム中に複数回呼び出しても同じ値になる点に注意しましょう!
時間計測を行おう!
では早速時間計測を始めていきたいと思います。まずはレースゲームなどで使えそうな経過時間計測から見ていきましょう。
まずは事前準備
まずは実行用のスクリプトを用意する必要があります。何かしらオブジェクトを用意して、スクリプトをひも付けましょう。
その中のUpdate関数の中に主に処理を書いていくことになります。今回はTimeManagerというオブジェクトを作成し「TimeManagerクラス」というスクリプトを用意しました。
時間を計測しよう
では早速時間を計測してみましょう!ややこしい処理は省き、一番シンプルにいきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TimeManager : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { Debug.Log ("経過時間(秒)" + Time.time); } }
追加している処理は以下の一行のみです。
Debug.Log ("経過時間(秒)" + Time.time);
Debug.Log関数はUnityのコンソールウィンドウ上に、ログを吐き出してくれる関数です。
より詳細を知りたい人は以下のリンクをお読みください。
ログに経過時間を出しているだけのシンプルな処理ですね。では続けて実行してみましょう。
実行してみよう
時間がちゃんと計測できているのがわかると思います。ログに出しているだけなので、見た目は微妙ですが…。うまく経過時間は取得できていますね!
カウントダウンを作ろう!
先ほどの処理を利用してカウントダウン処理を作ってみましょう!
今回は60秒から、カウントダウンしてみることにしましょうか。
カウントダウンしてみよう
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TimeManager : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { Debug.Log ("残り時間(秒)" + ( 60.0f - Time.time)); } }
と言っても、これも一行で完結ですね!
修正した行はこの一行です。
Debug.Log ("残り時間(秒)" + ( 60.0f - Time.time));
単純に60秒から、経過時間を引いて残り時間を算出しているだけです。
実行してみよう
こちらも実行してみましょう。
ちゃんと時間がカウントダウンされていますね。ただしより正確に書くのなら、if文などで0以下にならないようにする必要があることは覚えておいてください。
今回はわかりやすさを重視し、一番シンプルな形でサンプルを作っています。
見栄えをよくしよう!
ログで表示しているだけではゲームの中に表示ができません。それを解決するために、ゲーム中にTextで表示してみましょう。
以下の記事ではスコアの表示をTextで行っています。今回の内容と組み合わせれば、簡単に時間のText表示が行えるでしょう!
[おまけ]簡単!1行でスローモーションを実装!
実はTimeクラスには、ゲーム中の時間の速度を変更する関数があるんです。それがTime.timeScale関数です!
この関数の初期値は1です。それ以下にするとスローモーションになりますし、それ以上にすれば加速させることも可能です。
例えば、時間の経過速度を1/10にしたければ以下のように記述しましょう。
Time.timeScale = 0.1f;
非常に簡単ですね。例えば、特定のボタンを押している最中だけ速度を下げれば、ゲームにスローモーション機能が実装できますね!
まとめ
いかがでしたか。今回は非常にシンプルに時間の扱い方を学びました。カウントダウン・時間計測はゲームでは必須の機能です。これができれば制限時間や、タイムアタックが実装し放題ですね!
またスローモーションのように、時間の使い方を応用すればユニークなことが実装できますよ。ぜひいろいろと試してみましょう。