【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

news2024/9/20 16:46:22

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

在开发中会遇到要将场景中的Text的字体全部替换的情况。

所以就做了一个小工具,可以快速替换Text的字体,主要有一下几个功能:

  • 替换Hierarchy视图所有Text的字体
  • 替换Hierarchy视图Text指定的字体
  • 替换Project视图中所有预制体中所有Text的字体
  • 替换Project视图中所有预制体中Text指定的字体

效果图:

在这里插入图片描述

二、正文

因为是要在Unity3D中编辑器扩展开发,所以代码脚本需要放到Editor文件夹中。

我们首先在Assets目录下,新建Scripts文件夹,在Scripts文件夹下新建Editor文件夹、

在Editor文件夹中新建脚本,命名为ReplaceTheFont.cs:
在这里插入图片描述
双击打开脚本修改代码:

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

public class ReplaceTheFont : EditorWindow
{
    private static ReplaceTheFont window = null;
    private static List<string> prefafbPathList = new List<string>();
    private static Font targetFont;
    private static Font curFont;

    [MenuItem("Tools/字体工具")]
    public static void ShowWindow()
    {
        if (window == null)
            window = GetWindow(typeof(ReplaceTheFont)) as ReplaceTheFont;
        window.titleContent = new GUIContent("字体工具");
        window.Show();
    }
    void OnGUI()
    {
        targetFont = (Font)EditorGUILayout.ObjectField("替换字体:", targetFont, typeof(Font), true);
        curFont = (Font)EditorGUILayout.ObjectField("被替换字体(不指定全部替换)", curFont, typeof(Font), true);
        if (GUILayout.Button("替换场景中Text的字体"))
        {
            //寻找Hierarchy面板下所有的Text
            var tArray = Resources.FindObjectsOfTypeAll(typeof(Text));
            for (int i = 0; i < tArray.Length; i++)
            {
                Text t = tArray[i] as Text;
                //记录对象
                Undo.RecordObject(t, t.gameObject.name);
                if (curFont != null)
                {
                    if (t.font.name == curFont.name)
                    {
                        t.font = targetFont;
                    }
                }
                else
                {
                    t.font = targetFont;
                }
                //设置已改变
                EditorUtility.SetDirty(t);
            }
            Debug.Log("完成");
        }
        if (GUILayout.Button("替换预制体中Text的字体"))
        {
            GetFiles(new DirectoryInfo(Application.dataPath), "*.prefab", ref prefafbPathList);
            for (int i = 0; i < prefafbPathList.Count; i++)
            {
                GameObject gameObj = AssetDatabase.LoadAssetAtPath<GameObject>(prefafbPathList[i]);

                Text[] t = gameObj.GetComponentsInChildren<Text>();
                if (t != null)
                {
                    foreach (Object item in t)
                    {
                        Text text = (Text)item;
                        //记录对象
                        Undo.RecordObject(text, text.gameObject.name);
                        if (curFont != null)
                        {
                            if (text.font.name == curFont.name)
                            {
                                text.font = targetFont;
                            }
                        }
                        else
                        {
                            text.font = targetFont;
                        }
                        //设置已改变
                        EditorUtility.SetDirty(item);
                    }
                }
            }
            AssetDatabase.SaveAssets();
            Debug.Log("完成");
        }
    }

    /// <summary>
    /// 获得Asset目录下所有预制体对象
    /// </summary>
    /// <param name="directory"></param>
    /// <param name="pattern"></param>
    /// <param name="fileList"></param>
    public static void GetFiles(DirectoryInfo directory, string pattern, ref List<string> fileList)
    {
        if (directory != null && directory.Exists && !string.IsNullOrEmpty(pattern))
        {
            try
            {
                foreach (FileInfo info in directory.GetFiles(pattern))
                {
                    string path = info.FullName.ToString();
                    fileList.Add(path.Substring(path.IndexOf("Assets")));
                }
            }
            catch (System.Exception)
            {
                throw;
            }
            foreach (DirectoryInfo info in directory.GetDirectories())
            {
                GetFiles(info, pattern, ref fileList);
            }
        }
    }
}

