【UGUI】 Text竖直显示文字

关于竖直显示文字,网上有很多种方式可以实现,但是我试了几种后发现,有部分好像只能是预先配好文字显示,在运行状态下用代码配置文字时Text上的文字无法及时更新,试过几种方式后选了这种可以在运行时可以配置文字的。

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


public class VirticalText : Text
{
    public enum LetterType
    {
        chinese,
        english,
    }

    protected override void OnPopulateMesh(VertexHelper toFill)
    {
        if (null == toFill)
            return;
        base.OnPopulateMesh(toFill);
        //获取所有的UIVertex,绘制一个字符对应6个UIVertex,绘制顺序为012 230 ,0在左上角
        List<UIVertex> listUIVertex = new List<UIVertex>();
        toFill.GetUIVertexStream(listUIVertex);

        var vertArray = listUIVertex.ToArray();
        for (int i = 0; i < vertArray.Length; i += 6)
        {
            float halfOfheight = Mathf.Abs(vertArray[i + 1].position.y - vertArray[i + 2].position.y) / 2.0f;
            float halfOfwidth = Mathf.Abs(vertArray[i + 1].position.x - vertArray[i].position.x) / 2.0f;
            Vector3 centerPos = (vertArray[i].position + vertArray[i + 2].position) / 2.0f;

            float angleZ = Mathf.Deg2Rad * (90);
            Matrix4x4 rMatrixZ = new Matrix4x4();
            rMatrixZ.SetRow(0, new Vector4(Mathf.Cos(angleZ), -Mathf.Sin(angleZ), 0, 0));
            rMatrixZ.SetRow(1, new Vector4(Mathf.Sin(angleZ), Mathf.Cos(angleZ), 0, 0));
            rMatrixZ.SetRow(2, new Vector4(0, 0, 1, 0));
            rMatrixZ.SetRow(3, new Vector4(0, 0, 0, 1));

            float angleY = Mathf.Deg2Rad * (-180);
            Matrix4x4 rMatrixY = new Matrix4x4();
            rMatrixY.SetRow(0, new Vector4(Mathf.Cos(angleY), 0, Mathf.Sin(angleY), 0));
            rMatrixY.SetRow(1, new Vector4(0, 1, 0, 0));
            rMatrixY.SetRow(2, new Vector4(-Mathf.Sin(angleY), 0, Mathf.Cos(angleY), 0));
            rMatrixY.SetRow(3, new Vector4(0, 0, 0, 1));

            float angleX = Mathf.Deg2Rad * (-180);
            Matrix4x4 rMatrixX = new Matrix4x4();
            rMatrixX.SetRow(0, new Vector4(1, 0, 0, 0));
            rMatrixX.SetRow(1, new Vector4(0, Mathf.Cos(angleX), -Mathf.Sin(angleX), 0));
            rMatrixX.SetRow(2, new Vector4(0, Mathf.Sin(angleX), Mathf.Cos(angleX), 0));
            rMatrixX.SetRow(3, new Vector4(0, 0, 0, 1));

            Matrix4x4 total = rMatrixZ * rMatrixY;//竖直排列从左往右读
                                                  //Matrix4x4 total = rMatrixZ;//竖直排列从右往左读

            centerPos = total.MultiplyVector(centerPos);

            vertArray[i].position = centerPos + new Vector3(-halfOfwidth, halfOfheight, 0.0f);
            vertArray[i + 1].position = centerPos + new Vector3(halfOfwidth, halfOfheight, 0.0f);
            vertArray[i + 2].position = centerPos + new Vector3(halfOfwidth, -halfOfheight, 0.0f);
            vertArray[i + 3].position = centerPos + new Vector3(halfOfwidth, -halfOfheight, 0.0f);
            vertArray[i + 4].position = centerPos + new Vector3(-halfOfwidth, -halfOfheight, 0.0f);
            vertArray[i + 5].position = centerPos + new Vector3(-halfOfwidth, halfOfheight, 0.0f);


            listUIVertex[i] = vertArray[i];
            listUIVertex[i + 1] = vertArray[i + 1];
            listUIVertex[i + 2] = vertArray[i + 2];
            listUIVertex[i + 3] = vertArray[i + 3];
            listUIVertex[i + 4] = vertArray[i + 4];
            listUIVertex[i + 5] = vertArray[i + 5];
        }

        toFill.Clear();
        toFill.AddUIVertexTriangleStream(listUIVertex);

    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值