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

【Unity中固定宽度文本截断与省略号处理方案】

在UI设计中经常遇到文本内容超出固定宽度的情况,需要实现自动截断并添加省略号的效果。以下是几种实用解决方案:

一:Text组件的自动处理

Unity的Text组件自带水平溢出处理功能:

  • 在Inspector面板找到Text组件
  • 设置Horizontal Overflow为Truncate
  • 勾选Best Fit选项并设置最小/最大字号
  • 这种简单方案适合单行文本处理

对于多行文本,需要更灵活的解决方案。

二:使用TextMeshPro的Ellipsis功能

TextMeshPro提供更专业的文本处理能力:

using TMPro; TMP_Text textComponent = GetComponent<TMP_Text>(); textComponent.overflowMode = TextOverflowModes.Ellipsis; textComponent.enableWordWrapping = false;
  • 设置overflowMode为Ellipsis
  • 关闭自动换行功能
  • 调整字体大小和边距确保布局合理
三:截断算法
1. 当需要更精确控制时,可以使用以下算法:
public static string TruncateWithEllipsis(string input, int maxLength) { if (string.IsNullOrEmpty(input) || input.Length <= maxLength) { return input; } return input.Substring(0, maxLength - 3) + "..."; }
  • 通过字符串操作手动截断
  • 保留3个字符位置给省略号
  • 可结合字体宽度计算进行更精确处理
2. 基于文本渲染宽度动态截断的扩展方法,适用于UI文本控件
public static class StringExtensions { public static string TruncateByWidth(this string text, float maxWidth, Text uiText, string ellipsis = "...") { if (string.IsNullOrEmpty(text)) return text; var settings = uiText.GetGenerationSettings(uiText.rectTransform.rect.size); var textGen = new TextGenerator(); // 如果文本宽度已经小于最大宽度,直接返回 if (textGen.GetPreferredWidth(text, settings) <= maxWidth) return text; var sb = new StringBuilder(); int left = 0, right = text.Length, best = 0; // 二分查找最佳长度 while (left <= right) { int mid = (left + right) / 2; sb.Clear(); sb.Append(text, 0, mid); sb.Append(ellipsis); if (textGen.GetPreferredWidth(sb.ToString(), settings) <= maxWidth) { best = mid; left = mid + 1; } else { right = mid - 1; } } sb.Clear(); sb.Append(text, 0, best); sb.Append(ellipsis); return sb.ToString(); } }

参数

  • text:待处理的原始字符串
  • maxWidth:最大允许渲染宽度
  • uiText:Unity的Text组件实例
  • ellipsis:省略符号

实现要点

  • 使用TextGenerator计算文本渲染宽度
  • 二分查找确定最佳截断长度
  • 适用于动态字体或富文本场景

调用方式

//文本对象 private Text _rechargeInfo; //文本内容 private string _contentStr; //设置固定宽度,可根据自己需求改 private int _defaultWidth = 100; private void Start() { //初始化 _contentStr="你是我的前世今生,我爱你一生一世"; //调用扩展方法 _rechargeInfo.text = StringExtensions.TruncateByWidth(_contentStr, _defaultWidth , _rechargeInfo); }
四:响应式布局方案

结合Content Size Fitter和Layout Group:

  • 为父对象添加Horizontal Layout Group
  • 设置子文本对象的Preferred Width
  • 添加Content Size Fitter组件控制自适应
  • 通过脚本动态调整Preferred Width值
五:性能优化建议

处理大量文本时应注意:

  • 避免每帧计算文本宽度
  • 使用对象池管理频繁更新的文本
  • 对静态文本进行预处理
  • 考虑使用Shader实现特殊效果

以上方案可根据具体需求组合使用,TextMeshPro方案通常能提供最佳效果和性能平衡。对于特殊语言或复杂排版需求,可能需要开发自定义文本处理组件。

http://www.jsqmd.com/news/622787/

相关文章:

  • 【神器 Collection】发票一页两联打印神器
  • YOLOv12与Matlab联合仿真:用于算法原型验证与性能分析
  • 为什么你的leaflet + sf地图在R 4.5中突然变灰?——3行代码修复坐标系自动降级漏洞(仅限4.5.0–4.5.1)
  • E-Hentai Downloader 终极指南:如何免费快速下载漫画并打包为ZIP文件
  • TwinCAT3 安装避坑与项目兼容性实战指南
  • agent的整体架构
  • Steam成就管理器:如何安全高效地掌控你的游戏成就数据
  • springboot 微信小程序的校园新闻发布系统
  • CefFlashBrowser:拯救Flash游戏的终极工具,让经典游戏重获新生![特殊字符]
  • LangGraph终极架构深度解析:构建高可用语言智能体的完整指南
  • 万象视界灵坛入门必看:Bright-Pixel UI组件库二次开发指南
  • 如何用GetQzonehistory完整备份你的QQ空间记忆:终极指南
  • 二维各向同性介质弹性波数值模拟:交错网格有限差分法的实现与优化
  • Nunchaku FLUX.1-dev 操作系统兼容性指南:Windows系统部署要点
  • FaceFusion新手必看:从零开始,手把手教你玩转AI换脸
  • 51单片机学习日志-16
  • 【AI时代质量工程师生存指南】:掌握RAG校验、Agent行为审计、模型漂移预警这3项硬核能力
  • Qwen3-TTS功能体验:除了文本转语音,还能用自然语言微调音色
  • Windows热键冲突终极解决方案:3步快速定位占用进程
  • CentOS 8.5服务器时间同步终极指南:chrony配置+阿里云/腾讯云NTP混搭方案
  • 从PCI到PCIe:一次Read请求的‘分家’之旅,以及超时机制为何成了‘必要之恶’
  • mqtt-plus 架构解析(一):分层架构与设计哲学
  • Qwen3-ASR-1.7B模型压缩实战:轻量化语音识别
  • LabVIEW网络通讯:TCP连接三菱PLC FX3U ENET-ADP的MC协议网络通讯与程序开发
  • 高效自动化Windows任务栏透明化解决方案:TranslucentTB技术深度解析
  • OpenStack Dashboard安装后访问不了?排查这5个坑(从ALLOWED_HOSTS到WSGI配置)
  • 2324基于51单片机的五音门铃系统设计(数码管)
  • ARM64体系结构编程实战:从寄存器操作到异常处理
  • VMware 虚拟机中部署 Intv_AI_MK11:隔离测试环境搭建指南
  • 革命性全平台直播弹幕抓取方案:BarrageGrab技术深度解析