打开工具,在编辑栏选择Tools→字体工具
在这里插入图片描述
在这里插入图片描述

三、后记

本篇文章实现了Unity3D编辑器扩展小工具,可以快速的替换Hierarchy视图中Text字体或者Project视图中预制体中Text字体的替换功能。

因为是扩展开发,需要将脚本放到Editor文件夹中,具体为啥放到这个文件夹中就不展开讲了,感兴趣的可以百度。

关于这方面的小工具还有很多,后续会发表更多博文的。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NetInside网络分析帮您解决系统性能问题(一)

前言 某大学信息中心负责人表示&#xff0c;有用户反馈&#xff0c;在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN&#xff1a;XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 需要通过分析系统看一下实际情况&#…

云原生周刊 | 人类、机器人与 Kubernetes

近日 Grafana 官网发表了一篇博客介绍了 2022 年比较有意思、脑洞大开的一些 Grafana 使用案例&#xff0c;比如监控特斯拉 Model 3 的充电状态、OTA 更新状况等等。 海事技术供应商 Royal IHC 利用 Grafana 展示客户船队的关键性能指标&#xff0c;例如燃料消耗、服务时间、大…

Allegro174版本新功能介绍之打开坐标超链接功能

Allegro174版本新功能介绍之打开坐标超链接功能 Allegro在升级到174的时候默认打开时,报表中的坐标是不带超链接的,如下图 直接点击坐标,是无法自动跳转到坐标所在位置的 但是Allegro174是开放了打开超链接的功能的,具体操作如下 选择Setup选择User Preferences

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第一篇】(持续更新中)

【 Vue3 Vite setup语法糖 Pinia VueRouter Element Plus 第一篇】(持续更新中) 1.使用 Vite脚手架创建 Vue3 项目 终端输入命令 npm create vite 项目名选择 Vue项目并回车根据自己的爱好&#xff0c;选择配置即可 2. 开启 Network 访问地址 npm run dev后 提示 use -…

磨金石教育||商业插画的发展现状如何?学习插画可以月入过万吗?

商业插画是什么&#xff1f;现如今&#xff0c;商业插画已经在生活中随处可见。你买的所有带包装的产品&#xff0c;上面的各种有趣的产品插图&#xff0c;就是插画师做的产品插画。特别是一些零食类的产品&#xff0c;在包装箱上&#xff0c;我们常可以看到各种大眼睛拟人化的…

电脑出现0xc00000e9错误代码的解决方法

每当假期结束回来&#xff0c;经常发现Windows系统的电脑一段时间不开机&#xff0c;开机就出现0xc00000e9的错误代码。为什么明明没有任何操作却出现错误呢&#xff1f;驱动人生带大家一文了解。 出现0xc00000e9错误代码的原因 先来了解一下电脑出现0xc00000e9错误代码的主要…

数字孪生架构

很多同学对数字孪生特别感兴趣&#xff0c;经常有同学问我&#xff1a;数据孪生系统怎么做&#xff1f;有没有教程&#xff1f;除了Unity开发&#xff0c;开发数字孪生还需要掌握什么技能&#xff1f;有人介绍了一个数字孪生的外包&#xff0c;从来没做过&#xff0c;能不能接&…

Spring 中常用的几个工具类

AnnotatedElementUtils 类 获取某个类的某个方法上是否有标注注解&#xff0c;并可以通过其他 API 获取到这个类注解上的属性值&#xff0c;该工具类其他 API 下面截图可以查看。 public static boolean isBeanAnnotated(Method method) {return AnnotatedElementUtils.hasAn…

Redis 应用问题解决

缓存穿透 key 对应的数据在数据源并不存在&#xff0c;每次针对此key的请求从缓存中获取不到&#xff0c;请求会都压到数据源&#xff0c;从而可能压垮数据源。 解决方案 一个一定不存在的缓存及查询不到的数据&#xff0c;由于缓存是不命中时被动写的&#xff0c;并且处于容…

