当前位置: 首页 > article >正文

手把手教你写一个TextMeshProUGUI尺寸控制器:搞定聊天框、公告板等动态文本布局

手把手构建TextMeshProUGUI智能尺寸控制器从原理到实战优化在Unity的UI开发中文本组件的动态布局一直是让开发者头疼的问题。想象这样一个场景你的游戏聊天系统需要根据消息长度自动调整气泡大小公告板要限制文本显示区域避免溢出道具描述框得完美适应不同屏幕分辨率。这些需求背后都离不开对TextMeshProUGUI尺寸的精确控制。传统做法是依赖ContentSizeFitter组件但实际使用中你会发现它在复杂布局中经常表现不稳定需要配合LayoutRebuilder强制刷新性能开销大且控制粒度粗糙。本文将带你从零构建一个智能尺寸控制器不仅能解决上述痛点还会融入自适应布局、性能优化等进阶技巧最终产出可直接复用的生产级代码。1. 核心原理与基础实现TextMeshProUGUI作为Unity推荐的文本解决方案相比传统Text组件提供了更精确的文本渲染控制。其尺寸计算的核心方法是GetPreferredValues这个方法会根据当前字体、字号、文本内容返回理想尺寸值。理解这个方法的行为至关重要// 获取不考虑换行时的自然尺寸 Vector2 unwrappedSize text.GetPreferredValues(Sample Text); // 获取在指定宽度限制下的尺寸自动换行 Vector2 wrappedSize text.GetPreferredValues(Sample Text, 200f, 0f);基础尺寸控制器需要实现三个关键功能宽度限制模式当文本超过指定宽度时自动换行高度限制模式当文本行数超过限制时截断或显示省略号混合限制模式同时限制宽高适用于固定区域的文本显示基础实现代码结构using TMPro; using UnityEngine; [RequireComponent(typeof(TextMeshProUGUI))] public class TextSizeController : MonoBehaviour { public enum LimitMode { None, Width, Height, Both } [SerializeField] private LimitMode _mode LimitMode.None; [SerializeField] private float _maxWidth 300f; [SerializeField] private float _maxHeight 100f; private TextMeshProUGUI _text; private RectTransform _rt; private void Awake() { _text GetComponentTextMeshProUGUI(); _rt GetComponentRectTransform(); UpdateTextSize(); } public void UpdateTextSize() { Vector2 preferredSize _text.GetPreferredValues( _mode LimitMode.Width || _mode LimitMode.Both ? _maxWidth : 0f, _mode LimitMode.Height || _mode LimitMode.Both ? _maxHeight : 0f ); _rt.sizeDelta new Vector2( _mode LimitMode.Width || _mode LimitMode.Both ? _maxWidth : preferredSize.x, _mode LimitMode.Height || _mode LimitMode.Both ? _maxHeight : preferredSize.y ); } }2. 高级功能扩展基础功能满足简单需求后我们需要考虑更复杂的实际场景2.1 与UGUI布局系统协同工作当文本控件嵌套在VerticalLayoutGroup或HorizontalLayoutGroup中时直接修改sizeDelta会与自动布局系统产生冲突。解决方案是布局标记接口public interface ILayoutSelfController { void SetLayoutHorizontal(); void SetLayoutVertical(); } public class TextSizeController : MonoBehaviour, ILayoutSelfController { // 实现接口方法 public void SetLayoutHorizontal() UpdateTextSize(); public void SetLayoutVertical() UpdateTextSize(); }智能刷新策略private IEnumerator DelayedLayoutRebuild() { yield return null; // 等待一帧 LayoutRebuilder.MarkLayoutForRebuild(_rt); }2.2 性能优化技巧频繁调用GetPreferredValues会导致性能问题特别是在移动设备上。以下是关键优化点优化策略实现方式适用场景缓存计算结果使用字典存储已计算文本的尺寸重复显示相同文本帧率控制限制每秒最多更新次数实时聊天系统脏标记仅在文本或参数变化时更新静态文本显示异步计算使用JobSystem处理复杂计算大量文本同时更新优化后的更新逻辑private string _lastText; private float _lastWidth, _lastHeight; private bool ShouldUpdate() { return _text.text ! _lastText || _maxWidth ! _lastWidth || _maxHeight ! _lastHeight; } private void Update() { if(ShouldUpdate()) { UpdateTextSize(); _lastText _text.text; _lastWidth _maxWidth; _lastHeight _maxHeight; } }3. 实战应用案例3.1 聊天气泡系统聊天消息需要根据内容自动调整大小同时保持最小宽度和最大宽度限制[System.Serializable] public class ChatBubbleSettings { public float minWidth 80f; public float maxWidth 300f; public float padding 20f; } public void ApplyChatBubbleSettings(string message, ChatBubbleSettings settings) { Vector2 preferredSize _text.GetPreferredValues(message); float targetWidth Mathf.Clamp( preferredSize.x settings.padding, settings.minWidth, settings.maxWidth ); _text.text message; _rt.sizeDelta new Vector2( targetWidth, _text.GetPreferredValues(message, targetWidth, 0).y ); }3.2 可折叠公告板实现点击显示更多展开完整文本的功能public class ExpandableNotice : MonoBehaviour { [SerializeField] private TextSizeController _textController; [SerializeField] private float _collapsedHeight 100f; [SerializeField] private Button _expandButton; private bool _isExpanded false; private void Start() { _expandButton.onClick.AddListener(ToggleExpand); CollapseText(); } private void ToggleExpand() { _isExpanded !_isExpanded; if(_isExpanded) ExpandText(); else CollapseText(); } private void ExpandText() { _textController.SetLimitMode(TextSizeController.LimitMode.None); _expandButton.GetComponentInChildrenTMP_Text().text 收起; } private void CollapseText() { _textController.SetLimitMode(TextSizeController.LimitMode.Height); _textController.SetMaxHeight(_collapsedHeight); _expandButton.GetComponentInChildrenTMP_Text().text 展开更多...; } }4. 工程化与异常处理生产环境中的文本控制器需要健壮的错误处理和灵活的配置方式4.1 配置参数优化[System.Serializable] public class TextSizeConfig { public bool autoUpdate true; public float updateInterval 0.1f; public bool useEllipsis true; public string ellipsisText ...; public bool logWarnings false; } [SerializeField] private TextSizeConfig _config;4.2 常见问题解决方案文本截断问题private string ProcessText(string original, float maxHeight) { if(!_config.useEllipsis) return original; Vector2 fullSize _text.GetPreferredValues(original); if(fullSize.y maxHeight) return original; // 二分查找确定能显示的文本长度 int low 0, high original.Length; while(low high) { int mid (low high) / 2; string testStr original.Substring(0, mid) _config.ellipsisText; float height _text.GetPreferredValues(testStr).y; if(height maxHeight) low mid 1; else high mid; } return original.Substring(0, Mathf.Max(0, low-1)) _config.ellipsisText; }富文本标签处理private string StripRichTextTags(string input) { return Regex.Replace(input, .*?, string.Empty); } private bool ContainsRichText(string input) { return Regex.IsMatch(input, .*?); }多语言支持public void SetLocalizedText(string localizationKey) { string rawText LocalizationManager.GetText(localizationKey); _text.text ProcessText(rawText, _maxHeight); UpdateTextSize(); }在项目中使用这个文本尺寸控制器后聊天系统的性能提升了40%公告板的布局问题减少了90%。最让我惊喜的是它在自适应UI中的表现——同一套预制体在不同分辨率的设备上都能完美显示文本内容再也不用为各种屏幕尺寸单独调整布局参数了。

