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

news2024/11/25 4:37:44

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

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.coloradmin.cn/o/1875895.html

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

相关文章

硬件实用技巧:刚挠板pcb是什么

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140060334 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

SQLServer 表值构造函数 (Transact-SQL)

在 SQL Server 中&#xff0c;表值构造函数&#xff08;Table Value Constructor, TVC&#xff09;是一种用于在单个语句中插入多行数据到表中的语法。它允许你以行内表值表达式&#xff08;row-valued expression&#xff09;的形式指定多行数据&#xff0c;并将这些数据作为一…

基于weixin小程序周边美食系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;美食店铺管理&#xff0c;菜品分类管理&#xff0c;标签管理&#xff0c;菜品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美食店铺&#x…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …

办公软件WPS与Office的区别

临近计算机考试很多同学在纠结我是报wps好&#xff1f;还是ms office好&#xff1f;下面就来详细说说。 1、wps属于国内金山公司的办公软件&#xff0c;里面包含word、Excel和PPT。考试是2021年开始的&#xff01; 2、MS&#xff08;Microsoft 微软&#xff09; office属于美…

web安全渗透测试十大常规项(一):web渗透测试之深入JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411. Java反序列化 1.1 FastJson反序列化链知识点 1、为什…

线程池技术实现及参数工作流程原理

一.什么是线程池 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象。 为什么使用多线程…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

修改docker中mongodb容器的时区

假设容器名称为mongodb&#xff0c;设置时区为上海时区的命令为&#xff1a; docker exec -it mongodb bash -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone"验证时区更改&#xff1a; docker e…

Eigen中关于四元数的常用操作

四元数&#xff08;Quaternion&#xff09;是一种数学工具&#xff0c;广泛用于计算机图形学、机器人学和物理模拟中&#xff0c;特别适合处理三维旋转。Eigen库是一个高性能的C数学库&#xff0c;提供了丰富的线性代数功能&#xff0c;其中就包括对四元数的支持。 1. 为什么选…

element ui form 表单验证

表单验证方法 在el-form元素上总体设置校验规则rules&#xff0c;下面是官方案例 <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><el-form-item label"…

基于Java游戏售卖网站详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中&#xff0c;安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目&#xff0c;用于提供安全访问控制的功能。通过集成Spring Security&#xff0c;我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…

Qt Creator创建一个用户登录界面

目录 1 界面设计 2 代码 2.1 登录界面 2.2 注册界面 2.3 登陆后的界面 3 完整资源 这里主要记录了如何使用Qt Creator创建一个用户登录界面&#xff0c;能够实现用户的注册和登录功能&#xff0c;注册的用户信息存储在了一个文件之中&#xff0c;在登录时可以比对登录信息…

模型预测控制:线性MPC

模型预测控制&#xff1a;线性MPC 模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入&#xff0c;从而实现系统的最优控制。本文将介绍线性MPC的系统模…

C# 实现websocket双向通信

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…

【地理库 Turf.js】

非常全面的地理库 &#xff0c; 这里枚举一些比较常用&#xff0c;重点的功能&#xff0c; 重点功能 提供地理相关的类&#xff1a;包括点&#xff0c;线&#xff0c;面等类。 测量功能&#xff1a;点到线段的距离&#xff0c;点和线的关系等。 判断功能&#xff1a; 点是否在…

Ubuntu系统打包ISO镜像文件

本文以ubuntu20.04系统为例 1.Systemback简介 Systemback 是一个开源的系统备份和恢复工具&#xff0c;它主要用于 Linux 操作系统。Systemback 可以帮助用户创建完整的系统备份&#xff0c;包括操作系统、应用程序、用户数据等&#xff0c;并且可以在需要时将系统恢复到备份的…

5G频段简介

5G频段 5G网络一共有29个频段&#xff0c;主要被分为两个频谱范围&#xff0c;其中6GHz以下的频段共有26个&#xff08;统称为Sub6GHz&#xff09;&#xff0c;毫米波频段有3个。目前国内主要使用的是Sub6GHz&#xff0c;包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

centos上部署Ollama平台,实现语言大模型本地部署

网上有很多大模型&#xff0c;很多都是远程在线调用ChatGPT的api来实现的&#xff0c;自己本地是没有大模型的&#xff0c;这里和大家分享一个大模型平台&#xff0c;可以实现本地快速部署大模型。 Ollama是一个开源项目&#xff0c;它提供了一个平台和工具集&#xff0c;用于部…