UnityでTextMeshProにFPSを表示する
はじめに
Statsでも見れるけど…
ゲーム画面上に自由なテキストで表示したい!
そんな要望に応えるクラスです
知ってると思うけど、FPSは一秒間に何回画面を更新してるかの値ですね
パラパラ漫画みたいなものなので数値が大きいほど動きがなめらか😇
コード
早速コードをペタリ
/*
* FPSをTextMeshProに表示するクラス
* FpsToText.cs : Ver. 1.0.0
* Written by Takashi Sowa
* ▼使い方
* TextMeshProで適当なTextを作る
* このクラスを適当なオブジェクトにアタッチし、インスペクタから上記で作ったTextコンポーネントを登録するだけ
* 位置やフォントやフォントサイズはTextのインスペクタから自分で自由に設定
* 負荷が気になる場合は処理タイミングを調整する事も可
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class FpsToText : MonoBehaviour{
[SerializeField, Header("▼TextMeshProコンポーネント")]
TextMeshProUGUI text;
[SerializeField, Header("▼何秒ごとにテキスト更新するか:負荷軽減用"), Range(0, 5)]
int second = 1;
int frameCount = 0;//Updateが呼ばれた回数カウント用
float oldTime = 0.0f;//前回フレームレートを表示してからの経過時間計算用
/*------------------------------------------------------------
1フレームに1回呼び出される、GameObjectとコンポーネントが有効な時に実行される
------------------------------------------------------------*/
void Update(){
//Updateが呼ばれた回数を加算
frameCount++;
//前フレームからの経過時間を計算:Time.realtimeSinceStartupはゲーム開始時からの経過時間(秒)
float time = Time.realtimeSinceStartup - oldTime;
//指定時間を超えたらテキスト更新
if(time >= second){
//フレームレートを計算
float fps = frameCount / time;
//計算したフレームレートを小数点2桁まで丸めてテキスト表示:SetText()を使用してエディタ以外ではGCを発生させない
text.SetText("{0:2} FPS", fps);
//カウントと経過時間をリセット
frameCount = 0;
oldTime = Time.realtimeSinceStartup;
}
}
}
使い方
TextMeshProが入っているという事を前提に話を進めますが、使い方はめちゃくちゃシンプルです
1:上記のコードを右上のコピーマークからコピー
2:空の新規テキストファイルにペースト
3:「FpsToText.cs」というファイル名で保存
4:プロジェクトのどこでもいい適当な場所に置く
5:それを適当なオブジェクトにアタッチ(CanvasとかでOK)
6:TextMeshProで適当なTextを作る
7:アタッチしたコンポーネントに作った6のTextを登録するだけ
位置やフォントやフォントサイズはTextのインスペクタから自分で自由に設定してください
負荷を軽減する為にデフォルトでは1秒毎に更新するようにしてますが、それもインスペクタから変更できるので自由に変更可能です
毎フレーム更新にしたければ0、もっと更新頻度を下げて負荷を減らしたいなら数字を上げればOK
他は特に書くことがないなぁ
おわりに
作っている間はStatsで見れるので不要に思うかもですが、ビルドすると当然画面上では見れないし、エディタでのプレイ中とビルド後のプレイ中ではFPSの値がかなり違うのでビルド後のFPSを確認する事は結構大事かなと
また、ゲームの設定画面でこのFPSの表示非表示切り替えができるようにしておけばユーザーに親切ですね
私の作ったゲーム「44 Minutes in Nightmare」にも入ってます😇(宣伝)
この記事が気に入ったらサポートをしてみませんか?