上次写的富文本打字机,原理是文字一个一个出现。
这种原理实现的打字机效果是不支持居中打字机的。
为了解决这个问题,最好的实现方式是所有的文字从开始就已经排版好,只是不显示而已。
然后利用顶点的递增达到文字一个一个出现的目的。
下面是GIF示例图,也支持富文本(gif的logo去不掉,不是打广告,哈哈)
原理简单说明
- 脚本继承于BaseMeshEffect,重写 public override void ModifyMesh方法来自定义显示顶点数量。
- 在Unity2019中,顶点计算不再将富文本考虑进去,所以可以随着时间数量增加即可
- 但是在低于2019版本中(比如Unity2017),富文本的顶点也必须考虑进去。
- 所以利用正则表达式匹配富文本的符号所在index
"<[^>]*>[^<]*</[^>]*>"
- 剩下的即为文字区域,也可以进行正则匹配
">(.|\n)*<"
回车符号记得考虑进去 - 脚本再update时,处于富文本符号区域则直接while循环,下面为实例代码
if (richPosList.Contains(m_Num))
{
#if UNITY_2019
//2019版本顶点计算方法改了,不需要再额外计算富文本的顶点
#else
while (richPosList.Contains(m_Num))
{
m_Num++;
}
#endif
m_Num++;
}
else
{
m_Num++;
}
得到的m_Num用来重新计算顶点
public override void ModifyMesh(VertexHelper vh)
{
if (!IsActive())
return;
List<UIVertex> vertexList = new List<UIVertex>();
vh.GetUIVertexStream(vertexList);
vertexList = SetTextVertex(vertexList);
vh.Clear();
vh.AddUIVertexTriangleStream(vertexList);
}
List<UIVertex> tmpVertexList = new List<UIVertex>();
private List<UIVertex> SetTextVertex(List<UIVertex> vertexList)
{
tmpVertexList.Clear();
int count = m_Num * 6;
count = Mathf.Min(vertexList.Count, count);
for (int i = 0; i < count; i++)
{
tmpVertexList.Add(vertexList[i]);
}
return tmpVertexList;
}
最终会随着时间逐步添加文字,达到居中打字的效果
觉得我分享的对大家有用的话,记得点个赞哦,谢谢