Unity一键更换TextMeshPro的字体

目录

1.背景介绍

2.具体代码

3.Undo与Dirty

(1)Undo

 (2)Dirty

4.文件路径的斜杠与反斜杠

5.该脚本的修改与拓展


1.背景介绍

        工作中常见的是,字体资源暂未确定的情况下,先要进行UI的排版布局。待到后续字体资源确定后,再进行统一的更换。

        但是单纯替换字体的方式异常繁琐,又容易遗漏,故而通过此脚本,创造一个EditorGUI,以进行一键更换字体

2.具体代码

using System.Collections.Generic;
using System.IO;
using TMPro;
using UnityEditor;
using UnityEngine;

/// <summary>
/// 该脚本允许一键更换所有TMP_Text与TMP_InputField的字体
/// 包括场景及预制体
/// </summary>
public class ChangeFontWindow : EditorWindow
{
    /*
     * MenuItem属性在编辑器上方创建了一个选项类
     * 默认的类有File, Edit, Assets, GameObject, Component, Window, Help七类
     */

    [MenuItem("Tools/TMP_Text Fonts Change")]
    public static void Open()
    {
        /*
         * GetWindow方法则直接打开了一个小窗口
         * 并调用其中的OnGUI方法
         */
        GetWindow(typeof(ChangeFontWindow));
    }

    private TMP_FontAsset fontToChange;//这个作局部变量使用,用于保护静态变量被随意修改
    private static TMP_FontAsset m_fontToChange;

    private void OnGUI()
    {
        /*
         *  EditorGUILayout.ObjectField生成了一个选项栏,允许给予特定的类型或资产
         *  其返回类型为Object,需要自己进行类型转换
         */
        fontToChange =
            EditorGUILayout.ObjectField(fontToChange, typeof(TMP_FontAsset), true, GUILayout.MinWidth(100f))
            as TMP_FontAsset;

        m_fontToChange = fontToChange;

        /*
         * GUILayout.Button方法绘制了一个按钮,按钮上的字符串便是参数中的值
         * 如果按下了按钮,则该值返回true,并随之调用设定好的函数
         */
        if (GUILayout.Button("Change Fonts In Canvas"))
        {
            ChangeInCanvas();
        }
        if (GUILayout.Button("Change Fonts In Prefabs"))
        {
            ChangeInPrefabs();
        }
    }

    #region 修改场景中的字体

    private static void ChangeInCanvas()
    {
        TMP_Text[] tmpTexts = Resources.FindObjectsOfTypeAll<TMP_Text>();
        TMP_InputField[] tmpInputs = Resources.FindObjectsOfTypeAll<TMP_InputField>();
        foreach (TMP_Text text in tmpTexts)
        {
            /*
             * Undo.RecordObject用于记录场景中的物体的修改
             * EditorUtility.SetDirty用于记录预制体中的修改
             * 拓展内容见后续
             */
            Undo.RecordObject(text, text.gameObject.name);
            text.font = m_fontToChange;
            EditorUtility.SetDirty(text);
        }

        /*
         * 注意到,TMP_InputField下的TMP_Text是无法单纯更改其字体实现的
         * 需要修改TMP_InputField的参数才可以
         */
        foreach (TMP_InputField input in tmpInputs)
        {
            //同上
            Undo.RecordObject(input, input.gameObject.name);
            input.fontAsset = m_fontToChange;
            EditorUtility.SetDirty(input);
        }

        Debug.Log(&
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值