Unity Text实现字符间距调整功能

102 阅读1分钟

前言

       上一篇《Unity Text 描边和阴影的实现》探讨了Text的描边和阴影扩展,但实际使用下来发现字符左右都粘在一起了,没有了间距空间。这个问题的原因也是显而易见的,由于我们向外扩展了UV,增加了描边的空间却没有移动字符的真正位置,所以一但描边后就粘在一起了。解决的办法就是先移动字符的位置,再执行描边或阴影的逻辑,这样就完美的解决了间距问题。

一、偏移顶点代码

        在原来修改顶点的方法中,增加向右偏移的代码,如图:

public int XSpacing = 0;
 
/// <summary>
 /// 修改顶点
 /// </summary>
 /// <param name="vh"></param>
 public override void ModifyMesh(VertexHelper vh)
 {
     List<UIVertex> allVertexs = null;
     if(XSpacing > 0)
     {//处理字符间距
         var vertexs = new List<UIVertex>();
         vh.GetUIVertexStream(vertexs);
         for(var i = 0; i < vertexs.Count; i++)
         {
             var v = vertexs[i];
             v.position += new Vector3(XSpacing * (i / 6), 0, 0);
             vertexs[i] = v;
             if(i % 6 <= 2)
             {
                 vh.SetUIVertex(v, (i / 6) * 4 + i % 6);
             }
             if( i % 6 == 4)
             {
                 vh.SetUIVertex(v, (i / 6) * 4 + i % 6 - 1);
             }
         }
     }

     if (Shadow)
     {//处理阴影
         allVertexs = new List<UIVertex>();
         var vertexs = ProcessShadowVertices(vh);      
         allVertexs.AddRange(vertexs);
     }            
     if (OutlineWidth > 0)
     {//处理描边
         if(allVertexs == null)
             allVertexs = new List<UIVertex>();

         var vertexs = ProcessOutlineVertices(vh);             
         allVertexs.AddRange(vertexs);
     }
     if(allVertexs != null && allVertexs.Count > 0)
     {
         vh.Clear();
         vh.AddUIVertexTriangleStream(allVertexs);
     }
 }

二、效果测试

       未设置间距前,如图:

设置间距后,如图:

面板属性如图:

      感谢阅读!