Unity之自定义Text组件默认属性值

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity之自定义Text组件默认属性值
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 Text 组件

为初学者节省宝贵的学习时间,避免困惑!


前言:

  在做项目的时候策划要求软件中出现的字体要是美术设定好的字体,而不是默认的Arial字体,由于很多时候在创建Text的时候都会忽略设置字体,而且手动去一个个的设置字体有点麻烦,所以就开发了这个功能,在创建Text组件的时候直接修改默认属性值。


TechX 教程效果:

在这里插入图片描述


文章目录

  • 一、创建Text组件默认配置文件
  • 二、加载配置文件并设置Text组件默认值
  • 三、Text组件默认配置文件的加载与保存


一、创建Text组件默认配置文件


在这里我们创建一个ScriptableObject类型的配置文件来保存要修改的默认值,其中包含:

  • 字体
  • 字体大小
  • 字体颜色
  • 对齐方式

在创建配置文件时,创建默认值,其中SourceHanSansCN-Regular为字体资源,在使用时可以换成你自己的字体

[CreateAssetMenu(fileName = "TextDefaultSettingConfig", menuName = "ScriptableObjects/TextDefaultSettingConfig", order = 1)]
[System.Serializable]
public class TextDefaultSettingConfig : ScriptableObject
{
    [SerializeField, HideInInspector]
    private bool isInitialized;

    //自定义默认字体
    public Font defaultFont;
    //自定义默认字体大小
    public int defaultFontSize;
    //自定义默认字体颜色
    public Color defaultFontColor;
    //自定义默认文本对齐方式
    public TextAnchor defaultAlignment;

    private void OnEnable()
    {
        if (isInitialized == false)
        {
            defaultFont = Resources.Load<Font>("SourceHanSansCN-Regular");
            defaultFontSize = 20;
            defaultFontColor = new Color(1, 1, 1, 1);
            defaultAlignment = TextAnchor.MiddleCenter;

            isInitialized = true;
        }
    }
}
  • 设置默认字体为SourceHanSansCN-Regular字体
  • 设置默认字体大小为20
  • 设置默认字体颜色为白色
  • 设置默认对齐方式为居中对齐

在这里插入图片描述



二、加载配置文件并设置Text组件默认值


为了方便使用,要求在创建Text对象的时候就直接应用默认配置,而不需要做其他额外的操作。

ObjectFactory.componentWasAdded能够检测到场景中脚本的挂载,当我们创建Text对象时能够触发该事件。

可以通过[InitializeOnLoad]特性在初始化加载时对ObjectFactory.componentWasAdded事件进行注册。

当挂载的脚本是Text组件时,就可以加载配置文件中的值来应用到Text组件上。

[InitializeOnLoad]
public class TextDefaultFontSetter
{
    public TextDefaultSettingConfig profile;

    static TextDefaultFontSetter()
    {
        //订阅创建新对象时触发的事件
        ObjectFactory.componentWasAdded -= OnComponentWasAdded;
        ObjectFactory.componentWasAdded += OnComponentWasAdded;
    }

    private static void OnComponentWasAdded(Component component)
    {
    	if(component is Text)
    	{
    		SetTextDefaultValueDelay(component as Text);
		}
    }

    private static void SetTextDefaultValueDelay(Component component)
    {
        profile = Resources.Load<TextDefaultSettingConfig>("TextDefaultSettingConfig");
        SetDefaultValueDelay((Text)component, profile);
    }

    private static void SetDefaultValueDelay(Text textComponent, TextDefaultSettingConfig settingConfig)
    {
        // 确保颜色设置在所有其他设置之后
        EditorApplication.delayCall += OnDelayCall;

        void OnDelayCall()
        {
            SetDefaultFont(textComponent, settingConfig);
            SetDefaultSize(textComponent, settingConfig);
            SetDefaultAlignment(textComponent, settingConfig);
            SetDefaultColor(textComponent, settingConfig);

            EditorApplication.delayCall -= OnDelayCall;
        }
    }

    private static void SetDefaultFont(Text textComponent, TextDefaultSettingConfig settingConfig)
    {
        if (textComponent == null) return;

        //将文本组件的字体设置为自定义默认字体
        if (settingConfig == null || settingConfig.defaultFont == null)
        {
            textComponent.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
            Debug.LogWarning("自定义字体为空,请检查配置文件是否正确。使用默认Arial字体。");
        }
        else
        {
            textComponent.font = settingConfig.defaultFont;
        }

        EditorUtility.SetDirty(textComponent);
    }

    private static void SetDefaultColor(Text textComponent, TextDefaultSettingConfig settingConfig)
    {
        if (textComponent == null) return;

        textComponent.color = settingConfig.defaultFontColor;
        EditorUtility.SetDirty(textComponent);
    }

