(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


時間を計る便利クラス【Unity】【C#】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.4.0f3


はじめに

今回はUnity上で時間を簡単に計る方法のご紹介!

ちなみに、iOSやAndroid、Unityエディタ上はもちろん、エディタが再生してない時でも使えます!

ようは、エディタ拡張で作った機能の処理時間も計れるということです。


Stopwatch

今回計測に使うのはStopwatchというUnityではなく.NET Frameworkのクラスです。



使い方はとても簡単。インスタンスを作成し、StartとStopメソッドを実行するだけ。

//Stopwatchのインスタンス作成
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();   

//計測開始
stopwatch.Start (); 

/*計測したい処理*/

//計測終了
stopwatch.Stop ();

//処理時間を秒で取得
float elapsed = (float)stopwatch.Elapsed.TotalSeconds; 

なおusing System.Diagnostics;としてしまうとDebugクラスが被ってしまうため、

Unityで使うときは上記のようにするのがおすすめです。


ProcessTimer

そのままでも使いやすいStopwatchクラスですが、

もっと楽に使えるProcessTimerというものを作ったのでこちらもご紹介!



使い方はStopwatchとほぼ同じですが、

staticクラスなのでインスタンスを作る必要がありません。

//計測開始
ProcessTimer.Start (); 

/*計測したい処理*/

//計測終了&処理時間を秒で取得
float elapsed = ProcessTimer.Stop ();


また、メソッドの処理時間を測るメソッドも作成しました!

複数回実行した場合の合計時間や、平均時間を計ることも可能です。

elapsed = ProcessTimer.MeasureAction (HeavyMethod);           //一回だけ実行した時の処理時間 
elapsed = ProcessTimer.MeasureAction (HeavyMethod, 100);      //100回実行した時の合計処理時間
elapsed = ProcessTimer.MeasureAction (HeavyMethod, 100true);//100回実行した時の平均処理時間
//処理時間を計測したメソッド
private void HeavyMethod(){
 /*計測したい処理*/
} 


さらに、他のメソッドや変数は以下のとおり。

ProcessTimer.Reset ();  //計測した時間をリセット
ProcessTimer.Restart ();//計測した時間をリセットしてから計測を開始する

bool isRunning = ProcessTimer.IsRunning;//計測しているかどうかのフラグ

//現在の処理時間の合計を各単位にfloatで変換したもの(上からミリ秒、秒、分、時間、日)
float totalMilliseconds = ProcessTimer.TotalMilliseconds;
float totalSeconds      = ProcessTimer.TotalSeconds;
float totalMinutes      = ProcessTimer.TotalMinutes;
float totalHours        = ProcessTimer.TotalHours;
float totalDays         = ProcessTimer.TotalDays;

//現在の処理時間の各単位だけをintで抜き出したもの(上からミリ秒、秒、分、時間、日)
int Milliseconds = ProcessTimer.Milliseconds;
int seconds      = ProcessTimer.Seconds;
int minutes      = ProcessTimer.Minutes;
int hours        = ProcessTimer.Hours;
int days         = ProcessTimer.Days;