CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】フレームレート(fps)の設定・表示方法
こんにちは!ゲームをやっていると60fpsとか、フレームレートといった言葉を聞くことがありますよね。
銃で打ち合うようなゲームの場合は特にフレームレートの設定が重要になってきます。
このフレームレートですが、実はUnityでも簡単に表示・設定できる機能があるんです!
そこで本記事ではフレームレートの基本から、表示方法や設定方法を解説していきます。
フレームレートとは
フレームレート(fps)とは、一秒間に何回フレームが切り替わっているかの単位のことです。
そしてfpsとは「frames per second」の略です。
フレームレートの値が大きいと画面はなめらかに動いているように見え、
逆に値が小さいとカクカクとした動きの画面になります。
また負荷がかかる処理を行う時などに画面が一瞬途切れることがあり、これはフレーム落ちといいます。
Unityにおいてこのフレームレートの値はデフォルトだと自動で調整されるようになっています。
フレームレートの設定方法
ここではフレームレートを実際に設定する方法について、下のような順番で解説していきます。
- フレームレートを表示する
- フレームレートを上げる・落とすことができる固定方法
まずはエディタ上にフレームレートを表示する方法を紹介します。
フレームレートを表示する
フレームレートはUnityのエディタ上から簡単に表示して確認することができます。
プログラムを実行し、Statsをクリックしましょう。
下の画像ように、Graphics: 31.7FPSといった感じでフレームレートの値が表示されます。
実際のプログラムの実行中には、このようにFPSの値が細かく変動し続けているかと思います。
今回はオブジェクトを配置していないのでFPSに大きな変動はないですが、
3Dモデルをたくさん配置したりプログラムの負荷によってはFPSが落ちて安定しないこともあります。
フレームレートを上げる・落とすことができる固定方法
このフレームレートの値を上げたいとき、落としたいときがあると思います。
ここではそんな時に使えるフレームレートの値を固定する方法を解説します。
下のような手順で設定していきます。
- VSsync Count の設定項目を Don’t Sync に変更する
- スクリプトからApplication.targetFrameRateを設定する
まず、Edit→ProjectSettingsを開きましょう。
Quality内にあるVSsync Countの設定項目をDon’t Syncに変更します。
続いて、スクリプトにフレームレートを設定するコードを追加します。
どのスクリプト内でもいいので、Start関数、またはAwake関数内に
Application.targetFrameRate = 60;
というコードを追加しましょう。
これでフレームレートを60に固定する設定ができました。
プログラムを実行してFPSを確認してみましょう。
常に変動はしていますが、60より少し高い数値をキープするようになりました。
今回は60で固定しましたが、Application.targetFrameRateに入れる数値を変えることで
フレームレートを落とすことも上げることもできるので、実行環境によって調整できます。
フレームレートが安定しない時
Application.targetFrameRateでフレームレートを固定しても、
フレームレートが安定せず設定どおりにならないことがあります。
Application.targetFrameRateはあくまで目標とするFPSであり、
ゲームの負荷が大きい時には設定よりもFPSが低くなってしまうのです。
そんな時に確認してみたいのが、UnityのProfilerという機能です。
Profilerを使えば、1フレーム毎のCPUやメモリに対する負荷を確認できます。
ProfilerはWindow→Analysis→Profilerから開くことができます。
すると、このようにProfilerの画面が表示されます。
最初は何もデータが表示されていませんので、プログラムを実行してみましょう。
するとFPSや、CPUの負荷の計測結果が表示されます。
このプログラムではFPSが安定していますが、負荷がかかっている場合、FPSが落ちている箇所が視覚的に分かるので原因となっている箇所を特定できます。
下のように、デフォルトではTimelineになっている項目をHierarchyに変更することでどの処理にどのくらい時間がかかっているかがチェックできます。
ここから負荷の原因となっているスクリプトを見つけて、修正していきましょう。
Profiler上部を下にスクロールすれば、メモリやレンダリングについての負荷なども同様に確認することができます。
レンダリングの負荷は、ライトマップのベイクで下げる方法があります。
ライトマップのベイクについては下の記事で詳しく紹介しています。
フレームレートをスクリプトで取得する
フレームレートをスクリプトで計算、取得して表示させることもできます。
下のようなコードをスクリプトのUpdate関数に追加しましょう。
Time.deltaTimeを使用することでフレーム間の時間を取得しています。
これによりFPSを計算で求めることができます。
void Update()
{
float fps = 1f / Time.deltaTime;
Debug.Log(fps);
}
実行してみると、下のようにコンソールに計算されたFPSの値を表示することができました。
おすすめアセット
Advanced FPS Counter
こちらはフレームレートの表示をカスタマイズできるアセットです。
見た目のカスタマイズ項目が非常に多く用意されており
ゲームやアプリ内にフレームレートを表示させたい時に必ず使いたいアセットです!
デスクトップとモバイルの両方で動作します。
Mesh Baker
こちらは3Dモデルのテクスチャ・メッシュを結合し、軽量化してくれるアセットです。
アセットをたくさんゲーム内に配置すると負荷がかかりフレームレートが落ちることがあります。
そんなときはこのアセットで3Dモデルの描画負荷を下げることで、フレームレートの改善が期待できます!
まとめ
- Statsでエディタ上にフレームレートを表示することができる
- VSsync CountとApplication.targetFrameRateの設定でフレームレートを固定できる
- フレームレートが安定しない時はProfilerで原因箇所を特定できる
- フレームレートをスクリプトから取得・表示できる
以上、Unityでフレームレート(fps)を設定・表示する方法について解説してきました!
フレームレートは最初こそ気にしなくてもゲーム開発を進めることができますが
実際にプレイしてみると意外とカクカクしていた、なんてことになりがちです。
設定方法をぜひ覚えておきたいですね!