using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using System.Collections.Generic; public struct Line { private int _startVertexIndex ; /// /// 起点索引 /// public int StartVertexIndex { get { return _startVertexIndex; } } private int _endVertexIndex; /// /// 终点索引 /// public int EndVertexIndex { get { return _endVertexIndex; } } private int _vertexCount; /// /// 该行占的点数目 /// public int VertexCount { get { return _vertexCount; } } public Line(int startVertexIndex, int length) { _startVertexIndex = startVertexIndex; _endVertexIndex = length * 6 - 1 + startVertexIndex; _vertexCount = length * 6; } } [AddComponentMenu("UI/Effects/UITextSpacing")] public class UITextSpacing : BaseMeshEffect { public float _textSpacing = 1f; private UIVertex vt; public override void ModifyMesh(VertexHelper vh) { if (!IsActive() || vh.currentVertCount == 0) { return; } Text text = GetComponent(); if (text == null) { Debug.LogError("Missing Text component"); return; } // List vertexs = new List(); // vh.GetUIVertexStream(vertexs); int indexCount = vh.currentIndexCount; string[] lineTexts = text.text.Split('\n'); Line[] lines = new Line[lineTexts.Length]; //根据lines数组中各个元素的长度计算每一行中第一个点的索引,每个字、字母、空母均占6个点 for (int i = 0; i < lines.Length; i++) { //除最后一行外,vertexs对于前面几行都有回车符占了6个点 if (i == 0) { lines[i] = new Line(0, lineTexts[i].Length + 1); } else if (i > 0 && i < lines.Length - 1) { lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length + 1); } else { lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length); } } for (int i = 4; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vt, i); vt.position += new Vector3(_textSpacing * (i / 4 + 1), 0, 0); vh.SetUIVertex(vt, i); } // for (int i = 0; i < lines.Length; i++) // { // for (int j = lines[i].StartVertexIndex + 6; j <= lines[i].EndVertexIndex; j++) // { // if (j < 0 || j >= vh.currentVertCount) // { // continue; // } // // int index = 0; // if (j % 6 <= 2) // { // index = (j / 6) * 4 + j % 6; // // } // if (j % 6 == 4) // { // index = (j / 6) * 4 + j % 6 - 1; // // } // vh.PopulateUIVertex(ref vt,index); // vt.position += new Vector3(_textSpacing * ((j - lines[i].StartVertexIndex) / 6), 0, 0); // // //以下注意点与索引的对应关系 // vh.SetUIVertex(vt, index); // } // } } }