    private static void SetDefaultSize(Text textComponent, TextDefaultSettingConfig settingConfig)
    {
        if (textComponent == null) return;

        textComponent.fontSize = settingConfig.defaultFontSize;
        EditorUtility.SetDirty(textComponent);
    }

    private static void SetDefaultAlignment(Text textComponent, TextDefaultSettingConfig settingConfig)
    {
        if (textComponent == null) return;

        textComponent.alignment = settingConfig.defaultAlignment;
        EditorUtility.SetDirty(textComponent);
    }
}

在新建Text对象时,配置文件默认值已经应用到了Text组件上

在这里插入图片描述



三、Text组件默认配置文件的加载与保存


对于一些以前创建好的Text文本,如果也想使用配置文件中的值,那么就可以通过手动加载配置文件的方式来应用到Text组件上。

或者是对Text组件进行了合适的设置,想把这个设置保存到配置文件中,从而可以应用到其他Text组件上,那么你就可以使用Save保存设置。

[CustomEditor(typeof(Text))]
public class TextExtension : UnityEditor.UI.TextEditor
{
    private Text text => base.target as Text;

    public TextDefaultSettingConfig profile;

    protected override void OnEnable()
    {
        base.OnEnable();

        profile = Resources.Load<TextDefaultSettingConfig>("TextDefaultSettingConfig");
    }

    public override void OnInspectorGUI()
    {
        // 添加分隔线
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Custom Default Settings", EditorStyles.boldLabel);

        profile = (TextDefaultSettingConfig)EditorGUILayout.ObjectField("Profile", profile, typeof(TextDefaultSettingConfig), false);

        EditorGUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace(); // 添加灵活空间

        if (GUILayout.Button("Load", GUILayout.Width(50)))
        {
            text.font = profile.defaultFont;
            text.alignment = profile.defaultAlignment;
            text.fontSize = profile.defaultFontSize;
            text.color = profile.defaultFontColor;
        }

        if (GUILayout.Button("Save", GUILayout.Width(50)))
        {
            profile.defaultFont = text.font;
            profile.defaultAlignment = text.alignment;
            profile.defaultFontSize = text.fontSize;
            profile.defaultFontColor = text.color;
        }

        EditorGUILayout.Space();

        EditorGUILayout.EndHorizontal();

        base.OnInspectorGUI();
    }
}

Profile为默认的配置文件

通过Load可以加载配置文件并应用到Text组件上

通过Save可以保存当前Text上的值到配置文件中

在这里插入图片描述





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

48 - 按日期分组销售产品(高频 SQL 50 题基础版)

48 - 按日期分组销售产品 -- group_concat 分组拼接selectsell_date,count(distinct product) num_sold,group_concat(distinct product order by product separator ,) products fromActivities group bysell_date;

统计是一门艺术(参数假设检验)

1.参数假设检验 在总体分布已知的情况下&#xff0c;对分布中未知参数的检验。 &#xff08;1&#xff09;相关基本概念 零假设/原假设与对立假设/备择假设&#xff1a; 任务&#xff1a;根据样本作出是否接受H0 复合假设与简单假设&#xff1a; 否定域/拒绝域与接受域&…

中霖教育:中级会计师备考误区你中招了吗?

【中霖教育好吗】【中霖教育口碑】 中级会计师考试难度并没有大家想象的那么大&#xff0c;只要掌握正确的备考方法就可以。在准备过程中&#xff0c;部分考生往往会陷入一些备考误区&#xff0c;进而影响复习效率。以下误区看你中招了吗&#xff1a; 一、过度追求数量而非质…

rocketmq简易版搭建

今天真是搭了本人六七个钟&#xff0c;太难了 首先是魔法大战镜像&#xff0c;这波大败而归&#xff0c;连上了&#xff0c;可惜没氪金&#xff0c;永远是没拉完就超时&#xff0c;魔法质量不行&#xff0c;等上班赚点米再改良一下魔法类别&#xff0c;那还得继续linux搭建 1…

ComfyUI高清放大的四种方式(工作流附件在最后)

方式一&#xff1a;Latent放大工作流 1.工作流截图 方式二&#xff1a;ESRGAN&#xff08;传统模型&#xff09;放大工作流 方式三&#xff1a;算法放大&#xff08;后期处理&#xff09;工作流 方式四&#xff1a;Ultimate SD Upscale工作流 这个方式的优势是对于显存底的用…

49 - 列出指定时间段内所有的下单产品(高频 SQL 50 题基础版)

