当前位置:   article > 正文

Unity通过改变文本Rect长宽以及缩放来改善Text(Legacy)的清晰度思路,操作以及代码实现_unity text 文本缩略

unity text 文本缩略

1.问题的出现以及解释

前情:在最近做的一个比较大的项目中,客户要求导入各种图片以及文字。在1920X1080的情况下是采用了42号字体,提供项目后得到的反馈却是字体太糊,经询问得知1920X1080分辨率并不是使用在电脑上,而是在屏幕特别大的仿真机上运行,贴近看确实很糊,但是这个项目使用的Text(Legacy)将近200多个,从头更改不切合实际,于是才有了下面的脚本来解决。

2.脚本实现原理

我们都知道Unity的字体是在直接缩放后比较模糊的,所以在使用字体时一般都会等比放大再缩小。

           

                                左(原始字体)                                             右(修正后字体)

修正的方法:将原来的字体的字号夸大N倍,然后宽高也同比例扩大N倍,最后将字体Rect Transform下Scale属性缩小N倍,这样一是能改善清晰度,二就是能保证缩放后的Text仍在原来的位置,不需要其他维护操作(需要注意的是:一定要保证N*当前字体的fontSize<=300,否则字体将会修改后变小)

3.基础脚本代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class textImprovement : MonoBehaviour
  6. {
  7. //分别获取到缩放前的宽,高,缩放
  8. private float widthText;
  9. private float heightText;
  10. private Vector3 scaleText;
  11. //放大的比例
  12. private int scaleNum;
  13. void Start()
  14. {
  15. scaleNum = 2;
  16. //获取更改前长,宽,缩放
  17. widthText = this.GetComponent<RectTransform>().rect.width;
  18. heightText = this.GetComponent<RectTransform>().rect.height;
  19. scaleText = this.transform.localScale;
  20. //更改修改后长,宽,缩放
  21. this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum, heightText * scaleNum);
  22. this.transform.localScale = scaleText / scaleNum;
  23. //更改修改后字号
  24. this.transform.GetComponent<Text>().fontSize*=scaleNum;
  25. }
  26. }

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组件,如果有则先关闭,更改之后再重新打开.

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class textImprovement : MonoBehaviour
  6. {
  7. //分别获取到缩放前的宽,高,缩放
  8. public float widthText;
  9. public float heightText;
  10. private Vector3 scaleText;
  11. //放大的比例
  12. private int scaleNum;
  13. void Start()
  14. {
  15. scaleNum =3;
  16. if (this.GetComponent<ContentSizeFitter>())
  17. {
  18. this.GetComponent<ContentSizeFitter>().enabled = false;
  19. }
  20. //获取更改前长,宽,缩放
  21. widthText = this.GetComponent<RectTransform>().rect.width;
  22. heightText = this.GetComponent<RectTransform>().rect.height;
  23. scaleText = this.transform.localScale;
  24. //更改修改后长,宽,缩放
  25. this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum, heightText * scaleNum);
  26. this.transform.localScale = scaleText / scaleNum;
  27. //更改修改后字号
  28. this.transform.GetComponent<Text>().fontSize*=scaleNum;
  29. if (this.GetComponent<ContentSizeFitter>())
  30. {
  31. this.GetComponent<ContentSizeFitter>().enabled = true;
  32. }
  33. }
  34. }

5.优化后脚本代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class textImprovement : MonoBehaviour
  6. {
  7. //分别获取到缩放前的宽,高,缩放
  8. public float widthText;
  9. public float heightText;
  10. private Vector3 scaleText;
  11. //放大的比例
  12. private int scaleNum;
  13. void Start()
  14. {
  15. if (this.GetComponent<Text>())
  16. {
  17. scaleNum = 3;
  18. if (this.GetComponent<ContentSizeFitter>())
  19. {
  20. this.GetComponent<ContentSizeFitter>().enabled = false;
  21. }
  22. //获取更改前长,宽,缩放
  23. widthText = this.GetComponent<RectTransform>().rect.width;
  24. heightText = this.GetComponent<RectTransform>().rect.height;
  25. scaleText = this.transform.localScale;
  26. //更改修改后长,宽,缩放
  27. this.GetComponent<RectTransform>().sizeDelta = new Vector2(widthText * scaleNum * 1.01f, heightText * scaleNum * 1.01f);
  28. this.transform.localScale = scaleText / scaleNum;
  29. Debug.Log(this.transform.localScale.x);
  30. //更改修改后字号
  31. this.transform.GetComponent<Text>().fontSize *= scaleNum;
  32. if (this.GetComponent<ContentSizeFitter>())
  33. {
  34. this.GetComponent<ContentSizeFitter>().enabled = true;
  35. }
  36. }
  37. }
  38. }

使用方法:直接赋予需要改善的Text组件此脚本,如果需要大量更改则在Hierarchy面板搜索全部Text,Ctrl+A全选并赋予脚本(点击放大镜并在放大镜下拉菜单选择Type)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/130176
推荐阅读
相关标签
  

闽ICP备14008679号