Unity TMPro实现文本框自动随文本内容伸缩

2025.3.7更了一个不用写代码的方法,不要看这个啦太复杂了

Unity TMPro实现文本框自动随文本内容伸缩-CSDN博客


主要用于给会变化的文本做一个背景板

思路如下:

1、背景为父物体,带有tmp的物体为子物体

我这里的背景是默认image,用其他的UI组件当背景也可以

2、给父物体挂上Horizontal Layout Group和Content Size Fitter

Content Size Fitter的Horizontal Fit 配置Preferred Size可以让子物体rect 宽度拉伸带动父物体宽度拉伸,Vertical则是高度拉伸带动父物体高度拉伸

 这部分来源于unity官方文档:使 UI 元素适应其内容的大小 - Unity 手册

 PS.这个Child Force Expand是默认勾选的,但是我自己尝试后发现勾和不勾效果完全相同,所以取消了勾选,,感兴趣的小伙伴可以看看手册再研究研究

3、现在我们尝试去拖动子物体的矩形框,发现子物体的宽度变换已经可以带动父物体的宽度变换了,但是现在问题来了,unity本身的TMP组件只有AutoSize只能实现TMP Text的字号随着文本内容的变化而自动调整,不能变换其矩形外框的长宽。所以我们需要写一个脚本来让它随文字长度变换矩形宽度

using UnityEngine;
using TMPro;

public class AdjustTMProSizeByText : MonoBehaviour
{
    private TMP_Text tmpText;

    private RectTransform rectTransform;

    

    void Start()
    {
 
        if (tmpText == null)
        {
            
            tmpText = GetComponent<TMP_Text>();
        }

        rectTransform = GetComponent<RectTransform>();

        UpdateSizeByText();
    }

    void Update()
    {
        // 在Update中实时更新TMP Text的大小
        UpdateSizeByText();
    }

    public void UpdateSizeByText()
    {
        if (tmpText != null && rectTransform != null)
        {
           

            // 获取TMP Text的最佳大小,根据字数和其他文本样式来计算
            Vector2 preferredSize = tmpText.GetPreferredValues(tmpText.text);

            // 调整矩形变换(RectTransform)的大小以适应文本内容的长度
            rectTransform.sizeDelta = preferredSize;
        }
    }
}

将它挂在有文本的子物体上即可实时更新文本框宽度(考虑到性能建议还是注释掉update,在更新文字内容的脚本中调用该脚本的方法UpdateSizeByText())

4、运行后就能查看效果啦


后面试了一下发现unity这个组件对PreferredSize的计算非常迷幻,会出现需要子物体变化超过一定幅度才跟着变换的情况(具有偶然性,没出现这种情况的小伙伴不用看后面了)

因此换一个思路,既然前面已经能用代码根据文本内容调整子物体矩形变换了,为什么不直接在此基础上将这一合适尺寸传给作为背景的父物体呢?(这样写的话就不需要挂上面提到的两个组件了)

主要的改动是给方法UpdateSizeByText()加上返回值,然后写一个代码调用该方法控制父物体矩形变换即可(注意将子物体的锚点锚定,这样不会移位)

修改代码如下

using UnityEngine;
using TMPro;

public class AdjustTMProSizeByText : MonoBehaviour
{
//这个脚本仍应挂到有文本的子物体上
    private TMP_Text tmpText;

    private RectTransform rectTransform;

    void Start()
    {
 
        if (tmpText == null)
        {
            
            tmpText = GetComponent<TMP_Text>();
        }
        
        rectTransform = GetComponent<RectTransform>();
        
        UpdateSizeByText();
    }



    public Vector2 UpdateSizeByText()
    {

        if (tmpText == null)
        {
          
            tmpText = GetComponent<TMP_Text>();
            rectTransform = GetComponent<RectTransform>();
        }
    
        // 获取TMP Text的最佳大小,根据字数和其他文本样式来计算
        Vector2 preferredSize = tmpText.GetPreferredValues(tmpText.text);//主要问题:没算行距
        
        preferredSize.x += 251;//宽度拉伸
      
        //把行距加上
        int lineCount = CountNewLinesInText(tmpText.text);
        float lineSpacing = 35;
        preferredSize.y += lineSpacing * lineCount;
       
        // 调整矩形变换(RectTransform)的大小以适应文本内容的长度
        rectTransform.sizeDelta = preferredSize;

         
        return preferredSize;//把矩形参数传出去
       

    }
    private int CountNewLinesInText(string text)
    {
        int newLineCount = 0;
        for (int i = 0; i < text.Length; i++)
        {
            if (text[i] == '\n')
            {
                newLineCount++;
            }
        }
        return newLineCount;
    }

}

### 关于 Unity 中 TextMesh Pro 的使用教程 TextMesh Pro 是 Unity 提供的一个高级文本渲染工具,能够显著提升游戏中的文本质量和性能。以下是关于其基本用法以及常见问题的解决方法。 #### 1. 安装与配置 要开始使用 TextMesh Pro (TMP),需先确认已安装该功能包。通常情况下,Unity 编辑器内置了此功能包,但仍需手动导入必要资源[^2]。 具体操作如下: - 打开 Unity 菜单栏并选择 `Window > Package Manager`,确保 TextMesh Pro 已启用。 - 接着执行命令 `Window > TextMeshPro > Import TMP Essential Resources` 将基础资源引入项目中。 #### 2. 创建与设置 TextMeshPro 对象 创建一个新的 TextMeshPro 文本对象可以通过右键点击场景层次视图,依次选择 `3D Object > TextMeshPro` 来实现。随后可在 Inspector 面板调整属性,比如字体样式、大小和颜色等参数。 #### 3. 字体资源管理 如果遇到中文无法正常显示的情况,则可能是由于缺少支持汉字的字体文件所致[^3]。此时应加载兼容亚洲语言(尤其是 CJK 字符集)的 TTF 文件作为自定义字体资源。步骤如下: - 准备一份包含所需字符范围的支持多国语言的 TrueType Font (.ttf); - 在 Project 窗口中拖拽上述 .ttf 至 Assets 下新建目录 “Fonts” 内部存储; - 返回至目标 TextMeshPro 组件所在 GameObject 上面关联新字体源即可生效[^1]。 #### 4. 特殊情况下的调试技巧 当发现某些特殊符号或者复制粘贴的内容存在异常现象时,可以尝试排查是否存在隐藏控制码干扰实际布局效果[^4]。例如从 PDF 复制来的数据可能携带额外格式标记引起视觉错乱——只需简单清理原始字符串再重新录入便能恢复正常表现形式。 ```python // 清理输入字符串示例代码 string CleanInput(string rawString){ return System.Text.RegularExpressions.Regex.Replace(rawString, @"\r\n?|\n", "\n"); } ``` 以上即为针对 Unity 开发者们关心如何高效利用 TextMesh Pro 插件及其相关疑难杂症解答指南的一部分内容摘要说明文档[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值