UGUI中为Text增加下划线
今天遇到一个需要给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增加下划线相关推荐
- 游戏中文本中间的下划线
游戏中文本中间的下划线 直接上代码 // An highlighted blockpublic Text txt ;public Image img;public GameObject go;priv ...
- html表格中加横线,表格下划线怎么打出来
excel怎么打出下划线_______和大横线-----(不是小怎么自由的打出来,CSS布局HTML小编今天和大家分享方法 excel下划线可通过字体设置下划线,大横线可通过Shift加减号-实现. ...
- python添加横线代码_Python中的五种下划线
1 1.单前导下划线 _var2 3 单个下划线是一个Python命名约定,表示这个名称是供内部使用的. 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示4 5 程序员使用名称前的单下 ...
- htm中a标签去掉下划线是那个属性
htm中a标签去掉下划线是那个属性 a{ text-decoration:none; } 或者把这个属性分别加到a标签下, a:link{ text-decoration:none; } a:visi ...
- html语言添加下划线,HTML页面中怎么文本添加下划线?
怎么在HTML页面中给文本添加下划线?下面本篇文章就来给大家介绍一下HTML.CSS给文本添加下划线的方法,希望对大家有所帮助. HTML添加下划线 在HTML中可以使用标签定义下划线文本,即为文本添 ...
- Unity UGUI图文混排(七) -- 下划线
之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...
- word和excel中加粗和下划线的键盘快捷是什么?
加粗是ctrl+B 加下划线是ctrl+U WORD全套快捷键小技巧 CTRL+O 打开 CTRL+P 打印 CTRL+A 全选 CTRL+[/] 对文字进行大小设置(在选中目标情况下) CTRL+D ...
- 导航菜单中常用的css下划线动画效果-案例
导航栏下划线动画在网页设计中是非常常见的交互 在线展示 代码 <!DOCTYPE html> <html><head><meta charset=" ...
- python双下划线什么意思_python中几个双下划线用法的含义
_ _ init() _ _(self[,...]) 我们有时在类定义写__init()__方法,但是有时又没有.__init()__方法相当于其他面向对象的编程语言中的构造方法,也就是类在实例化成对 ...
最新文章
- 《JAVA练习题目7》 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数。(类PrimeGenerator都由类Main代替)
- mac上安装zookeeper教程
- Lync Server 2013无法共享PPT故障排错处理
- python审计分析_【干货】Python自动化审计及实现
- 博客杂志CMS模板,wpdx3.6破解版源码WordPress主题
- 无法从elasticsearch节点检索版本信息_【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?...
- Professional ASP.NET 2.0之跨页提交-Cross Page Posting
- python 标量_标量 | NumPy 中文
- vmware下安装mac os虚拟机问题,最后还是最终攻克了被一个小失误给陷害了
- 南邮计算机考研复试经验,南邮学长复试经验谈(blue原创出品,必是精品)
- 2010-2012迷你博客
- 记者求证北京将禁止外地车和外地人员从事网约车传闻
- Java真的是低糖语言吗?
- 使用 Amazon Deep Learning AMI 快速实现 CUDA,cuDNN 和深度学习框架版本兼容
- ajax鼠标悬停,mouseout后触发jQuery Ajax鼠标悬停事件
- 无聊写着玩:解二阶线性微分方程
- canvas机器鸭子走路动画
- Oracle——单列函数,多表连接
- html中repeat的作用,repeat-y
- 《绝地求生》玩家排名预--2.问题分析