1.问题的出现以及解释
前情:在最近做的一个比较大的项目中,客户要求导入各种图片以及文字。在1920X1080的情况下是采用了42号字体,提供项目后得到的反馈却是字体太糊,经询问得知1920X1080分辨率并不是使用在电脑上,而是在屏幕特别大的仿真机上运行,贴近看确实很糊,但是这个项目使用的Text(Legacy)将近200多个,从头更改不切合实际,于是才有了下面的脚本来解决。
2.脚本实现原理
我们都知道Unity的字体是在直接缩放后比较模糊的,所以在使用字体时一般都会等比放大再缩小。
左(原始字体) 右(修正后字体)
修正的方法:将原来的字体的字号夸大N倍,然后宽高也同比例扩大N倍,最后将字体Rect Transform下Scale属性缩小N倍,这样一是能改善清晰度,二就是能保证缩放后的Text仍在原来的位置,不需要其他维护操作(需要注意的是:一定要保证N*当前字体的fontSize<=300,否则字体将会修改后变小)
3.基础脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class textImprovement : MonoBehaviour
{
//分别获取到缩放前的宽,高,缩放
private float widthText;
private float heightText;
private Vector3 scaleText;
//放大的比例
private int scaleNum;
void Start()
{
scaleNum = 2;
//获取更改前长,宽,缩放
widthText = this.GetComponent<RectTransform>().rect.width;
heightText = this.GetComponent<RectTransform>().rect.height;
scaleText = this.transform.localScale;
//更改修改后长,宽,缩放
this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum, heightText * scaleNum);
this.transform.localScale = scaleText / scaleNum;
//更改修改后字号
this.transform.GetComponent<Text>().fontSize*=scaleNum;
}
}
4.注意事项以及已知问题解决方法
1.缩放异常:当字体的长宽非常贴合情况下,有可能会导致缩放有不可控细微差别而导致无法正确显示字体
(缩放倍率3倍,未运行脚本显示正常)
(缩放倍率3倍,运行后字体消失)
解决方法:略微扩大更改后的长宽
this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum*1.01f, heightText * scaleNum * 1.01f);
2:缩放倍率(上面脚本的scaleNum)尽量不要太大:10以下即可,倍率为2的情况下2K都是很清晰的(在字体较多并采用高倍率字号缩放的情况下会出现此报错)
(测试变量:字数:3730,基础字号:40,缩放倍率为5)
解决方法:减少缩放倍率 ,同样测试下:三倍缩放倍率报错消失
3:如果你字体上本身带有ContentSizeFitter组件则需要先禁用再启用(当ContentSizeFitter启用时,Rect的长宽则受ContentSizeFitter影响,脚本可能会受影响)
\
(属性异常,缩放倍率为3倍,正确结果为Width=176*3=528,Height=44*3=132,但是运行后出现错误结果:272)
解决方法:判断是否含有ContentSizeFitter组件,如果有则先关闭,更改之后再重新打开.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class textImprovement : MonoBehaviour
{
//分别获取到缩放前的宽,高,缩放
public float widthText;
public float heightText;
private Vector3 scaleText;
//放大的比例
private int scaleNum;
void Start()
{
scaleNum =3;
if (this.GetComponent<ContentSizeFitter>())
{
this.GetComponent<ContentSizeFitter>().enabled = false;
}
//获取更改前长,宽,缩放
widthText = this.GetComponent<RectTransform>().rect.width;
heightText = this.GetComponent<RectTransform>().rect.height;
scaleText = this.transform.localScale;
//更改修改后长,宽,缩放
this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum, heightText * scaleNum);
this.transform.localScale = scaleText / scaleNum;
//更改修改后字号
this.transform.GetComponent<Text>().fontSize*=scaleNum;
if (this.GetComponent<ContentSizeFitter>())
{
this.GetComponent<ContentSizeFitter>().enabled = true;
}
}
}
5.优化后脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class textImprovement : MonoBehaviour
{
//分别获取到缩放前的宽,高,缩放
public float widthText;
public float heightText;
private Vector3 scaleText;
//放大的比例
private int scaleNum;
void Start()
{
if (this.GetComponent<Text>())
{
scaleNum = 3;
if (this.GetComponent<ContentSizeFitter>())
{
this.GetComponent<ContentSizeFitter>().enabled = false;
}
//获取更改前长,宽,缩放
widthText = this.GetComponent<RectTransform>().rect.width;
heightText = this.GetComponent<RectTransform>().rect.height;
scaleText = this.transform.localScale;
//更改修改后长,宽,缩放
this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum * 1.01f, heightText * scaleNum * 1.01f);
this.transform.localScale = scaleText / scaleNum;
Debug.Log(this.transform.localScale.x);
//更改修改后字号
this.transform.GetComponent<Text>().fontSize *= scaleNum;
if (this.GetComponent<ContentSizeFitter>())
{
this.GetComponent<ContentSizeFitter>().enabled = true;
}
}
}
}
使用方法:直接赋予需要改善的Text组件此脚本,如果需要大量更改则在Hierarchy面板搜索全部Text,Ctrl+A全选并赋予脚本(点击放大镜并在放大镜下拉菜单选择Type)文章来源:https://www.toymoban.com/news/detail-822132.html
文章来源地址https://www.toymoban.com/news/detail-822132.html
到了这里,关于Unity通过改变文本Rect长宽以及缩放来改善Text(Legacy)的清晰度思路,操作以及代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!