Unity Text 里面有个 Best Fit选项,这个当超过一行文字后就会自动缩小,不是超过整个文本框才自动缩小

使用以下组件可取代Text

 

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

///

/// 勾选Best Fit后,只有超过文本框后才会缩小字号

///

public class ShrinkText : Text

{

///

/// 当前可见的文字行数

///

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 <= 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;

}

}

 

查看原文