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

张开发
2026/4/11 9:31:38 15 分钟阅读

分享文章

【Unity中固定宽度文本截断与省略号处理方案】
在UI设计中经常遇到文本内容超出固定宽度的情况需要实现自动截断并添加省略号的效果。以下是几种实用解决方案一Text组件的自动处理Unity的Text组件自带水平溢出处理功能在Inspector面板找到Text组件设置Horizontal Overflow为Truncate勾选Best Fit选项并设置最小/最大字号这种简单方案适合单行文本处理对于多行文本需要更灵活的解决方案。二使用TextMeshPro的Ellipsis功能TextMeshPro提供更专业的文本处理能力using TMPro; TMP_Text textComponent GetComponentTMP_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最大允许渲染宽度uiTextUnity的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方案通常能提供最佳效果和性能平衡。对于特殊语言或复杂排版需求可能需要开发自定义文本处理组件。

更多文章