LoginSignup
27
8

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-30

はじめに

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

フォントファイル選択時、このように表示されるようになります。
image.png
(複数選択時)
image.png

環境

  • Unity2020.3.14f1

カスタムプレビューを作る

空のプレビューを表示

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

テキストを並べる

フォントを変更し、テキストを並べます。

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

オプションを追加

OnPreviewSettingsをオーバーライドしてプレビュー画面のヘッダーにテキストのオプションを追加します。

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

コード全文

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;
        }
    }
}

27
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
8