今回の記事はUnityでフレームレート(FPS)を固定化する方法と、端末で実行中のアプリのフレームレートを計測するサンプルコードについて書きます。
フレームレートの固定
まずはフレームレートを固定していきたいと思います。設定を行うために「Project Settings」を開きます。
開いたら「Quality」の項目を開きます。
その中にあるチェックボックス が集まったエリアの「Medium」の部分を押します。そしてテレビマークの下の方にある「Default」の横の三角マークを押して、デフォルトの設定を「Medium」に変えます。
※ここで行っている作業は端末で実行時のクオリティ設定と、PCで実行時の設定を揃えて、差が出ないようにするためのものです。
次に下の方にスクロールすると出てくる「VSync Count」を「Don’t Sync」にします。これにより、コードからフレームレート(FPS)を設定できるようになります。
ここまでの設定が終ったら、以下の1行をスクリプトの必ず通る部分に追加してください。なお1度読み込めばOKです。
Application.targetFrameRate = 30;
Start()などで呼び出すことをおすすめします。
これによりフレームレートが30で固定されます。60のゲームを作りたい時は数値を60に変えてください!
端末でフレームレートを計測して表示する
実際にフレームレートが固定されているかを確認するために、フレームレートを計測してみましょう。以下のサンプルを新しいスクリプトとしてプロジェクトに追加してください。
※名前を変えるとエラーになる場合があるので「ViewFPS」というスクリプトで作成してください。
■ViewFPS
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ViewFPS : MonoBehaviour
{
[SerializeField]
private float Interval = 0.1f;
private Text _tex;
private float _time_cnt;
private int _frames;
private float _time_mn;
private float _fps;
private void Start()
{
// FPSの値を別の場所で指定しているなら以下の設定は消す
Application.targetFrameRate = 30;
// テキストコンポーネントの取得
_tex = this.GetComponent<Text>();
}
// FPSの表示と計算
private void Update()
{
_time_mn -= Time.deltaTime;
_time_cnt += Time.timeScale / Time.deltaTime;
_frames++;
if (0 < _time_mn) return;
_fps = _time_cnt / _frames;
_time_mn = Interval;
_time_cnt = 0;
_frames = 0;
_tex.text = "FPS: " + _fps.ToString("f2");
}
}
あとはプロジェクトにテキストを一つ追加し、追加したテキストに上のスクリプトをアタッチしてください。
テキストのサイズが小さくて見えにくい場合は、拡大などを行い見やすい大きさに変更してください!
最後に
これで端末でもフレームレートの確認ができるようになったと思います。
フレームレートを固定することで、端末による環境の差をある程度軽減することが可能です。フレームレートの固定はしっかり行いたいものです。
また、携帯でゲームを行う時は30fpsもあれば十分かと思います。60fpsは、確かに動きは滑らかになりますが、端末が高温になってしまったり、必要以上に電池の消耗を促進させることになったりもします。
作るゲームの規模に合わせて、適切なフレームレートを選びましょう!