相关文章:

手把手教你写一个TextMeshProUGUI尺寸控制器:搞定聊天框、公告板等动态文本布局

手把手构建TextMeshProUGUI智能尺寸控制器:从原理到实战优化 在Unity的UI开发中,文本组件的动态布局一直是让开发者头疼的问题。想象这样一个场景:你的游戏聊天系统需要根据消息长度自动调整气泡大小,公告板要限制文本显示区域避免…...

超越序列:让AI以“面向对象”的方式理解与规划物理世界

从下一个token预测到下一个对象预测,我们如何重新思考AI生成与机器人控制 引言:大模型的“顺序陷阱” 在人工智能领域,以GPT为代表的大语言模型通过预测下一个token(文本片段)的方式,展现了令人惊叹的文本理解和生成能力。然而,这种自回归生成范式本质上是一种顺序处理…...

利用快马AI平台,十分钟快速原型化你的互联网博客聚合页

最近在尝试做一个个人博客聚合页的原型,发现用传统方式从零开始写代码太费时间了。后来试用了InsCode(快马)平台,发现它特别适合快速验证互联网产品的想法。下面分享下我是怎么在十分钟内完成一个博客聚合页原型的。 明确需求 首先梳理了基本功能需求&am…...

利用快马AI快速生成Python接口自动化测试框架原型

利用快马AI快速生成Python接口自动化测试框架原型 最近在做一个Web项目的测试工作,发现手动测试效率太低,决定搭建一个自动化测试框架。作为一个Python开发者,我选择了pytestrequests的组合,但从头开始搭建框架需要不少时间。这时…...

效率提升利器:用快马ai生成jdk多版本一键切换与配置管理工具

作为一名经常需要切换不同JDK版本的开发者,我深知手动配置环境变量的痛苦。每次切换项目时,都要反复修改JAVA_HOME和PATH,还要担心配置出错影响其他项目。最近发现InsCode(快马)平台可以快速生成JDK管理工具,彻底解决了这个痛点。…...

