今天遇到一个需要给UIText添加删除线的功能,以前博主一般是制作一个同样宽度的Image,盖在Text上,但是这次需要动态换行,所以就重写了Text的功能,具体代码如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class DeleteLineText : Text
{public float distance = 4f;public float lineHeight = 4f;public Color underLineColor;private bool useUnderLineColor = true;private List<UIVertex> textVertArr = new List<UIVertex>();private int startIndex = 0;private int endIndex = 0;protected override void Start(){base.Start();underLineColor = Color.red;lineHeight = 5.0f;distance = -15.0f;}protected override void OnPopulateMesh(VertexHelper toFill){base.OnPopulateMesh(toFill); //渲染text字体的顶点toFill.GetUIVertexStream(textVertArr); //toFill创建vertex流  vertex数组的长度是文字长度的6倍 因为一个文字有六个顶点if (textVertArr.Count <= 0) return;SetUnderLine(toFill);}private void SetUnderLine(VertexHelper vh){if(m_Text.Length <= 0){return;}endIndex = m_Text.Length - 1;List<int> lineStartList = new List<int>();List<int> lineEndList = new List<int>();SavePosByCharacter(ref lineStartList, ref lineEndList);if (lineStartList.Count == 1){// 单个字Vector2 startPos = new Vector2(textVertArr[lineStartList[0]].position.x, textVertArr[lineStartList[0]].position.y);Vector2 endPos = new Vector2(textVertArr[lineEndList[0]].position.x, textVertArr[lineEndList[0]].position.y);DrawLine(vh, startPos, endPos);}else{// 多个字for (int i = 0; i < lineStartList.Count; i++){Vector2 startPos = new Vector2(textVertArr[lineStartList[i]].position.x, textVertArr[lineStartList[i]].position.y);Vector2 endPos = new Vector2(textVertArr[lineEndList[i]].position.x, textVertArr[lineEndList[i]].position.y);DrawLine(vh, startPos, endPos);}}}private void SavePosByCharacter(ref List<int> lineStartList, ref List<int> lineEndList){// 对于每一个字处理 for (int i = startIndex; i <= endIndex; i++){// 得到最底下的两个点int minPos = i * 6;int maxPos = i * 6;for (int j = i * 6; j < (i + 1) * 6; j++){if (textVertArr[j].position.x < textVertArr[minPos].position.x){minPos = j;}else if (Mathf.Approximately(textVertArr[minPos].position.x, textVertArr[j].position.x)&& textVertArr[j].position.y < textVertArr[minPos].position.y){minPos = j;}if (textVertArr[j].position.x > textVertArr[maxPos].position.x){maxPos = j;}else if (Mathf.Approximately(textVertArr[maxPos].position.x, textVertArr[j].position.x) && textVertArr[j].position.y < textVertArr[maxPos].position.y){maxPos = j;}}lineStartList.Add(minPos);lineEndList.Add(maxPos); }}private void DrawLine(VertexHelper vh, Vector2 startPos, Vector2 endPos){Vector2 extents = rectTransform.rect.size;var setting = GetGenerationSettings(extents);TextGenerator underlineText = new TextGenerator();underlineText.Populate("-", setting);if (distance > fontSize && lineHeight > font.fontSize){Debug.LogError("UnderLine property is Error! please make Certain property can't greater than fontSize.");return;}IList<UIVertex> lineVer = underlineText.verts;/*new UIVertex[4];*///"_"的的顶点数组Vector3[] pos = new Vector3[4];pos[0] = startPos + new Vector2(-8, -distance);pos[3] = startPos + new Vector2(-8, -(distance + lineHeight));pos[2] = endPos + new Vector2(8, -(distance + lineHeight));pos[1] = endPos + new Vector2(8, -distance);Color tempColor = useUnderLineColor ? underLineColor : color;UIVertex[] tempVerts = new UIVertex[4];for (int i = 0; i < 4; i++){tempVerts[i] = lineVer[i];tempVerts[i].color = tempColor;tempVerts[i].position = pos[i];tempVerts[i].uv0 = lineVer[i].uv0;tempVerts[i].uv1 = lineVer[i].uv1;tempVerts[i].uv2 = lineVer[i].uv2;tempVerts[i].uv3 = lineVer[i].uv3;}vh.AddUIVertexQuad(tempVerts);}
}

大体思路是这样的,首先我们通过toFill.GetUIVertexStream(textVertArr)获取到了所有文字的顶点,这个数组的数量应该是文字数量的6倍,因为每个文字都由两个三角形也就是六个顶点构成。

然后通过比较,找到每个文字底部最小的位置和最大的位置,并把它们存储到一个数组中。接下来,我们重写Text的OnPopulateMesh函数,在这个函数中,为Text增加顶点。增加的逻辑是对于每一个文字,都在它底部的最小位置和最大位置之间增加四个点,组成一个长方形,也就是我们需要的下划线。

有的博主会把同一行的下划线变成四个点,博主试过这个做法,性能比较好,但是效果有一些问题,在下划线的两端,会有一个明显的渐变效果,所以我选择了对每个文字制作一个下划线,但是这样导致在改变文字的时候FPS的下降,算是各有利弊吧。

最后我们把下划线的位置上移,也就得到了我们的删除线。感觉这个算法还是有些问题,未来有更好的方法会继续更新的。

UGUI中为Text增加下划线相关推荐

  1. 游戏中文本中间的下划线

    游戏中文本中间的下划线 直接上代码 // An highlighted blockpublic Text txt ;public Image img;public GameObject go;priv ...

  2. html表格中加横线,表格下划线怎么打出来

    excel怎么打出下划线_______和大横线-----(不是小怎么自由的打出来,CSS布局HTML小编今天和大家分享方法 excel下划线可通过字体设置下划线,大横线可通过Shift加减号-实现. ...

  3. python添加横线代码_Python中的五种下划线

    1 1.单前导下划线 _var2 3 单个下划线是一个Python命名约定,表示这个名称是供内部使用的. 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示4 5 程序员使用名称前的单下 ...

  4. htm中a标签去掉下划线是那个属性

    htm中a标签去掉下划线是那个属性 a{ text-decoration:none; } 或者把这个属性分别加到a标签下, a:link{ text-decoration:none; } a:visi ...

  5. html语言添加下划线,HTML页面中怎么文本添加下划线?

    怎么在HTML页面中给文本添加下划线?下面本篇文章就来给大家介绍一下HTML.CSS给文本添加下划线的方法,希望对大家有所帮助. HTML添加下划线 在HTML中可以使用标签定义下划线文本,即为文本添 ...

  6. Unity UGUI图文混排(七) -- 下划线

    之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...

  7. word和excel中加粗和下划线的键盘快捷是什么?

    加粗是ctrl+B 加下划线是ctrl+U WORD全套快捷键小技巧 CTRL+O 打开 CTRL+P 打印 CTRL+A 全选 CTRL+[/] 对文字进行大小设置(在选中目标情况下) CTRL+D ...

  8. 导航菜单中常用的css下划线动画效果-案例

    导航栏下划线动画在网页设计中是非常常见的交互 在线展示 代码 <!DOCTYPE html> <html><head><meta charset=" ...

  9. python双下划线什么意思_python中几个双下划线用法的含义

    _ _ init() _ _(self[,...]) 我们有时在类定义写__init()__方法,但是有时又没有.__init()__方法相当于其他面向对象的编程语言中的构造方法,也就是类在实例化成对 ...

最新文章

  1. 《JAVA练习题目7》 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数。(类PrimeGenerator都由类Main代替)
  2. mac上安装zookeeper教程
  3. Lync Server 2013无法共享PPT故障排错处理
  4. python审计分析_【干货】Python自动化审计及实现
  5. 博客杂志CMS模板,wpdx3.6破解版源码WordPress主题
  6. 无法从elasticsearch节点检索版本信息_【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?...
  7. Professional ASP.NET 2.0之跨页提交-Cross Page Posting
  8. python 标量_标量 | NumPy 中文
  9. vmware下安装mac os虚拟机问题,最后还是最终攻克了被一个小失误给陷害了
  10. 南邮计算机考研复试经验,南邮学长复试经验谈(blue原创出品,必是精品)
  11. 2010-2012迷你博客
  12. 记者求证北京将禁止外地车和外地人员从事网约车传闻
  13. Java真的是低糖语言吗?
  14. 使用 Amazon Deep Learning AMI 快速实现 CUDA,cuDNN 和深度学习框架版本兼容
  15. ajax鼠标悬停,mouseout后触发jQuery Ajax鼠标悬停事件
  16. 无聊写着玩:解二阶线性微分方程
  17. canvas机器鸭子走路动画
  18. Oracle——单列函数,多表连接
  19. html中repeat的作用,repeat-y
  20. 《绝地求生》玩家排名预--2.问题分析

热门文章

  1. 2007中国创投融资发展高层论坛成功召开
  2. 计算机科学导论整理知识点,计算机科学导论复习资料
  3. Batch Nomalization,Group Normalization,Cross-Iteration Batch Normalization分析
  4. 变量的定义及注意事项
  5. Leaflet 改变坐标原点
  6. OSChina 周一乱弹 —— 周日上班不是997么
  7. 氧化铝松装密度测定仪标准
  8. Ubuntu文字、图形界面切换
  9. 关于Google的Suggest功能的实现
  10. 一个成功男人30岁前应该完成的那些事情