unity3dUGUI的Text实现字体间距的调整

简介: 将脚本TextSpacing 直接挂在到Text组件上,然后调整数值即可using UnityEngine;using System.Collections;using UnityEngine.

将脚本TextSpacing 直接挂在到Text组件上,然后调整数值即可

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

[AddComponentMenu( "UI/Effects/TextSpacing" )]
public class TextSpacing : 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 );
            }
        }
    }
}

第二版

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

public class Line
{

    private int _startVertexIndex = 0;
    /// <summary>
    /// 起点索引
    /// </summary>
    public int StartVertexIndex
    {
        get
        {
            return _startVertexIndex;
        }
    }

    private int _endVertexIndex = 0;
    /// <summary>
    /// 终点索引
    /// </summary>
    public int EndVertexIndex
    {
        get
        {
            return _endVertexIndex;
        }
    }

    private int _vertexCount = 0;
    /// <summary>
    /// 该行占的点数目
    /// </summary>
    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/TextSpacing")]
public class TextSpacing : BaseMeshEffect
{
    public float _textSpacing = 1f;

    public override void ModifyMesh(VertexHelper vh)
    {
        if (!IsActive() || vh.currentVertCount == 0)
        {
            return;
        }

        Text text = GetComponent<Text>();
        if (text == null)
        {
            Debug.LogError("Missing Text component");
            return;
        }

        List<UIVertex> vertexs = new List<UIVertex>();
        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);
            }
        }

        UIVertex vt;

        for (int i = 0; i < lines.Length; i++)
        {
            for (int j = lines[i].StartVertexIndex + 6; j <= lines[i].EndVertexIndex; j++)
            {
                if (j < 0 || j >= vertexs.Count)
                {
                    continue;
                }
                vt = vertexs[j];
                vt.position += new Vector3(_textSpacing * ((j - lines[i].StartVertexIndex) / 6), 0, 0);
                vertexs[j] = vt;
                //以下注意点与索引的对应关系
                if (j % 6 <= 2)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6);
                }
                if (j % 6 == 4)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6 - 1);
                }
            }
        }
    }
}
相关文章
|
9天前
|
图形学 开发者
Unity Text字体颜色渐变
此代码实现文本颜色的垂直渐变效果。通过定义起始和结束颜色,获取像素位置信息(UV坐标),根据渐变方向计算颜色插值,并应用到每个像素上。具体步骤包括:1) 定义颜色范围;2) 获取UV坐标;3) 计算线性插值;4) 应用颜色。脚本挂载在Text组件上,可调节顶部和底部颜色实现渐变效果。
|
C# 图形学
unity使用BMFont制作位图字体
unity也能制作艺术字拉
unity使用BMFont制作位图字体
|
9天前
|
图形学
Unity Text修改字间距
本文介绍了两种实现字间距调整的方法。第一种方法直接通过修改顶点位置实现字间距调整,代码简洁但换行时效果不佳。第二种方法引入了`Line`结构和对齐方式(左、中、右),能够处理多行文本并支持不同对齐方式,更加灵活和通用。两种方法均基于Unity的`BaseMeshEffect`类,通过重写`ModifyMesh`方法来调整UI文本的字间距。最终运行测试可验证效果。
|
图形学
Unity 【Content Size Fitter】- 聊天气泡自动适配Text文本框大小
Unity 【Content Size Fitter】- 聊天气泡自动适配Text文本框大小
599 1
|
图形学 Android开发
Unity从学习到赚钱系列-聊天气泡及字体模糊
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
365 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity控制台 输出打印不同颜色的字体
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity控制台 输出打印不同颜色的字体
|
图形学
unity3d曲线text文本
测试.png using System; using System.Collections.Generic; namespace UnityEngine.UI.Extensions { /// /// Curved text.让文本按照曲线进行显示 【注意对Image的变形 也是可以的】 /// 说明: 对Text的操作就和 shadow 和 outline 组件类似。
1522 0
|
图形学
Unity 便捷小工具之批量更改UGUI Font(字体)
在项目开发过程中可能会遇到更改字体的需求,如果手动逐一更改实在是太麻烦,所以我们需要自动化,一键能解决的问题绝不点击两次 效果过下 源码如下 using UnityEngine; using System.
2314 0
|
C# 图形学
Unity3d批量更换UGUI-NGUI字体工具
在咱们做项目的时候经常会遇到要换字体的情况,比如美工觉着字体不好看或者要做其它语言版本……遇到这种情况………如果UI很多,显示的字体特别多,那就呵呵了………累不累先放一边,万一漏了可是一件麻烦的事情………… 需要的朋友可以阅读脚本,当然,直接复制到你的工程新建C#脚本,放到Endit文件夹直接也可以使用的。
1897 0