【Unityエディタ拡張】Inspectorにフォントのプレビューを表示する

# はじめに
Unityのinspectorおよびprojectウインドウでは、フォントをプレビューすることができません。
毎回個別に確認するのも大変なので、カスタムプレビューでプレビューを作りました。

フォントファイル選択時、このように表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690588/fe9f3bad-3b88-87dc-644e-65135b72e18f.png)
（複数選択時）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690588/820de21c-b334-8865-0e14-85dfaf0a4be2.png)
# 環境
- Unity2020.3.14f1

# カスタムプレビューを作る
## 空のプレビューを表示

```cs:FontPreview.cs
[CustomPreview(typeof(Font))]
public class FontPreview : ObjectPreview
{
    private readonly GUIContent _previewTitle = new GUIContent("Font Preview");

    //プレビューを表示するか
    public override bool HasPreviewGUI()
    {
        return true;
    }

    //プレビューのタイトルを変更
    public override GUIContent GetPreviewTitle()
    {
        return _previewTitle;
    }

    //プレビューに描画する内容
    public override void OnPreviewGUI(Rect rect, GUIStyle background)
    {
        GUI.Label(rect, "Preview!");
    }
}
```

これで、Fontファイル選択時にプレビューが表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690588/2beb5df0-adc1-e757-46a5-40e7f6afc219.png)
## テキストを並べる
フォントを変更し、テキストを並べます。

```cs:FontPreview.cs
//表示するフォントサイズ
private readonly int[] _fontSizes = { 12, 18, 28, 36, 48, 72, };
private readonly GUIContent _previewTitle = new GUIContent("Font Preview");

private const float PositionOffset = 10;

...

//プレビューに描画する内容
public override void OnPreviewGUI(Rect rect, GUIStyle background)
{
    if (Event.current.type != EventType.Repaint)
    {
        return;
    }

    var font = target as Font;

    var style = new GUIStyle();
    style.font = font;
    style.normal.textColor = Color.white;

    var position = new Rect(rect.y, rect.y + PositionOffset, 0, 0);

    foreach (var fontsize in _fontSizes)
    {
        style.fontSize = fontsize;
        GUI.Label(position, "Preview!", style);
        position.y += fontsize;
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690588/5bca98c5-6332-fc04-473d-a45d2dd9503e.png)
## オプションを追加
OnPreviewSettingsをオーバーライドしてプレビュー画面のヘッダーにテキストのオプションを追加します。

```cs:FontPreview.cs
private static string _customText = string.Empty;
private static FontStyle _fontStyle;

...

//プレビューのヘッダーをカスタマイズ
public override void OnPreviewSettings()
{
    _customText = EditorGUILayout.TextField(_customText, GUILayout.Width(150));
    _fontStyle = (FontStyle)EditorGUILayout.EnumPopup("", _fontStyle, GUILayout.Width(100));
}

//プレビューに描画する内容
public override void OnPreviewGUI(Rect rect, GUIStyle background)
{
    if (Event.current.type != EventType.Repaint)
    {
        return;
    }

    var font = target as Font;

    var style = new GUIStyle();
    style.font = font;
    style.fontStyle = _fontStyle;
    style.normal.textColor = Color.white;

    var position = new Rect(rect.y, rect.y + PositionOffset, 0, 0);

    var text = _customText == string.Empty ? font.name : _customText;

    foreach (var fontsize in _fontSizes)
    {
        style.fontSize = fontsize;
        GUI.Label(position, text, style);
        position.y += fontsize;
    }
}
```

ヘッダーのTextFieldの文字列がプレビューとして表示されます。
空の場合は、フォントの名前をプレビューとして使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690588/403db38b-2961-10a4-3e51-dc9b92f1240c.png)
# コード全文

```cs:FontPreview.cs
using UnityEditor;
using UnityEngine;

[CustomPreview(typeof(Font))]
public class FontPreview : ObjectPreview
{
    //表示するフォントサイズ
    private readonly int[] _fontSizes = { 12, 18, 28, 36, 48, 72, };
    private readonly GUIContent _previewTitle = new GUIContent("Font Preview");

    private const float PositionOffset = 10;

    private static string _customText = string.Empty;
    private static FontStyle _fontStyle;

    //プレビューを表示するか
    public override bool HasPreviewGUI()
    {
        return true;
    }

    //プレビューのヘッダーをカスタマイズ
    public override void OnPreviewSettings()
    {
        _customText = EditorGUILayout.TextField(_customText, GUILayout.Width(150));
        _fontStyle = (FontStyle)EditorGUILayout.EnumPopup("", _fontStyle, GUILayout.Width(100));
    }

    //プレビューのタイトルを変更
    public override GUIContent GetPreviewTitle()
    {
        return _previewTitle;
    }

    //プレビューに描画する内容
    public override void OnPreviewGUI(Rect rect, GUIStyle background)
    {
        if (Event.current.type != EventType.Repaint)
        {
            return;
        }

        var font = target as Font;

        var style = new GUIStyle();
        style.font = font;
        style.fontStyle = _fontStyle;
        style.normal.textColor = Color.white;

        var position = new Rect(rect.y, rect.y + PositionOffset, 0, 0);

        var text = _customText == string.Empty ? font.name : _customText;

        foreach (var fontsize in _fontSizes)
        {
            style.fontSize = fontsize;
            GUI.Label(position, text, style);
            position.y += fontsize;
        }
    }
}
```
https://gist.github.com/SeaeeesSan/1719845e2c001bc5f6b5290fc189ada9