49 - 列出指定时间段内所有的下单产品 -- 指定2020年2月的方法 -- (1) order_date between 2020-02-01 and 2020-02-29 -- (2) order_date like 2020-02% -- (3) DATE_FORMAT(order_date, "%Y-%m") "2020-02" -- (4) LEFT(order_date, 7) 或 subst…

从零开始三天学会微信小程序开发(三)

看到不少入门的小程序开发者不断的问重复性的问题&#xff0c;我们从实战角度开发了这个课程&#xff0c;希望能够帮助大家了解小程序开发。 课程分三天&#xff1a; 第一天&#xff1a;微信小程序开发入门第二天&#xff1a;给小程序接入云端数据第三天&#xff1a;完善我的…

intellij idea安装R包ggplot2报错问题求解

1、intellij idea安装R包ggplot2问题 在我上次解决图形显示问题后&#xff0c;发现安装ggplot2包时出现了问题&#xff0c;这在之前高版本中并没有出现问题&#xff0c; install.packages(ggplot2) ERROR: lazy loading failed for package lifecycle * removing C:/Users/V…

redis未授权访问漏洞复现

一&#xff0c;漏洞介绍 攻击者在未授权访问Redis的情况下&#xff0c;利用Redis自身的提供的config命令&#xff0c;可以进行写文件操作&#xff0c;攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中&#xff0c;进而可以使用对应私…

AI大模型安全挑战和安全要求解读

引言 随着人工智能技术的飞速发展&#xff0c;大模型技术以其卓越的性能和广泛的应用前景&#xff0c;正在重塑人工智能领域的新格局。然而&#xff0c;任何技术都有两面性&#xff0c;大模型在带来前所未有便利的同时&#xff0c;也引发了深刻的安全和伦理挑战。 大模型&…

K8s的基本使用和认识

目录 介绍 控制端 Node(节点) 控制端与节点的关系图 基本使用 创建和运行资源 查找和参看资源 修改和删除资源 介绍 控制端 api-server(api)是集群的核心是k8s中最重要的组件,因为它是实现声明式api的关键 kubernetes api-server的核心功能是提供了Kubernetes各类资…

etcdctl txn如何使用

TXN 从标准输入中读取多个请求&#xff0c;并将它们应用到单个原子的事务操作中。一个事务包含 一系列的条件、所有条件都满足时要执行的一系列请求、任意条件不满足时要执行的一系列请求。 开启事务&#xff1a; etcdctl txn -i 开启事务后&#xff0c;需要先输入判断条件&a…

安装nvm node管理工具后,node跟npm命令却不生效了

在github上下载了nvm的压缩包 自定义安装到D盘之后&#xff0c;node跟npm命令都不生效了 解决办法&#xff1a; 1.在nvm目录下的settings.txt文件中增加淘宝镜像(要把之前安装的node全部删除 nvm uninstall node_mirror: http://npmmirror.com/mirrors/node/ npm_mirror: htt…

【做一道算一道】太平洋大西洋水流问题

太平洋大西洋水流问题 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &…

管理上的一些思考

1 前言 管理可分为自我管理、平级管理、向下管理和向上管理。 顾名思义&#xff0c;自我管理就是对自己工作、生活等各方面的规划和执行&#xff0c;不涉及与其他人互动、配合等。我们设定人生目标、年度计划、月计划等&#xff0c;都可以认为是自我管理。《增广贤文》有段很…

【涵子来信科技潮流】——WWDC24回顾与暑假更新说明

期末大关&#xff0c;即将来袭。在期末之前&#xff0c;我想发一篇文章&#xff0c;介绍有关WWDC24的内容和暑假中更新的说明。本篇文章仅为个人看法和分享&#xff0c;如需了解更多详细内容&#xff0c;请通过官方渠道或者巨佬文章进行进一步了解。 OK, Lets go. 一、WWDC24 …

内网安全【5】隧道搭建

1.内网穿透工具 Ngrok Frp Spp Nps EW(停更) 一共是这五个 优点&#xff1a;穿透加密数据&#xff0c;中间平台&#xff0c;防追踪&#xff0c;解决网络问题 Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 https://github.com/esrrhs/spp https://github.com/fatedie…

第三十九篇——控制论:要不要成为变色龙?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 控制论&#xff0c;看似离我们很遥远&#xff0c;其实我们每天都在做着与…

Big Data Tools插件

一些介绍 在Jetbrains的产品中&#xff0c;均可以安装插件&#xff0c;其中&#xff1a;Big Data Tools插件可以帮助我们方便的操作HDFS&#xff0c;比如 IntelliJ IDEA&#xff08;Java IDE&#xff09; PyCharm&#xff08;Python IDE&#xff09; DataGrip&#xff08;SQL …