Unity UGUI Text文本框自适应
一、文本框大小固定,文字自适应
1、勾选文本框的Best Fit,发现效果不是特别理想,文本变多的情况下应该是先换行,摆满之后才会字体缩小,如果文本内有空格的情况下,好像是可以的
2、自定义text
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Text
/// 自动收缩
/// 勾选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;
}
}
二、文本框随文字内容变化大小
1、添加Content Size Fitter组件,根据需求选择水平可变还是竖直可变,将对应的Fit改为Perferred Size
三、带背景的文本框随文字内容变化大小
1、在Text文本框的父对象上添加Content Size Fitter和Vertical Layout Group组件
2、Text不能勾选Best Fit
3、调节父对象的Content Size Fitter和Vertical Layout Group组件以达到自己想要的效果
参考
[Unity] UGUI拓展 - 更好用的文字缩放ShrinkText - 简书 (jianshu.com)
(2条消息) Unity -UGUI中Text文本框的自动调整,字体大小的自适应调节_国韵的博客-CSDN博客_ugui 文字自适应