在做剧情系统的时候,有个剧情模式叫立绘对话,也就是那种你说一句我说一句的那种,策划的要求是希望对话是逐字出现的,而且文字都是在表格里面配置的还需要支持字体颜色的配置.显示一句完成后自动显示下一句.
读取表格显示字体是很简单的.但是要逐字出现,由于之前没做过,首先想到的是,字体应该都是已经全部放上去了,然后在Text的上面放上一层遮罩.没隔一段时间把上面这层遮罩缩短一个字.这样就可以实现逐字出现的样式了.但是后面发现不行,因为每个字的大小和宽度是不一样的,而且还会有标点符号的区分.
于是只能是使用那种每次往Text组件上加上一个字,但是这样做的问题又出现了,因为是每次加上一个字的,也就是说事先定义的颜色标记是没有用的他会被逐字打印在Text上了,比如 <color>标记他会首先打印 "<" 这个符合然后陆续把<color>整个显示出来 而不会像直接显示文字那样把<color>标记里面的文字按照定义的颜色显示出来.
为了实现这个功能我只好用个正则表达式,把<color></color>整个内容先截取出来然后再赋值颜色值整体显示出来,也就是说,只要遇到有颜色标记的字就截取出来然后整体显示出来,这样就可以实现所需要的功能了.
部分代码如下:
//截出带颜色部分字体 Regex reg = new Regex("(?<=<color).*?(?=</color>)", RegexOptions.None); MatchCollection matchs = reg.Matches(dialogDeploy_.text); //Debug.Log(matchs[0].Index-6+"-----"+ matchs[0].Length+6+8); int k = 0; ch = dialogDeploy_.text.ToCharArray();//转换成数组 for (int j = 0; j < ch.Length; ++j) { yield return new WaitForSeconds(0.1f); if (isNext) { break; } if (ch[j] == '<' && matchs[k].Length + 6 + 8 < dialogDeploy_.text.Length) { //匹配出带颜色的字体 showText_.text += dialogDeploy_.text.Substring(j, matchs[k].Length + 6 + 8); j += matchs[k++].Length + 6 + 8; } else { showText_.text += ch[j];//显示每个字 } } yield return new WaitForSeconds(0.5f); showText_.text = "\n"; ch = null; ++i; }