docker 19.03构建跨平台的镜像包并推送到私有仓库

默认的docker构建image镜像是不能跨平台的,如果需要构建跨平台的镜像,需要docker的版本在19.03版本以上,并开启buildx。以下为具体的步骤 版本:docker 19.03。 一.安装/开启 buildx 1.1.手动开启dockerx开关 docker 19.3 暂默认不开启dockerx,需要手动开启 vim /etc/pro…

Scala 数据结构-集合

文章目录Scala 数据结构-集合一、集合简介1、不可变集合继承图2、可变集合继承图二、数组1、不可变数组(1) 创建数组(2) 访问数组(3) 遍历数组(4) 添加元素Scala 数据结构-集合 一、集合简介 1&#xff09;Scala的集合有三大类&#xff1a;序列seq&#xff0c;集合Set&#x…

解决fstab丢失,重启系统变为只读模式

现象描述&#xff1a; 背景&#xff1a;openEuler20.03 在/etc/fstab文件丢失、重启系统后&#xff0c;系统变为只读模式 [rootlocalhost ~]# echo 111 > 1.txt -bash: 1.txt: Read-only file system 解决方法&#xff1a; 查看系统信息&#xff0c;确认挂载信息&#…

【C进阶】数据在内存中的存储

数据在内存中的存储前言一、数据类型介绍&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;类型的基本归类1.整型家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整形在内存中的存储&#xff08;一&#xff09;原码、反码、补码1.概念2.为什么内存中存的是补码…

android input 事件分发 --- 注册input

android input 事件分发 --- 注册input应用注册input事件应用注册input事件 应用如果要监听input的事件&#xff0c;那么肯定就存在一个注册监听input事件的过程&#xff0c;跟随着addView方法我们跟着走一下frameworks/base/core/java/android/view/WindowManagerImpl.java Ov…

Centos7 安装 MongoDB

使用docker安装Mongo 1、拉取镜像 注&#xff1a;需要科学上网 docker pull mongo [rootlocalhost ~]# docker pull mongo Using default tag: latest latest: Pulling from library/mongo 846c0b181fff: Pull complete ef773e84b43a: Pull complete 2bfad1efb664: Pull co…

LeetCode:14. 最长公共前缀

14. 最长公共前缀1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs [“flo…

python常用快捷键

一、编辑&#xff08;Editing&#xff09;Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09;Ctrl Alt Space 快速导入任意类Ctrl Shift Enter 语句完成Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09;Ctrl Q 快速查看文档F1 外部文档Shift F…

c语言 通讯录 动态内存开辟

通讯录 通讯录中能够存放1000人信息 每个人信息&#xff1a; 姓名年龄性别电话地址 2.增加人的信息 3.删除指定人的信息 4修改指定人的信息 5.查找指定人的信息 6.排序通讯录的信息 contact.h 放头文件的声明 tset.c 测试通讯录模块 contact.c 函数的实现 test.c #include &…

基于不同操作系统升级知行之桥的常见问题

此前的文章知行之桥2022版本升级之页面变化以及监控邮件答疑给大家分享了一些升级到知行之桥最新版本关于Web页面显示和监控邮件的一些问题&#xff0c;本篇将分享一些windows和Linux不同操作系统升级部署知行之桥最新版本的一些Q&A。 EDI服务器是windows服务器 Windows操…

Smart JavaScript UI 14.4.0 Crack【htmlelements】

Smart是一个建立在 JavaScript、HTML 和 CSS 之上的全面且创新的 UI 库。Ω578867473使开发人员能够交付专业的、跨浏览器兼容的 Web 应用程序&#xff0c;同时显着缩短他们的开发时间。Smart HTML Elements 包含 60 多个 UI 组件&#xff0c;是 Web 上发展最快的 JavaScript U…