PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

Unityの開発準備2(DebugFontのお話)

需要があるのかどうかは分かりませんが、挫けずUnityの開発準備第2回です!!

 

今回はDebugFontのお話をするわけですが、前回作成したSingletonを継承した実装方法を紹介させていただきます。

 

papersloth.hatenablog.com

 

DebugFontはUnityだからとか関係なく、どの環境でもかなり序盤に用意しますね。

それで、わざわざこんな機能を作った理由についてですが、

デフォルトのDebug.Logやprint関数を毎ループ実行してもらえば分かりますが、

処理が重いです

また、logが流れて確認しにくいです。

そのため、このDebugFontを作成しました。

このクラス内でもFlag切り替えでlogを残せるようにしています('ω')

 

ソースコードがこちらです。 

using UnityEngine;
using System.Collections;

public class DebugFont : TemplateSingleton<DebugFont>
{
private bool m_isDraw; // 描画フラグ
private static Rect m_DrawRect; // 描画用の短形
private static Queue m_logQueue; // ログを格納するキュー

void Start(){
// scene切り換え時に破棄しない
DontDestroyOnLoad(this.gameObject);

// キュー、短形、描画フラグの初期化
// 200.0fと20.0fはマジックナンバーなので要改善ですねw
// private const float RECT_X = 200.0f とかとか
DebugFont.m_logQueue = new Queue();
DebugFont.m_DrawRect = new Rect(0.0f, 0.0f, 200.0f, 20.0f);
this.m_isDraw = true;
}

// ログのプッシュ(エンキュー)
// flgがtrueならUnityのコンソール上にも表示する
public void PushString(string str, bool flg)
{
if(DebugFont.m_logQueue.Count >= 1)
DebugFont.m_logQueue.Dequeue();
DebugFont.m_logQueue.Enqueue(str);

if(flg)
Debug.Log(str);
}

// ログを描画する(Debug.Logより実行速度が早い)
// 描画開始位置、文字の色を指定
public void RenderString(Vector2 pos, Color color)
{
if(!this.m_isDraw)
return;
DebugFont.m_DrawRect.position = pos;
Rect curRect = DebugFont.m_DrawRect;
curRect.y += curRect.height * (DebugFont.m_logQueue.Count - 1);
Color prevColor = GUI.color;
GUI.color = color;
System.Collections.IEnumerator ienum = DebugFont.m_logQueue.GetEnumerator();

while (ienum.MoveNext()){
GUI.Label(curRect, (string)ienum.Current);
curRect.y -= curRect.height;
}
GUI.color = prevColor;
}
}

 

使用例がこんな感じです。 

OnGUI内で記述してください( `ー´)ノ

この例ではFPSの表示を行っています。

private void OnGUI()
{
DebugFont.Instance.PushString("FPS:" + 1 / Time.deltaTime, false);
DebugFont.Instance.RenderString(new Vector2(0, 0), Color.red);
}

処理が遅いなどの改善点があれば教えてください!

今回は以上です!

また、開発準備編続く・・・かもw