zoukankan      html  css  js  c++  java
  • unity实现文本打字机效果(支持富文本)

    一.效果图:

    二.代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using System;
    
    public class CommonStoryText : BaseMeshEffect
    {
        [SerializeField]
        private int textIndex;
    
        private UIVertex vertex = new UIVertex();
    
        //记录刷新时间
        private float m_TimeCount = 0;
    
        private float m_charTime = 0;
    
        //是否开始显示打字
        private int state = 0;
    
        //每个字的出现间隔
        private float m_TimeSpace = 0;
    
        //要显示的Text组件
        private Text m_Text;
    
        private int alphaIndex = 0;
    
        private float[] arrVertex;
    
        private int aniComplete = 0;
        private int m_charLen = 0;
        private int hasInit = 0;
    
        public override void ModifyMesh(VertexHelper vh)
        {
            if (!IsActive())
            {
                return;
            }
            if(state == 0)
            {
                return;
            }
            m_charLen = vh.currentVertCount/4;
            //文本长度
            if(state == 1)
            {
                for (var i = 0; i < vh.currentVertCount; i++)
                {
                    vh.PopulateUIVertex(ref vertex, i);
                    Color c = vertex.color;
                    c.a = 0;
                    vertex.color = c;
                    vh.SetUIVertex(vertex, i);
                }
                state = 2;
                return;
            }
            int vCount = 4;
            int vertexIndex = 0;
            int charLen = m_charLen;
            for(int i=0; i<charLen; i++)
            {
                float alpha = arrVertex[i];
                for (int j = 0; j < vCount; j++)
                {
                    if (vertexIndex < vh.currentVertCount)
                    {
                        vh.PopulateUIVertex(ref vertex, vertexIndex);
                        Color c = vertex.color;
                        c.a = alpha;
                        vertex.color = c;
                        vh.SetUIVertex(vertex, vertexIndex);
                    }
                    vertexIndex++;
                }
            }
            if(alphaIndex >= charLen && state > 0)
            {
                state = 0;
                aniComplete = 1;
            }
    
        }
        protected override void Awake()
        {
            m_Text = gameObject.GetComponent<Text>();
            textIndex = 0;
            m_Text.text = "";
        }
        protected override  void Start()
        {
        }
        void Update ()
        {
            if (state == 2)
            {
                if(hasInit == 0)
                {
                    hasInit = 1;
                    arrVertex = new float[m_charLen];
                    for(int i=0; i<m_charLen; i++)
                    {
                        arrVertex[i] = 0;
                    }
                }
                doText();
                doAlphaText();
            }
            if(aniComplete == 1)
            {
                aniComplete = 0;
                onTextAniComplete();
            }
        }
        private void doText()
        {
            int charLen = m_charLen;
            if(textIndex >= charLen)
            {
                return;
            }
            if (Time.time - m_charTime > 0.05)
            {
                m_charTime = Time.time;
                textIndex++;
            }
        }
        private void doAlphaText()
        {
            if (Time.time - m_TimeCount <= 0.01)
            {
                return;
            }
            m_TimeCount = Time.time;
            int charLen = m_charLen;
            bool needModify = false;
            for(int i=alphaIndex; i<textIndex && i<charLen; i++)
            {
                float alpha = arrVertex[i];
                alpha += 0.1f;
                needModify = true;
                if(alpha >= 1)
                {
                    alphaIndex++;
                    alpha = 1;
                }
                arrVertex[i] = alpha;
            }
            if(needModify)
            {
                graphic.SetVerticesDirty();
            }
        }
        public void playAni(string contents)
        {
            if(state > 0)
            {
                return;
            }
            m_Text.text = contents;
            hasInit = 0;
            alphaIndex = 0;
            state = 1;
            textIndex = 0;
            graphic.SetVerticesDirty();
        }
        public void stopAni()
        {
            state = 0;
        }
        public void showText()
        {
            if(hasInit == 0)
            {
                return;
            }
            alphaIndex = m_charLen;
            textIndex = m_charLen;
            for(int i=0; i<m_charLen; i++)
            {
                arrVertex[i] = 1.0f;
            }
            graphic.SetVerticesDirty();
        }
        private void onTextAniComplete()
        {
    
        }
        public void test()
        {
            playAni("这是一段剧情对话,<color=#FF0000>尽量长一点</color>方便测试.");
        }
    }

    三.新建一个unity工程 创建ui text节点 添加上面的脚本 代码里调用playAni接口.

  • 相关阅读:
    【高级内部资料】.NET数据批量写入性能分析 第二篇
    负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解
    负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念网络基础
    如何提高Linq查询的性能(上)
    【全面解析DeepZoom 之二】Silverlight2及Deep Zoom环境的搭建
    关于让WPF软件界面支持全球化和本地化
    在WPF中自定义控件(3) CustomControl (上)
    【全面解析DeepZoom 之一】酷!Deep Zoom
    谈谈我理解的WPF团队模型——在UI Designer与Developer之间
    [WPF疑难]在WPF中显示动态GIF
  • 原文地址:https://www.cnblogs.com/wsswlyy/p/14277728.html
Copyright © 2011-2022 走看看