UGUI之修改Text之间的间距

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;


internal class Line
{
    //每行开始顶点索引
    private int startVertexIndex;
    public int StartVertexIndex
    {
        get
        {
            return startVertexIndex;
        }
    }

    //每行结束顶点索引
    private int endVertexIndex;
    public int EndVertexIndex
    {
        get
        {
            return endVertexIndex;
        }
    }

    //每行顶点总量
    private int countVertexIndex;
    public int CountVertexIndex
    {
        get
        {
            return countVertexIndex;
        }
    }

    public Line(int startVertexIndex, int countVertexIndex)
    {
        this.startVertexIndex = startVertexIndex;
        this.countVertexIndex = countVertexIndex;
        this.endVertexIndex = this.startVertexIndex + countVertexIndex - 1;

    }
}

/// <summary>
/// 这是设置字体移动的核心类
/// 执行多重行移动的核心算法是:将多重行分开依次进行处理,每一行的处理都是前面对单行处理的子操作
/// 但是由vh是记录一个文本中所有的字的顶点,所以说需要分清楚每行开始,每行结束,以及行的字个数,
/// 如此需要创建一个行的数据结构,以保存这些信息
/// </summary>
[AddComponentMenu("UI/Effects/TextSpacing")]
public class TextSpacing : BaseMeshEffect
{
    public float spacing = 0;
    public override void ModifyMesh(VertexHelper vh)
    {
        Text text = GetComponent<Text>();
        string[] ls = text.text.Split('\n');
        int length = ls.Length;
        bool isNewLine = false;
        Line[] line;
        if (string.IsNullOrEmpty(ls[ls.Length - 1]) == true)
        {
            line = new Line[length - 1];
            isNewLine = true;
        }
        else
        {
            line = new Line[length];

        }
        //Debug.Log("ls长度" + ls.Length);
        for (int i = 0; i < line.Length; i++)
        {
            if (i == 0 && line.Length == 1 && isNewLine == false)//解决单行时没有换行符的情况
            {
                line[i] = new Line(0, ls[i].Length * 6);
                break;
            }
            if (i == 0 && line.Length >= 1)//解决单行时有换行符的情况,以及多行时i为0的情况
            {
                line[i] = new Line(0, (ls[i].Length + 1) * 6);
            }
            else
            {
                if (i < line.Length - 1)
                {
                    line[i] = new Line(line[i - 1].EndVertexIndex + 1, (ls[i].Length + 1) * 6);
                }
                else
                {
                    if (isNewLine == true)//解决多行时,最后一行末尾有换行符的情况
                    {
                        line[i] = new Line(line[i - 1].EndVertexIndex + 1, (ls[i].Length + 1) * 6);
                    }
                    else
                    {
                        line[i] = new Line(line[i - 1].EndVertexIndex + 1, ls[i].Length * 6);
                    }
                }
            }
        }


        List<UIVertex> vertexs = new List<UIVertex>();
        vh.GetUIVertexStream(vertexs);
        int countVertexIndex = vertexs.Count;
        //Debug.Log("顶点总量" + vertexs.Count);
        for (int i = 0; i < line.Length; i++)
        {
            if (line[i].CountVertexIndex == 6) { continue; }
            for (int k = line[i].StartVertexIndex + 6; k <= line[i].EndVertexIndex; k++)
            {
                UIVertex vertex = vertexs[k];
                vertex.position += new Vector3(spacing * ((k - line[i].StartVertexIndex) / 6), 0, 0);
                //Debug.Log("执行");
                vertexs[k] = vertex;
                if (k % 6 <= 2)
                {
                    vh.SetUIVertex(vertex, (k / 6) * 4 + k % 6);
                }
                if (k % 6 == 4)
                {
                    vh.SetUIVertex(vertex, (k / 6) * 4 + k % 6 - 1);
                }
            }

        }


    }
}

 

posted @ 2019-03-25 14:23  围墙外的世界  阅读(726)  评论(0编辑  收藏  举报