Unity におけるフレームと Update

「Unity 入門」の書籍では、話の流れをスムーズにするために敢えて詳しい解説を行わず、簡潔な言及だけで済ませた要素がいくつかあります。その中でも最も大きな要素と考えているのがフレームの概念です。

ここでは、そのフレームの概念について、フレームという言葉に馴染みが無い人にも分かるよう、いちから詳しく解説します。

フレームの概念

Kinetoscope

エジソンのキネトスコープより「くしゃみ」 Wikimedia Commons

一般的な映画は、1秒間に24枚の画像を切替えていくことによって、動きのある映像を作り出します。

Frames

この一枚一枚の画像のことをフレーム (Frame)と呼びます。

コンピューターの世界にも、同じようにフレームの概念があります。ただしコンピューターの場合は、単に記録された画像を切替えていくのではなく、リアルタイムにソフトウェアが生成した画像を切り替えていくことになります。

このとき、ソフトウェアが画像を生成する処理のことをレンダリング (Rendering)と呼びます。

映画と比較するとコンピューターにおけるフレームの切り替え頻度はかなり高く設定されています。表示装置とソフトウェアの仕様によりますが、だいたい1秒間に60フレーム、あるいは50フレーム、30フレームなどが一般的です。

Update 関数

同様に Unity でもフレームの概念が用いられます。あるタイミングでフレームをレンダリングしたら、少しだけ時間を進めて、またレンダリングして、時間を進めて……という繰り返しによって、動きのある映像が作り出されるわけです。

ここで「少しだけ時間を進める」役目を担っているのが Update 関数です。

Update and rendering

Unityにおける時間の進行は、この Update 関数とレンダリングが繰り返し発生することで成り立っています。

Timeline

レンダリングの処理については、各ゲームオブジェクトに付いているレンダラー (Renderer) が自動的に行うので、あまり意識することはないでしょう。しかし「少し時間を進める」処理については、時間が進んだら何が起こるのか、スクリプトによって制御してやらなくてはいけません。

各スクリプトに書かれる Update 関数とは、この処理を記述するためのものです。

Time.deltaTime

映画におけるフレームは「1秒間に24枚」と決まっています。しかし Unity におけるフレームは、1秒間に何枚という決まりはありません。処理の負荷が軽くなればそれだけ高速な書き換えが可能になるため、フレームの秒間枚数は増えます。逆に負荷が重くなれば、書き換えは低速になり、フレームの秒間枚数は減ります。

Variable framerate

このように、フレームとフレームの間隔は動的に変化する可能性があります。つまり Update 関数における「少し時間を進める」の「少しの時間」の量は常に変化しているということです。前もってコンマ何秒のペースで Update 関数が呼ばれるという前提をおくことはできません。

この時間を動的に扱うために用意されているのが Time.deltaTime です。 Time.deltaTime には、前のフレームと今のフレームの時間的な差分が格納されています(単位は秒です)。

deltaTime

Unity において時間の進行を扱う際には、必ずこの Time.deltaTime を基準に用いるようにしましょう。

FixedUpdate 関数

Unity には Update 関数とちょっと似た存在として FixedUpdate 関数というものが用意されています。

この関数は、物理シミュレーター専用に用意されている特殊な Update 関数です。フレームの概念とは関係なく一定時間毎に(デフォルトでは0.01秒)実行されます。

このような関数が存在するのは、 Unity における「フレームの進行」と「物理シミュレーターの進行」がまったく独立しているという事情によるものです。この辺りの事情については、また別の機会に解説したいと思います。ただひとつだけ覚えておいて欲しいのは、 FixedUpdate 関数はフレームを更新するために用意されているものではないということです。