经常看的许多综艺节目中经常有这样的镜头,当节目需要用文字介绍某一个物品或时间时,往往不是使用简单的文字的罗列,这样会让人看的很乱,容易看着看着就忘记自己读到那了,因此很多节目选自了使用一个类似于打字的方式使得文字逐字显示而非一下子全部显示,提升了用户的观感和软件质量
首先我们声明一些变量,比如计时器、TestMesh对象、需要显示的文字、当前的文字位置等
public float charsPerSecond = 0.2f;//打字时间间隔 private string words;//保存需要显示的文字 private bool isActive = false; private float timer;//计时器 private TextMesh myText; private int currentPos = 0;//当前打字位置然后我们在Start方法中为相关的变量初始化
timer = 0; isActive = true; charsPerSecond = Mathf.Max(0.2f, charsPerSecond); myText = GetComponent<TextMesh>(); words = myText.text; myText.text = "";//获取Text的文本信息,保存到words中,然后动态更新文本显示内容,实现打字机的效果接着我们写一个方法,当该物体被激活时开始计时,根据设定的文字显示速度计算,每当一个文字到了 其该显示的时间时,就将其和前面所有的文字截取下来,进行显示,直至所有文字显示完毕
void OnStartWriter() { if (isActive) { timer += Time.deltaTime; if (timer >= charsPerSecond) {//判断计时器时间是否到达 timer = 0; currentPos++; myText.text = words.Substring(0, currentPos);//刷新文本显示内容 if (currentPos >= words.Length) { OnFinish(); } } } }显示结束方法
void OnFinish() { isActive = false; timer = 0; currentPos = 0; myText.text = words; }脚本整体为:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TypewriterEffect : MonoBehaviour { public float charsPerSecond = 0.2f;//打字时间间隔 private string words;//保存需要显示的文字 private bool isActive = false; private float timer;//计时器 private TextMesh myText; private int currentPos = 0;//当前打字位置 // Start is called before the first frame update void Start() { timer = 0; isActive = true; charsPerSecond = Mathf.Max(0.2f, charsPerSecond); myText = GetComponent<TextMesh>(); words = myText.text; myText.text = "";//获取Text的文本信息,保存到words中,然后动态更新文本显示内容,实现打字机的效果 } // Update is called once per frame void Update() { OnStartWriter(); } /// <summary> /// 执行打字任务 /// </summary> void OnStartWriter() { if (isActive) { timer += Time.deltaTime; if (timer >= charsPerSecond) {//判断计时器时间是否到达 timer = 0; currentPos++; myText.text = words.Substring(0, currentPos);//刷新文本显示内容 if (currentPos >= words.Length) { OnFinish(); } } } } /// <summary> /// 结束打字,初始化数据 /// </summary> void OnFinish() { isActive = false; timer = 0; currentPos = 0; myText.text = words; } }