前言
因为要做多语言自适应功能,但是Unity自带的BestFit超过一行后就会自动缩小字体,想要的效果是文本满框后再缩小字体,所以需要重写OnPopulateMesh绘制部分。
代码using UnityEngine.UI;
using UnityEngine;
using System.Collections.Generic;
public class NewText : Text
{
#region 实现超框时再缩小字体,适配多语言
///
/// 当前可见的文字行数
///
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 verts = cachedTextGenerator.verts;
float unitsPerPixel = 1 / pixelsPerUnit;
int vertCount = verts.Count;
// We have no verts to process just return (case 1037923)
if (vertCount
关注
打赏