Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【100个 Unity实用技能】 | Unity实现Text BestFit文本超框时再缩小字体

【100个 Unity实用技能】 | Unity实现Text BestFit文本超框时再缩小字体

作者头像
呆呆敲代码的小Y
发布于 2024-05-25 05:49:24
发布于 2024-05-25 05:49:24
1K10
代码可运行
举报
运行总次数:0
代码可运行

Unity 实用技能学习

Unity实现Text BestFit文本超框时再缩小字体

在使用Text组件时,开启了Best Fit后,文本内容超过一行后就会自动缩小字体,直至缩小到最小字号后才会换行填充。

效果如下所示:

但有些情况下想要的效果是文本满框后再缩小字体,效果如下所示:

所以需要重写Text组件的OnPopulateMesh绘制部分才可以实现效果。

新建一个脚本继承Text,完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 即可。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
真的很棒,大佬666
真的很棒,大佬666
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转
最常见的是在一段正常文本内容中,有中间几个字可以进行点击并执行某种事件,比如很多游戏的聊天大厅中会有玩家发出一段文字并带有装备的名称,此时点击装备就可以弹窗显示装备的信息,这个也算是在文本中加入超链接的一种。
呆呆敲代码的小Y
2023/10/07
1.9K1
【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转
如何在 Unity 2D 和 3D 中放大或缩小以及点击屏幕
在示例代码中,实现了放大或缩小和点击功能。在手机的图库中,缩放和平移/拖动图像时,它具有相同的行为。此示例代码对 unity2d 和 unity3d 对象都起作用。它独立于摄像机;无论主摄像机是 tk2d 摄像机 或 简单的摄像机以及它的投影类型是正交或是透视。
hrscy
2018/08/30
2.5K0
Unity基础(24)-UGUI
组件属性 Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择Texture Type为Sprite(2D and UI))。 Color(颜色):图片叠加的颜色。 Material(材质):图片叠加的材质,可以用来实现一些特殊效果,如凹凸感觉 Raycast Target(射线投射目标):是否作为射线投射目标,关闭之后忽略UGUI的射线检测。 Set Native Size:点击此按钮则 Image 组件的长宽自动与原图片长宽一致 Image Type(图片显示类型): Simple(基本的):图片整张全显示,不裁切,不叠加,根据边框大小会有拉伸。 Preserve Aspect(锁定比例):针对Simple模式,勾选之后,无论图片的外形放大还是缩小,都会一直保持初始的长宽比例。
孙寅
2020/06/02
4.7K0
Unity UI案例(绘制圆环)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/02
2K0
【Unity游戏开发】UGUI不规则区域点击的实现
  马三从上一家公司离职了,最近一直在出去面试,忙得很,所以这一篇博客拖到现在才写出来。马三在上家公司工作的时候,曾处理了一个UGUI不规则区域点击的问题,制作过程中也有一些收获和需要注意坑,因此记录成博客与大家分享。众所周知在UGUI中,响应点击通常是依附在一张图片上的,而图片不管美术怎么给你切,导进Unity之后都是一个矩形,如果要做其他形状,最多只能旋转一下,或者自己做一些处理。而为了美术效果,很多时候我们不得不需要特定形状的UI,并且让它们实现精准的响应点击。例如下图就是一个不规则的点击区域。
马三小伙儿
2018/09/12
3.8K0
【Unity游戏开发】UGUI不规则区域点击的实现
【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理
  最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用。其实,在这款触发器编辑器之前,已经有一款用WinForm开发的1.0版触发器编辑器了,不过由于界面不太友好、操作繁琐以及学习使用成本较高,所以也饱受策划们的吐槽。而新研发的这款编辑器是直接嵌入在Unity中,作为Unity的拓展编辑器来使用的。当然在开发中,马三也遇到了种种的问题,不过还好,在同事的帮助下都一一解决了。本篇博客,马三就来和大家分享一下其中一个比较有趣的需求,RT,“UnityEditor多重弹出窗体与编辑器窗口层级管理”。   针对一些逻辑和数据部分的代码,由于是公司机密而且与本文的内容联系不大,马三就不和大家探讨了,本文中我们只关注UI的表现部分。(本文中所有的样例代码均经过重写,只用了原来的思想,代码结构已经和公司的编辑器完全不一样了,因此不涉及保密协议,完全开源,大家可以放心使用)先来说下今天我们要探讨的这个需求吧:
