FPS を変えるところだけ知りたい方は、横線が引かれた下の部分だけお読みください。
Unity で作ったゲームはFPS が自動的に設定されます。端末ごとに自動で決まるので意識しないことも多いかと思います。
FPS は処理の更新頻度と考えることができますが、当然処理が重くなれば高いFPS は出しにくくなっていきます。PC とモバイルの性能差は大きいもので、開発中(PC で作業)のときは問題ないのに実機(モバイル)では動きが滑らかでないということが起きます。 それは描画の処理はハードウェアの仕組みで常に一定のタイミングで変更がなされるためです。(ここでそれについては深く触れないので、Unity で作ったアプリで処理が描画の更新に間に合わなければカクカクした動きになるということだけ認識してください。)
Unity のFPS は変動するので、可変フレームレートの設計で作らなければいけません。Update 関数の呼び出しのタイミングが一定ではないので、前の呼び出しから何秒経ったかを取得しその時間を考慮して更新を行うということです。例えばキャラクターの移動を(速度)×(Time.deltaTime) の値を足していくことで実現していれば良いのです。このように作られていれば、フレームレート(FPS) を変更してもそのままゲームが動くはずです。
Unity でゲームを作れば可変フレームレートの設計になります。更新のタイミングがどうであろうとゲームが動くように作られているなら、FPS の目標値を下げたりする必要があるのかという疑問を思うかもしれません。FPS の目標値が60である場合、FPS は0 ~ 60 までの値を取り得ます。十分に処理に余裕があれば60 の値になり、余裕がないときは10 とかになるでしょう。60 のときは滑らかで10 のときは動きがぎこちない。それを行ったり来たりしてしまうと、非常に見た目が悪くなります。頻繁に低いFPS を取ってしまう場合、処理が重すぎるので目標とするFPS を下げる必要性が出てきます。
FPS の変動が小さくなればそれほど見た目に差は出ません。目標とするFPS が下がると、当然取りうる範囲が狭くなるので変動する可能性が減ります。また更新頻度が下がることで処理にかける時間を増やすことができます。
Unity でFPS を動的に変更する方法は以下のようになります。
Application.targetFrameRate = 30;
というようにして目標とするFPS を指定できます。60 か30 が無難だと思います。
もうひとつ変えなければいけないところがあります。QualitySettings のV Sync Count という設定をDon’t Sync にしなければいけません。これはハードウェアの画面の更新に更新(Update)をあわせるかという設定なので、あわせてしまうとFPS を設定できません。
動的に変えられるといってもゲーム起動時に30FPS に設定してあとは何もしないとかでもかまいません。その場合は単にFPS を半分にしているだけなので、QualitySettings のV Sync Count をEvery Second V Blank にするだけでスクリプトで制御しなくても同じことが実現できます。 (もともとのリフレッシュレートが60FPSならばの話ですが。)
コメント