Unityの移動は瞬間移動であると言う話【フレームレートについて】

Unity Basis Thumbnail

Unityで物体を移動させた時の挙動について解説していきます。

このことを知っているか知っていないかでUnityでの移動の処理がうまく書けるかどうかが変わってくるので知っておくといいと思います。

<映像とフレーム>

さて、皆さんはこんな事を聞いたことは無いでしょうか?「映像とはすなわち静止画を連続で映して、あたかも動いているように見えるパラパラ漫画のような物だ」と。

そうです。全くその通りです。これはゲームでも当てはまります。そりゃそうですよね。ゲームは映像を出力しているのですから。

テレビとかと違う点は映像を出力する前に計算を行なっている点です。例えばこのサイトのイメージ画像を例にとってみましょう。↓はUnityでレンタリングしたものをキャプチャしたものです。

ogp

この画像ですがたったこれだけの画像の中で様々な計算が行われています。

まず3Dモデルの位置を計算し、そこに貼られているテクスチャをロードし、3Dモデルに適応されたシェーダの計算を行い・・・etc,etcと計算することはいっぱいです。

CPUでこの計算を行なった後、GPUに計算結果を渡し、画像として出力するのです。この計算と画像を出力するまでの一連の流れ1フレームと言います。

<フレームレートとは>

さて、ゲームをプレイしていてフレームレートという言葉をよく聞くと思います。

フレームレートは○○FPSという風に言われます。

よく聞く60FPSとか言うのは「計算と画像の出力」を1秒間に60回行なったと言う意味です。

↑で映像はパラパラ漫画みたいな感じだよと言いましたが60FPSというのは1秒間に60回描画する事であたかも動いているかのように見えているというわけです。

FPSはframe per secondの略ですね。フレーム/秒です。

ちなみにCPUとGPUの処理速度でFPSの値は変動します。ただし、ゲームを作る場合、一定のFPS値に合わせる処理を行なっているのでワザと遅らせてFPSを安定させています。

ゲームが常に60FPSで動いている場合は60FPS以上で動いているのをワザと遅らせて60に合わせているわけです。早くすることはできないので60FPSを切ると一瞬そのFPSになります。FPSがガクつくとゲームがカクカクして動いているように見えます。

60FPSで合わせられない場合は30FPSで合わせます。それが合わせられないとどんどん下のFPSに合わせられて言って最終的に0FPSになります。0になると画面がガクッと止まってしまいます。

<瞬間移動の話>

さて、フレームの話でほぼほぼわかったと思いますが、映像はパラパラ漫画の高速版です。

パラパラ漫画の1枚1枚がフレームです。

Unityでの物体の移動は、座標xyzを指定して画面に描画、座標xyzを指定して描画と言うのを繰り返しています。

unity move

ちょっと違いますが、イメージとしてはこんな感じで、瞬間移動しているのが高速で描画されていることによりあたかも動いているように見えるというのがUnityの仕組みです。

Unityの仕組みというか映像が伴う物ほぼ全てがこの仕組みなのではないでしょうか。

一瞬いちいち左に戻っているのは無視してください

スポンサーリンク

<何故移動の仕組みを理解するべきなのか>

さて、物体を移動するのが瞬間移動であるという事を説明してきましたが、では何故これを理解しなければいけないのかという話をします。

それは移動の計算の仕組みを理解しておかないと様々な問題に対処しづらいからです。

例えば、物理演算を使ったアクションゲームなどで起きやすいのですが、コリジョンをすり抜けたり、何故だかよくわからないけどガクガク変な動きをしたりします。

これは移動の際に瞬間移動で位置を決め、その後物理的に干渉するものから移動する位置を再計算しているからです。

例えばコリジョンをすり抜けるのは瞬間移動の開始位置と移動後の位置から計算し、衝突するなら衝突地点に移動位置を再計算し直す処理が走りますが、開始位置と移動後の位置が遠かったりするとコリジョンをすり抜けます。

collision

移動がガクガクするのは前回の瞬間移動する際に行われた計算の時間と今回瞬間移動する際に行われた計算の時間が違う時によく起こります。

距離 = 速さ × 時間 です。

時間がフレームによりマチマチになったりズレたりするのでこれを考慮していないスクリプトを組んでしまうとガクガクになりやすいです。

こういった様々な問題に対処する為にUnityの移動は瞬間移動であるという基礎知識を身につけておく必要があるという事です。

<初心者の方へ>

ちょっと初心者の方を悩ませてしまうのがこの「瞬間移動」という表現です。サイトや本によってマチマチで色々な表現をされているところが厄介です。

基本的に移動に関する全ての事象が瞬間移動であるのですが、「物理演算による再計算を行わない移動」を瞬間移動と言っているサイトや本もありますし、連続した移動に見えない移動を瞬間移動と言っているサイトや本もありますし、空間転移という表現の仕方をしているサイトや本もあります。

ここがまぁ、ややこしい点ですが、基本的に全ての移動は瞬間移動であると覚えておいてください。

滑らかに移動しているように見えても連続の瞬間移動をしているだけです。これを瞬間移動とは言わない人もいますが、正直言葉の表現の差の世界なので各自脳内補完して解釈をうまくしていただけると助かります。

と、いう事でUnityの移動は瞬間移動であるという話でした。



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