Unity UGUI打字机文本渐变——工具脚本
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InitUIFrm : MonoBehaviour
{
Text m_TextValue;//组件 Text
string m_TextValueColor;//Text组件的color颜色文本值
// 介绍的内容
string[] m_IntroContent = {
"战争学院是英雄联盟裁决瓦罗然政治纠纷之地。这里是绝对中立的领土,严禁任何纷争,违反者将面对学院的士兵和魔法。学院坐落于一座巨型能量节点,由黑曜石、贵金属和魔法塑形而成。它位于莫格罗恩关隘的北方入口,刚好位于相互敌对的城邦爱欧尼亚和诺克萨斯之间。作为一个旅行者,一定不要错过战争学院自北向南的超级堡垒,还有著名的巨石峰" ,
"除了作为英雄联盟所在,战争学院大概是瓦罗然最重要的权威军事培训机构。很多图书馆都致力于收录战争学院的英雄信息,并向所有研究者开放。比如《利刃守则》就是介绍战斗中刀剑技巧的权威指南,这部书来自联盟最卓越的英雄们 —— 希维尔、易大师和泰达米尔,这只是其中一小部分名字。",
"在战争学院魔法知识也有它的一席之地,不过这些知识都是军事机密,不会向游客免费开放。联盟紧紧控制着魔法知识的流传途。这些知识是联盟的力量之源,少量小心谨慎的施法者会试图绕过联盟的许可管理来寻求自己的魔法之路,不过这几乎不可能,只有通过成为联盟的见习学徒法师才有机会。见习学徒们有机会获得魔法能力成为召唤者,但最终他们都会都会成为联盟的一部分,并受到联盟决议的管理和限制,迎接背叛者的只有死亡… 年长的召唤者会迅速提醒年轻新晋者们这个事实。"
};
int m_AlphaSpan = 30;//每个渐变颜色之间的间隔
Dictionary<int, int> m_AlphaLine;//AlpheLine 当前字对应的alpha度,当为100的时候完全显示字体
string m_NowText;//当前显示的文字内容
int m_TextIndex = 0;//当前迭代索引 txtIndex==intro[?].Length的时候则为print完成
int m_BeginIndex = 0;//当前迭代开始索引,已经透明度为100的可以保存起来,避免遍历提高效率
int m_NowPrintIndex = 0;//当前Print索引
float m_TimeSpan = 0.1f;//每个字的间隔时间
float m_Timer = 0;//计时器
bool m_IsPrint = false;//是否打印
bool m_IsEnd = false;//是否打印结束
private void Awake()
{
m_AlphaLine = new Dictionary<int, int>();
m_TextValue = transform.GetComponent<Text>();
Initialize();
}
/// <summary>
/// 开启打字机
/// </summary>
public void Initialize()
{
//获得颜色值
m_TextValueColor = ColorUtility.ToHtmlStringRGB(m_TextValue.color);
//开启打印
m_IsPrint = true;
}
/// <summary>
/// 打印方法
/// </summary>
public void Print()
{
if (m_IsPrint)
{
if (m_NowPrintIndex == m_IntroContent.Length)
{
m_IsPrint = false;
return;
}
//打印内容
if (m_TextIndex < m_IntroContent[m_NowPrintIndex].Length)
{
//等一段时间在继续打印下一个字
while (m_Timer < m_TimeSpan)
{
m_Timer += Time.deltaTime;
return;
}
m_Timer = 0;
//增加一个字
m_TextIndex++;
}
else
{
//打印完一段
m_TextValue.color = new Color(m_TextValue.color.r, m_TextValue.color.g, m_TextValue.color.b, 0);
//清空text的值,等下一轮打印
m_NowPrintIndex++;
//数据初始化
m_TextValue.text = "";
m_BeginIndex = 0;
m_TextIndex = 0;
m_AlphaLine.Clear();
m_TextValue.color = new Color(m_TextValue.color.r, m_TextValue.color.g, m_TextValue.color.b, 1);
Debug.Log("这段已经打完了");
return;
}
for (int i = m_BeginIndex; i < m_TextIndex; i++)
{
if (!m_AlphaLine.ContainsKey(i))
{
m_AlphaLine.Add(i, 0);
}
int alpha = m_AlphaLine[i];
//如果alpha已经大于100了,可以完全显示了,>100的没有标签,
if (alpha >= 100)
{
m_BeginIndex = i + 1;
m_NowText += m_IntroContent[m_NowPrintIndex].Substring(0, m_BeginIndex);
}
else //小于100的每个字都有标签,大于txtIndex的甚至都还轮不到它们显示
{
//增加颜色标签,归一化为两位数
m_NowText += $"<color=#{m_TextValueColor}";
if (m_AlphaLine[i] < 10)
{
m_NowText += $"0{m_AlphaLine[i]}>";
}
else
{
m_NowText += $"{m_AlphaLine[i]}>";
}
m_NowText += $"{m_IntroContent[m_NowPrintIndex].Substring(i, 1)}</color>"; //把i这个字加入
//插值增加
m_AlphaLine[i] += m_AlphaSpan;
}
}
获得_NowText,文本赋值
m_TextValue.text = m_NowText;
m_NowText = "";
}
else if (m_IsEnd)
{
Debug.Log("打印完所有的内容");
}
}
public void Update()
{
Print();
}
}