之前在网上找过各种的逐个输出字,我可能理解能力不好,照着代码复制没有能使用成功,于是自己研究了很多网上说的思路,各种改良出了一个能用的,写完自己测试,觉得还真好用,于是记录下来
用法:将用代码组件挂上去,通过查找到代码组件,通过enabled来控制组件开关,每次更新文字时候,让组件进行一次关闭和开启,就能再次逐个显示
using UnityEngine; using System.Collections; using UnityEngine.UI; public class WordOutPut : MonoBehaviour { public float charsPerSecond = 0.05f;//打字时间间隔 private string words;//保存需要显示的文字 private bool isActive = false; //判断是否开始输出 private float timer;//计时器 private Text myText;//获取身上的test脚本 private int currentPos = 0;//当前打字位置 // Use this for initialization private void OnDisable() { OnFinish();//当脚本在失活的时候,将数据进行重置 } /// <summary> /// 当脚本被激活的时候,将数据进行初始化 /// </summary> private void OnEnable() { timer = 0; isActive = true; charsPerSecond = Mathf.Max(0.02f, charsPerSecond); //将最小的出字速度限制为0.02,也可以自行调整 myText = GetComponent<Text>(); words = myText.text; myText.text = "";//获取Text的文本信息,保存到words中,然后动态更新文本显示内容,实现打字机的效果 } void Start() { } // Update is called once per frame void Update() { OnStartWriter(); //Debug.Log (isActive); } /// <summary> /// 执行打字任务 /// </summary> void OnStartWriter() { if (isActive) { timer += Time.deltaTime; if (timer >= charsPerSecond)//判断计时器时间是否到达 { timer = 0; currentPos++; //这里其实还可以做一个改良,可以检测一个input用户输入,如果输入了,则让currentPos = words.Length,这样可以实现按下按键,马上就显示完毕 myText.text = words.Substring(0, currentPos);//刷新文本显示内容 if (currentPos >= words.Length) { OnFinish(); } } } } /// <summary> /// 结束打字,初始化数据 /// </summary> void OnFinish() { isActive = false; timer = 0; currentPos = 0; myText.text = words; } }