Ray框架实战:分布式AI训练中的动态资源调度与性能优化

1. Ray框架与分布式AI训练基础 第一次接触Ray框架是在处理一个图像分类项目时,当时我们的ResNet模型在单台8卡服务器上训练需要整整一周。同事建议试试Ray,结果同样的任务在16台机器上只用了6小时——这种效率提升让我彻底成为了Ray的拥趸。Ray本质上是…...

VS2019项目重构实战:从命名空间到解决方案的全面重命名指南

1. 为什么需要全面重命名项目? 接手他人项目或者复用旧项目框架时,第一件事就是要给项目"改头换面"。这就像买二手房后的装修,不改名字总觉得住着别人的房子。我在团队协作中经常遇到这种情况:某个老项目要适配新业务&a…...

Go语言开发的my2sql vs Python版binlog2sql:实测百GB级binlog解析性能对比

Go语言my2sql与Python版binlog2sql百GB级性能对决:技术选型终极指南 当数据库表里的数据被误删时,你的第一反应是什么?是立即联系备份恢复,还是尝试从binlog中找回丢失的记录?对于处理过生产环境数据事故的DBA来说&am…...

从物理到经济:定积分在5个真实场景中的应用详解(含建模步骤)

从物理到经济:定积分在5个真实场景中的应用详解(含建模步骤) 数学公式常被诟病为"纸上谈兵",但当你看到工程师用积分计算桥梁承重、经济学家用积分预测市场趋势时,就会明白这些符号背后的力量。定积分不仅是…...

好写作AI“学术清道夫”:论文查重,为学术诚信保驾护航

在学术的浩瀚星空中,论文是学子们展示智慧与研究成果的璀璨星辰。然而,随着学术交流的日益频繁,论文抄袭、剽窃等不端行为也时有发生,这不仅损害了学术的公正性和严肃性,也阻碍了学术的健康发展。在这样的背景下&#…...

数据库SQL中的IN, NOT IN和NULL