马三小伙儿
2018/09/12
4.2K0
【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理
[译]Unity 实用技巧
TextArea 特性可以让我们更加方便的在 Inspector 中编辑字符串文本.
用户2615200
2019/08/01
1.2K0
UI绘制
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/02
1.8K0
Unity & 蓝湖 关于UI工作流优化的思考
我们Unity项目关于UI界面制作的工作流是这样的,UI设计人员将设计好的UI界面在Adobe XD中上传至蓝湖,Unity程序猿从蓝湖中下载切图资源包导入项目工程中,根据蓝湖中的效果图、样式信息进行界面的搭建:
CoderZ
2022/08/29
9910
Unity & 蓝湖 关于UI工作流优化的思考
Unity ugui Anchor锚点自动适配画布中的相对位置
https://blog.csdn.net/qq_39640124/article/details/88284191
汐夜koshio
2020/07/02
2.5K0
Unity ugui Anchor锚点自动适配画布中的相对位置
unity3d:ugui 每个字间隔间距
立羽
2023/08/24
3290
UGUI系列-实现层级菜单(Unity3D)
层级菜单在Unity中用到的并不多,主要是做分类的时候用的比较多,今天就给大家分享几个层级代码,扩充一下,写成插件也是不错的。
恬静的小魔龙
2022/08/07
2.1K0
UGUI系列-实现层级菜单(Unity3D)
Unity 编辑器开发实战【Editor Window】- Replacer 替换器
如图所示,假如一个模型被大量的规整的摆放在场景中,当我们修改了这个模型需要替换时,需要将新模型按照如上位置进行逐个替换比较麻烦,下面介绍的工具Replacer可以很方便的进行批量替换:
CoderZ
2022/08/29
4590
Unity 编辑器开发实战【Editor Window】- Replacer 替换器
Unity3d开发
JavaScript之前已经又所了解,但是在之前也只是在网页的基础上进行学习在网页上如何使用JavaScript脚本进行编译
用户8447427
2022/08/18
9.7K0
Unity3d开发
unity3d:文字渐变色
立羽
2023/08/24
4590
Unity3D | 经典小游戏Pacman
在学习的过程中,几个比较重要的知识点就是:预制体、克隆体、精灵渲染器、渲染层级、脚本、碰撞检测、触发检测、AI设计、UI设计、固定物理帧…
全栈程序员站长
2022/08/30
8850
Unity3D | 经典小游戏Pacman
【Flutter&amp;Flame游戏 - 拾】探索构件 | Component 生命周期回调
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 11 天,点击查看活动详情
张风捷特烈
2022/06/19
6020
【Flutter&amp;Flame游戏 - 拾】探索构件 | Component 生命周期回调
AR涂涂乐⭐三、 C#实现识别图进入扫描框显示绿色,未进入为红色功能
测试过程发现几个待改进地点: 1、未考虑手机屏幕可旋转问题,导致旋转后手机UV的二维向量就互换了,即X、y变成了y、x(或其他方式),此时不该除以x(宽) 2、若识别图转动了一定角度(90°、180°、270°),即识别图不和屏幕同一方向了(面片和识别图同方向,面片四个点的 数值根据识别图位置确定,我们获取的是面片数值,转换后与屏幕数值相比较,很明显转动角度后比较的数值是错的),会出现不正确显示问题
星河造梦坊官方
2024/08/14
1700
【Unity3D】官方自带人物控制器研究
5.0.0f4版本的官方自带资源包http://pan.baidu.com/s/1o8Ujrxo
恬静的小魔龙
2020/03/10
4.8K0
【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
在Unity中我们有时候会遇到一些带有透明度的图片按钮,有些时候可能并不希望点击按钮的透明区域时也触发点击事件,这个时候就要进行额外处理,下面整理了几种方法可以进行参考使用!
呆呆敲代码的小Y
2024/03/19
9370
【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
推荐阅读
相关推荐
【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档