【Unity】Debug.LogをTextMeshProに表示する

## 概要

以前作成した『[【Unity】Debug.LogをTextに表示する](https://qiita.com/_udonba/items/0b4db4fd35a27d58b6d7)』のTextMeshPro版です。
TextMeshPro及びTextMeshProUGUIのどちらにも使えます。

Unity Package Manager経由のインポートは下記URLから。MITライセンスです。
https://github.com/udonba/Unity-LogPrompter.git?path=Assets/LogPrompter


![Image from Gyazo](https://i.gyazo.com/7f175e4876fb7b67b5a53949906be99b.gif)



## 機能

- Debug.Logの出力をUIのTextに表示する
- 自動スクロールする（常に最新のログを表示し、古いのは消してゆく）
- （ON/OFF可）ログの先頭にタイムスタンプをつけて表示する
- （ON/OFF可）ログの種類（エラー、警告、通常）に応じて色を変える
- （ON/OFF可）特定の文字列を含むログメッセージは表示しない

（[【Unity】Debug.LogをTextに表示する](https://qiita.com/_udonba/items/0b4db4fd35a27d58b6d7)と同じ）

## 導入
1. Package Managerウィンドウを開き、`Add package from git URL...`から下記URLを入力してLogPrompterをインポートします。
https://github.com/udonba/Unity-LogPrompter.git?path=Assets/LogPrompter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/526c1a87-62b5-0b9e-395a-da373ea03f61.png)

2. LogPrompter.csをTextMeshPro（またはTextMeshProUGUI）のオブジェクトにアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/1bee2a77-c6fa-4dd7-699d-914117962a32.png)

## 使い方・注意

- 特定の文字列を含むログを表示しないようにするには、Ignore Phrases に文字列を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/c0de47b5-3597-eaa0-9fcc-b3e7aae73e92.png)

- TextMeshProに付属してくるフォントアセット（LiberationSans）は日本語を表示できないため、
日本語を表示したい場合は『[UnityのText Mesh Proアセットで日本語を使うときの手順](https://qiita.com/thorikawa/items/03b65b75fa9461b53efd)』等を参考にフォントアセットを作成しましょう。

## 解説
- 自動スクロール
新しいログを文字列の末尾に追加し、古いログを文字列の先頭から削除することでスクロールさせます。

- [TMP_Text.ForceMeshUpdate()](https://docs.unity3d.com/Packages/com.unity.textmeshpro@1.2/api/TMPro.TMP_Text.html#TMPro_TMP_Text_ForceMeshUpdate)
これをやらないとうまくいかないので、文字列を操作する前にやっておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/2ce4e1a2-c3fd-46de-6b78-6fa6aeedeeba.png)


- 枠からはみ出しているかの判定
firstOverflowCharacterIndex プロパティから、はみ出した最初の文字のインデックスを取得できます。
LogPrompterではこれが-1かどうかではみ出しているか判断します。
下図で言うところの水色の×印がついているSが、firstOverflowCharacterIndex から逆算した文字です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/02479691-f672-454b-82d0-71cd0a92760f.png)
※ **このインデックスはテキスト文字列のインデックスでなく、[TMP_TextInfoクラスのcharactorInfoフィールド(配列)](https://docs.unity3d.com/Packages/com.unity.textmeshpro@1.1/api/TMPro.TMP_TextInfo.html#TMPro_TMP_TextInfo_characterInfo)  のインデックスです**。「\<color=red>\</color>」などはcharactorInfoには含まれないため、textMeshPro.text[firstOverflowCharacterIndex] のように使えないことが多いです。

- はみ出したログの数をカウント
枠に文字列が綺麗に収まるよう文字列の先頭を削除するために、はみ出した部分の文字列が何個のログでできているかカウントします。
ところが、**TextInfoには元の文字列の情報が残されていないので、はみ出した文字がどれか分かっても、それが元の文字列のどこに当たるかを知るすべがありません**。
そこで、やや力業ですが… charactorInfo内の改行コードでログ数をカウントします。元のログに改行コードが含まれていなくても、TextMeshPro.textに展開する際に自分で改行コードを付加しているので、逆算的にログ数が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/c0aee17b-0cd0-6b7d-7146-4638254017d5.png)

## 参考
- [【Unity】TextMesh Pro でリッチテキストを除外したテキストを取得する方法](https://baba-s.hatenablog.com/entry/2018/12/25/154500)
- [Class TMP_Text](https://docs.unity3d.com/Packages/com.unity.textmeshpro@1.2/api/TMPro.TMP_Text.html)
- [How to parse tmpro text that contains formatting tags and remove lines](https://forum.unity.com/threads/how-to-parse-tmpro-text-that-contains-formatting-tags-and-remove-lines.569206/)  



## 履歴
- 2020-09-04 作成
- 2021-08-19 Unity Package Manager対応