赞
踩
前情:在最近做的一个比较大的项目中,客户要求导入各种图片以及文字。在1920X1080的情况下是采用了42号字体,提供项目后得到的反馈却是字体太糊,经询问得知1920X1080分辨率并不是使用在电脑上,而是在屏幕特别大的仿真机上运行,贴近看确实很糊,但是这个项目使用的Text(Legacy)将近200多个,从头更改不切合实际,于是才有了下面的脚本来解决。
我们都知道Unity的字体是在直接缩放后比较模糊的,所以在使用字体时一般都会等比放大再缩小。
左(原始字体) 右(修正后字体)
修正的方法:将原来的字体的字号夸大N倍,然后宽高也同比例扩大N倍,最后将字体Rect Transform下Scale属性缩小N倍,这样一是能改善清晰度,二就是能保证缩放后的Text仍在原来的位置,不需要其他维护操作(需要注意的是:一定要保证N*当前字体的fontSize<=300,否则字体将会修改后变小)
- 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;
- }
-
- }
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;
- }
- }
-
- }
- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。