//======================
    // ログテキストを管理するクラス
    // 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();
        }
    }