原理
在Unity中一个字符(无论中英文)是由6个顶点组成,即,一个正三角形和一个倒三角形组成,其中有两个顶点重合,我们可以通过对每个字的顶点进行一定偏移从而达到字体与字体间距的控制。
Unity中有个BaseMeshEffect类,可以实现对其ModifyMesh方法的重写来控制,类似的有,Unity的OutLine和Shadow特效即是该类的派生类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 字体间距扩展
/// </summary>
[AddComponentMenu("UI/Effects/ExpendText")]
public class ExpendText : BaseMeshEffect
{
public float _textSpacing = 1f;
public override void ModifyMesh(VertexHelper vh)
{
if (!IsActive() || vh.currentVertCount == 0)
{
return;
}
List<UIVertex> vertexs = new List<UIVertex>();
vh.GetUIVertexStream(vertexs);
int indexCount = vh.currentIndexCount;
UIVertex vt;
for (int i = 6; i < indexCount; i++)
{
//第一个字不用改变位置
vt = vertexs[i];
vt.position += new Vector3(_textSpacing * (i / 6), 0, 0);
vertexs[i] = vt;
//以下注意点与索引的对应关系
if (i % 6 <= 2)
{
vh.SetUIVertex(vt, (i / 6) * 4 + i % 6);
}
if (i % 6 == 4)
{
vh.SetUIVertex(vt, (i / 6) * 4 + i % 6 - 1);
}
}
}
}
public class Row
{
public int StartIndex;
public int EndIndex;
public Row(int startIndex,int length)
{
StartIndex = startIndex;
EndIndex =startIndex+ -length * 6-1;
}
}