Unityで時間を扱う

 Unityでゲームなどを作るとき、「○秒置きに敵に攻撃させたい」「1秒にこれだけ動かしたい(速さをこれくらいにしたい)」といった実装が必要なことは少なくありません。
 通常こういった処理を行いたい場合、Animationを設定するか、スクリプトのUpdate内に実装するのですが、特にUpdate内に処理を書く場合に注意すべきことがあります。

UnityのUpdateはフレームごとに実行される

 これはある程度Unityをやっている人には常識ですが、Updateは一定の間隔で呼び出されているわけではありません。フレームごとに呼び出されます。
 フレームとは一回の描画のことです。ゲームは通常「処理を行い、画面に描画する」ということの繰り返しで実行されます。この繰り返しの一単位がフレームとなるわけです。そしてフレームごとの時間間隔は一定ではありません。処理が重かったりPCのスペックが低かったりすればフレームごとの時間間隔は長くなる可能性がありますし、反対に処理が軽かったり良いPCを使ったりすればフレームごとの時間間隔は短くなる可能性があります。したがって、Update内で毎回 x++ とするようなコードを書いてしまうと、PCのスペックや処理内容によって x の増え方が変わってしまいます。

Time.deltatime

 Unityでは時間に関わる処理を行うための機能が用意されています。それが Time.deltatime です。
 これはフレーム間の時間を取得してくれるものです。これを使えば環境や処理内容に依存せず、時間のみに依存する実装を行うことができます。
 次に使い方の例を上げておきます。

一秒ごとに10単位動き続けるコード

10秒ごとに何かを実行するコード

 ※なお、[SerializeField]とあるのはprivateなフィールドをUnityのインスペクターからいじれるようにするためです。こうしておくと、このスクリプトを付与したGameObjectのインスペクターをいじることで、オブジェクトによって違う間隔、違う速さを設定できるようになります。もちろんpublicフィールドでもよいのですが、オブジェクト指向的にはこちらの方が好ましいのでこのようにしました。プロパティをインスペクターで扱いたいと言ったオブジェクト指向的により良い実装を行う方法も紹介していますので興味があったらこちらもどうぞ。
【Unity】Unityでインスペクター(エディタ)から操作が可能なプロパティを使う方法

 

スポンサーリンク