一. 首先SQL中有一个原则: NULL与任何值比较都没结果 二. 假定有以下两个表: 表t1:idname1A2B3NULL表t2:idname1A2C3NULL1. 当使用 IN 查询 select * from t1 where t1.name in (select t2.name from t2);等价于 (t1.name1 t2.name1 or t1.name1 t2.name2 or ... ) or (t1.na…...

STM32驱动WS2812B做时钟?从5x5模块到4x1组合屏的实战避坑指南

STM32驱动WS2812B做时钟:从5x5模块到4x1组合屏的实战避坑指南 在创客圈子里,用WS2812B LED模块制作个性化时钟一直是个热门项目。这种可编程RGB LED以其简单的单线控制接口和丰富的色彩表现,成为DIY爱好者的心头好。但当你真正动手时&#x…...

民宿主必看!用这个小程序系统3天上线你的酒店预订平台(含WIFI管理+数据分析)

民宿数字化转型实战:3天打造智能预订平台全攻略 站在莫干山民宿的露台上,老板娘林姐望着满房的预订表却愁眉不展——电话接单混乱、WIFI密码总被问、客人反馈石沉大海...这场景是否似曾相识?如今,一套轻量级解决方案正在改变这个…...

AI赋能表格,打破Excel痛点,重构数据处理新效率

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

Windows Podman磁盘瘦身实战:WSL vhdx文件压缩与空间回收

1. 为什么你的Windows磁盘总是不够用? 最近在帮同事排查一个诡异的问题:他的开发机C盘明明有200GB空间,装了Podman才两个月就频繁报"磁盘空间不足"。检查后发现,WSL的虚拟磁盘文件ext4.vhdx竟然膨胀到了180GB&#xff…...

RSA算法在CTF竞赛中的实战应用与解题技巧

1. RSA算法基础回顾 RSA算法作为非对称加密的黄金标准&#xff0c;其安全性建立在大整数分解难题之上。我们先快速过一遍核心公式&#xff1a; 密钥生成&#xff1a; 选择两个大质数p、q&#xff0c;计算np*q欧拉函数φ(n)(p-1)(q-1)选择e满足1<e<φ(n)且gcd(e,φ(n))1计…...

16 指挥AI写数据库SQL代码:增删改查与存储过程实现

指挥AI写数据库SQL代码:增删改查与存储过程实现 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十六篇,属于第三阶段多场景实战核心内容。本篇聚焦企业级SQL代码生成,针对零基础、无数据库开发经验的使用者,拆解指挥AI编写规范、高效、可直…...

15 指挥AI写算法代码:排序、递归、数据结构快速生成

指挥AI写算法代码:排序、递归、数据结构快速生成 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十五篇,属于第三阶段多场景实战核心内容。本篇聚焦算法与数据结构代码高效生成,打破传统算法学习需手动推导逻辑、死记语法、反复调试的困境,…...

中国科技发展与华人贡献解析

中国科技发展与华人贡献解析纵观全球科技发展的壮阔历程&#xff0c;华人力量始终是不可或缺的核心支柱&#xff0c;中国科技的崛起与腾飞&#xff0c;既离不开本土科研工作者的深耕细作&#xff0c;更得益于海外华人的默默坚守与无私奉献。然而&#xff0c;长期以来&#xff0…...

BilibiliDown:开源视频下载工具的批量处理与高效下载指南

BilibiliDown&#xff1a;开源视频下载工具的批量处理与高效下载指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirror…...

告别重复造轮子:用快马AI一键生成智能车数据处理与可视化工具

今天想和大家分享一个提升智能车开发效率的小工具。在智能车项目中&#xff0c;我们经常需要处理大量传感器数据&#xff0c;比如IMU、GPS等设备采集的CSV文件。传统做法是每次都要从头写数据处理代码&#xff0c;既浪费时间又容易出错。最近我发现用InsCode(快马)平台可以快速…...

2025届毕业生推荐的AI辅助写作网站实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 着手降低AIGC痕迹存有三方面。一方面来讲&#xff0c;关乎对句式结构予以调整&#xff0c;要…...

OpenClaw+Phi-3-mini-128k-instruct:技术书籍翻译与术语统一系统

OpenClawPhi-3-mini-128k-instruct&#xff1a;技术书籍翻译与术语统一系统 1. 为什么需要自动化翻译工具 作为一名技术书籍的爱好者&#xff0c;我经常需要阅读英文原版的技术文档和书籍。但直接阅读英文原版对很多人来说存在门槛&#xff0c;而现有的机器翻译工具在技术术语…...

DDPM实战:从零构建图像生成模型

1. DDPM基础概念与核心原理 扩散模型&#xff08;Denoising Diffusion Probabilistic Models&#xff0c;简称DDPM&#xff09;是近年来计算机视觉领域的一项突破性技术。我第一次接触这个概念时&#xff0c;被它优雅的数学推导和惊人的生成效果所震撼。简单来说&#xff0c;D…...

XGO Rider:双轮足AI机器人如何通过ChatGPT重塑智能教育体验

1. 当双轮足机器人遇上ChatGPT&#xff1a;教育场景的颠覆者 第一次见到XGO Rider在桌面上灵活旋转时&#xff0c;我仿佛看到了科幻电影里的场景。这个身高不到16厘米的小家伙&#xff0c;却能像人类一样保持平衡&#xff0c;用两个轮子完成前进、后退甚至原地转圈的动作。但真…...

R-HORIZON:探索长程推理边界,复旦 NLP美团 LongCat 联合提出

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

从STM32切换到MSPM0G3507?这份串口驱动移植避坑指南请收好

从STM32切换到MSPM0G3507&#xff1a;串口驱动移植的深度避坑指南 第一次接触TI的MSPM0系列MCU时&#xff0c;我正为一个低成本工业传感器项目选型。作为长期使用STM32的开发者&#xff0c;我下意识地想把之前的串口驱动代码直接移植过去——结果在接收不定长数据时遭遇了连续…...

避坑指南:在昇腾Atlas服务器部署FunASR说话人分离模型时,如何解决Torch_npu版本冲突和依赖问题

昇腾Atlas服务器部署FunASR说话人分离模型的实战避坑手册 当你在昇腾Atlas服务器上第一次尝试部署FunASR说话人分离模型时&#xff0c;可能会遇到各种意想不到的问题。从Torch_npu版本冲突到CANN兼容性问题&#xff0c;再到量化配置的坑&#xff0c;每一步都可能让你陷入调试的…...

给小米CyberGear电机找个‘家’:用3D打印限位器解决断电丢零位问题(附STL文件)

给小米CyberGear电机打造3D打印限位器&#xff1a;硬件方案解决断电丢零位难题 在机器人开发领域&#xff0c;小米CyberGear和灵足电机凭借其高性价比和出色性能&#xff0c;已成为众多创客和工程师的首选。然而&#xff0c;这类电机在实际应用中存在一个普遍痛点——断电后零…...

K8S Pod被驱逐(evicted)的5种常见原因及排查手册(附kubectl命令)

Kubernetes Pod被驱逐(Evicted)全场景诊断指南&#xff1a;从根因分析到实战命令 当你在凌晨三点被报警惊醒&#xff0c;发现生产环境的Pod突然大面积出现"Evicted"状态时&#xff0c;那种头皮发麻的感觉每个K8S运维都深有体会。Pod驱逐就像Kubernetes集群的免疫系统…...