关于UGUI之修改Text字间距

来源:互联网 发布:韩国妹子活好吗 知乎 编辑:程序博客网 时间:2024/06/01 09:13
using UnityEngine;using System.Collections;using UnityEngine.UI;using System;using System.Collections.Generic;using System.IO;using System.Text;[AddComponentMenu("UI/Effects/TextSpacing")]public class TextSpacing : BaseMeshEffect{    //Font    public string Font = "";    //数字间隔    public float _textSpacing = 1f;    //字符默认 size    //[SerializeField]    public float DefaultSize = 32f;    //字符当前 size    public float CurrentSize = 32f;    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;        Debug.Log("Bug测试" + indexCount+" --- "+ gameObject.GetComponent<Text>().text);        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);            }        }        if (DefaultSize == 0)        {            gameObject.transform.localScale = Vector3.one;        }        else        {            gameObject.transform.localScale = new Vector3(CurrentSize / DefaultSize, CurrentSize / DefaultSize, CurrentSize / DefaultSize);        }        Font = gameObject.GetComponent<Text>().font.name;    }}

以上内容借鉴UGUI之修改Text字间距,一个字符会生成6个顶点,6个顶点构成2个三角面

using System.Collections.Generic;using System.Linq;using UnityEngine;using UnityEngine.UI;public class UIVertexOptimize : BaseMeshEffect{    struct Triangle    {        public UIVertex v1;        public UIVertex v2;        public UIVertex v3;    }    List<UIVertex> verts = new List<UIVertex>();    public override void ModifyMesh(VertexHelper vh)    {        vh.GetUIVertexStream(verts);        Debug.Log(verts.Count);        OptimizeVert(ref verts);        Debug.Log(verts.Count);        vh.Clear();        vh.AddUIVertexTriangleStream(verts);    }    void OptimizeVert(ref List<UIVertex> vertices)    {        List<Triangle> tris = new List<Triangle>();        for (int i = 0; i < vertices.Count - 3; i += 3)        {            tris.Add(new Triangle() { v1 = vertices[i], v2 = vertices[i + 1], v3 = vertices[i + 2] });        }        vertices = tris.Distinct().SelectMany(tri =>            new[]{                tri.v1,                tri.v2,                tri.v3            }).ToList();    }}
以上内容借鉴UGUI Text富文本的顶点数优化

注意若Text挂在 修改间距脚本的同时添加OutLine组件,脚本在上OutLine组件在下,不然会发生越界,(好像是OutLine组件会将文本定点数乘以5


原创粉丝点击