Unity Text自动缩放文本
Unity Text 里面有个 Best Fit选项,这个当超过一行文字后就会自动缩小,不是超过整个文本框才自动缩小
使用以下组件可取代Text
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 勾选Best Fit后,只有超过文本框后才会缩小字号 /// </summary> public class ShrinkText : Text { /// <summary> /// 当前可见的文字行数 /// </summary> public int VisibleLines { get; private set; } private void _UseFitSettings() { TextGenerationSettings settings = GetGenerationSettings(rectTransform.rect.size); settings.resizeTextForBestFit = false; if (!resizeTextForBestFit) { cachedTextGenerator.PopulateWithErrors(text, settings, gameObject); return; } int minSize = resizeTextMinSize; int txtLen = text.Length; for (int i = resizeTextMaxSize; i >= minSize; --i) { settings.fontSize = i; cachedTextGenerator.PopulateWithErrors(text, settings, gameObject); if (cachedTextGenerator.characterCountVisible == txtLen) break; } } private readonly UIVertex[] _tmpVerts = new UIVertex[4]; protected override void OnPopulateMesh(VertexHelper toFill) { if (null == font) return; m_DisableFontTextureRebuiltCallback = true; _UseFitSettings(); // Apply the offset to the vertices IList<UIVertex> verts = cachedTextGenerator.verts; float unitsPerPixel = 1 / pixelsPerUnit; int vertCount = verts.Count; // We have no verts to process just return (case 1037923) if (vertCount <= 0) { toFill.Clear(); return; } Vector2 roundingOffset = new Vector2(verts[0].position.x, verts[0].position.y) * unitsPerPixel; roundingOffset = PixelAdjustPoint(roundingOffset) - roundingOffset; toFill.Clear(); if (roundingOffset != Vector2.zero) { for (int i = 0; i < vertCount; ++i) { int tempVertsIndex = i & 3; _tmpVerts[tempVertsIndex] = verts[i]; _tmpVerts[tempVertsIndex].position *= unitsPerPixel; _tmpVerts[tempVertsIndex].position.x += roundingOffset.x; _tmpVerts[tempVertsIndex].position.y += roundingOffset.y; if (tempVertsIndex == 3) toFill.AddUIVertexQuad(_tmpVerts); } } else { for (int i = 0; i < vertCount; ++i) { int tempVertsIndex = i & 3; _tmpVerts[tempVertsIndex] = verts[i]; _tmpVerts[tempVertsIndex].position *= unitsPerPixel; if (tempVertsIndex == 3) toFill.AddUIVertexQuad(_tmpVerts); } } m_DisableFontTextureRebuiltCallback = false; VisibleLines = cachedTextGenerator.lineCount; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2020-10-14 从Windows 部署Unity应用到iOS上