//======================
// ログテキストを管理するクラス
// n行のログに出力し時間が経ったものから消していく
// 2023/06/23
//======================
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class TextLog : MonoBehaviour
{
private const int LogMax = 5; //ログの最大行
private int HideTime = 90; //ログが消えるまでの時間
private string[] log = new string[LogMax];
private int[] hideTime = new int[LogMax];
private StringBuilder sb = new StringBuilder(); //ストリングビルダー
private Text text; //Text(Legacy)への参照
private int lNum; //現在のログ番号
private int j;
// Start is called before the first frame update
private void Start()
{
text = this.GetComponent<Text>();
//ログをクリアする
sb.Clear();
lNum = LogMax - 1;
//まず、改行で埋める
for (int i = 0; i < LogMax; i++)
{
log[lNum] = "\n";
sb.Append(log[i]);
}
//テキストログを作成
BuildLogText();
}
private void FixedUpdate()
{
for (int i = 0; i < LogMax; i++)
{
if (hideTime[i] < 1)
{
log[i] = "";
BuildLogText();
}
else
{
hideTime[i]--;
}
}
}
//新しいメッセージを設定する
public void SetLogText(string _str)
{
lNum = (lNum + 1) % LogMax;
log[lNum] = _str;
hideTime[lNum] = HideTime;
//テキストログを作成
BuildLogText();
}
private void BuildLogText()
{
j = (lNum + 1) % LogMax;
sb.Clear();
for (int i = 0; i < LogMax; i++)
{
if (hideTime[j] < 1)
{
//テキストが無い(表示時間が終わった)場合、改行のみ。
sb.Append("\n");
}
else
{
//テキストがあった場合、テキストと改行を追加する。
sb.Append(log[j]);
sb.Append("\n");
}
j = (j + 1) % LogMax;
}
//テキストフィールドに反映
text.text = sb.ToString();
}
}