![请添加图片描述](http://image109.360doc.com/DownloadImg/2024/06/1917/285156630_1_20240619051541439_wm.png)
Unity 小知识 大智慧
-
🎬 博客主页:https://xiaoy.blog.csdn.net
-
🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉
-
🎄 学习专栏推荐:Unity系统学习专栏
-
🌲 游戏制作专栏推荐:游戏制作
-
🌲Unity实战100例专栏推荐:Unity 实战100例 教程
-
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
-
📆 未来很长,值得我们全力奔赴更美好的生活✨
-
------------------❤️分割线❤️-------------------------
![请添加图片描述](http://image109.360doc.com/DownloadImg/2024/06/1917/285156630_2_20240619051543110.gif)
Unity 实用技能学习
Unity实现Text BestFit文本超框时再缩小字体
在使用Text组件时,开启了Best Fit后,文本内容超过一行后就会自动缩小字体,直至缩小到最小字号后才会换行填充。
效果如下所示:
![请添加图片描述](http://image109.360doc.com/DownloadImg/2024/06/1917/285156630_3_20240619051546409.gif)
但有些情况下想要的效果是文本满框后再缩小字体,效果如下所示:
![请添加图片描述](http://image109.360doc.com/DownloadImg/2024/06/1917/285156630_4_20240619051549739.gif)
所以需要重写Text组件的OnPopulateMesh绘制部分才可以实现效果。
新建一个脚本继承Text,完整代码如下:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIText : Text
{
#region 实现超框时再缩小字体,适配多语言
/// <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;
//从Best Fit中最大的值开始,逐次递减,每次减小后都尝试生成文本,
//如果生成的文本可见字符数等于文本内容的长度,则找到满足需求(可以使所有文本都可见的最大字号)的字号。
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];
/// <summary>
/// 重写绘制顶点方法
/// </summary>
/// <param name="toFill"></param>
protected override void OnPopulateMesh(VertexHelper toFill)
{
if (null == font) return;
m_DisableFontTextureRebuiltCallback = true;
UseFitSettings();
IList<UIVertex> verts = cachedTextGenerator.verts;
float unitsPerPixel = 1 / pixelsPerUnit;
int vertCount = verts.Count;
// 没有要处理的对象时,直接return。
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();
for (int i = 0; i < vertCount; ++i)
{
int tempVertsIndex = i & 3;
_tmpVerts[tempVertsIndex] = verts[i];
_tmpVerts[tempVertsIndex].position *= unitsPerPixel;
if (roundingOffset != Vector2.zero)
{
_tmpVerts[tempVertsIndex].position.x += roundingOffset.x;
_tmpVerts[tempVertsIndex].position.y += roundingOffset.y;
}
if (tempVertsIndex == 3)
toFill.AddUIVertexQuad(_tmpVerts);
}
m_DisableFontTextureRebuiltCallback = false;
VisibleLines = cachedTextGenerator.lineCount;
}
#endregion
}
需要此效果的时候,创建该文本组件并勾选 Best Fit 即可。
资料白嫖,技术互助
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|
🧡 Unity系统学习专栏 | 入门级 | 本专栏从Unity入门开始学习,快速达到Unity的入门水平 |
💛 Unity实战类项目 | 进阶级 | 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。 |
❤️ 游戏制作专栏 | 难度偏高 | 分享学习一些Unity成品的游戏Demo和其他语言的小游戏! |
💚 游戏爱好者万人社区 | 互助/吹水 | 数万人游戏爱好者社区,聊天互助,白嫖奖品 |
💙 Unity100个实用技能 | Unity查漏补缺 | 针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺 |
![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2024/06/1917/285156630_5_20240619051553846.gif)