• Unity开发笔记-UGUI Text通过修改顶点颜色实现打字机效果


    实现效果:

    0x0 两种方法

    打字机效果一般是通过substring截断文字的方法实现的,这种方法简便,但字符串substring操作会产生大量临时字符串造成gc压力。
    在此基础上的改进方法是想办法改成0gc。
    另一种方法是改变顶点颜色属性,这种方法可以实现单个文字的精确控制,比如让某几个文字alpha渐变效果,相比上面的方法更灵活,另外也可以实现单个文字的跳动效果。
    下面是实现的过程

    Ox1 实现BaseMeshEffect的子类

    这个功能的核心原理是继承BaseMeshEffect,实现ModifyMesh(VertexHelper vh)的方法,通过这个方法修改单个文字的顶点数据来实现。

      `public class UI_Text_Single_Char_Color : BaseMeshEffect
      {
    public override void ModifyMesh(VertexHelper vh)
    {
        //这里实现我们的功能
    }
      }`
    

    Ox2 第一步,改变第一个字符的颜色

    我们来实现最简单的一步,这是我们实现所有功能的起点

      `public class UI_Text_Single_Char_Color : BaseMeshEffect
      {
    [SerializeField]
    private Color _myColor;
    private UIVertex vertex = new UIVertex();
    public override void ModifyMesh(VertexHelper vh)
    {
        int vertexIndex = 0;
        //一个字符有4个顶点构成
        int vCount = 4;
        for (int j = 0; j < vCount; j++)
            if (vertexIndex < vh.currentVertCount)
            {
                vh.PopulateUIVertex(ref vertex, vertexIndex);
                vertex.color = _myColor;
                vh.SetUIVertex(vertex, vertexIndex);
            }
            vertexIndex++;
        }
    }
      }`
    

    我们通过VertexHelper的PopulateUIVertex方法,指定顶点索引得到UIVertex,通过设置UIVertex的color改变颜色,再通过VertexHelper的SetUIVertex设置回去,从而改变了顶点的颜色属性。一个字符由2个三角形组成一个面片,因此有4个顶点(UIVertex),6个索引。

    效果如下:

    将vCount设置为2,只改变2个顶点颜色,就能得到一个渐变的效果

    0x3 改变多个

    有了上面的思路,我们可以推广到多个字符,我们得到text内字符数量,设置一个index,大于index的alpha设置为0即可

      `public class UI_Text_Multi_Char_Color : BaseMeshEffect
      {
    [SerializeField]
    private Color _myColor;
    [SerializeField]
    private int _index;
    private UIVertex vertex = new UIVertex();
    public override void ModifyMesh(VertexHelper vh)
    {
        //文本长度
        int charLen = this.GetComponent<Text>().text.Length;
        int vertexIndex = 0;
        for (int i = 0; i < charLen; i++)
        {
            //一个字符有4个顶点构成
            int vCount = 4;
            for (int j = 0; j < vCount; j++)
            {
                if (vertexIndex < vh.currentVertCount)
                {
                    vh.PopulateUIVertex(ref vertex, vertexIndex);
                    Color c = _myColor;
                    c.a = i <= _index ? 1 : 0;
                    vertex.color = c;
                    vh.SetUIVertex(vertex, vertexIndex);
                }
                vertexIndex++;
            }
        }
          }
      }`
    

    通过改变index,我们成功实现了打字机效果。

    0x4 支持RichText

    长度问题

    上面代码中,获取文字长度在RichText下是不正确的,试试<color=green>green,长度值返回的是26而不是5
    我们可以利用GetUIVertexStream得到所有文字的顶点数据,将这个长度除以6,就是真正渲染的文字数量

    int totalChars = stream.Count / 6;

    字体颜色问题

    富文本通过标签决定文字颜色的,因此需要先确定每个字会是什么颜色。

    未完待续...

    参考资料:
    https://www.jianshu.com/p/6090a65ee789
    https://medium.com/@chsxf/unity-webgl-making-an-efficient-typewriter-effect-946560fd2b6a
    http://blog.sqstudio.com/?p=1270

  • 相关阅读:
    thinkphp 事物回滚
    文字超出部分以省略号隐藏
    js倒计时
    js 日期转为时间戳
    jquery 获取url地址参数
    spreadjs 自定义菜单事件
    spreadjs 点击事件
    spreadjs 自定义上传文件单元格
    spreadjs 小记
    Json数组排序
  • 原文地址:https://www.cnblogs.com/terrynoya/p/13543333.html
Copyright © 2020-2023  润新知