在公司的可爱美丽聪明伶俐世间最美的仙女蛙策划的强制要求下做了这个功能 感谢帮助我的程序大佬
Unity对标点是没有做过处理的 所有现在有一个需求是处理行首不能出现标点
这种情况看着很不美观,修正方法:吧上一行的最后一个字拉下来
如果有多个标点的话,都拉下来
代码
private readonly string markList = "(\!|\?|\,|\。|\《|\》|\)|\:|\“|\‘|\、|\;|\+|\-)";
StringBuilder textStr;
public override void SetVerticesDirty()
{
var settings = GetGenerationSettings(rectTransform.rect.size);
cachedTextGenerator.Populate(this.text, settings);
textStr = new StringBuilder(this.text);
IList<UILineInfo> lineList = this.cachedTextGenerator.lines;
int changeIndex = -1;
for (int i = 1; i < lineList.Count; i++)
{
bool isMark = Regex.IsMatch(text[lineList[i].startCharIdx].ToString(), markList);
if (isMark)
{
changeIndex = lineList[i].startCharIdx - 1;
string str = text.Substring(lineList[i - 1].startCharIdx, lineList[i].startCharIdx);
MatchCollection richStrMatch = Regex.Matches(str, ".(</color>|<color=#\\w{6}>|" + markList + ")+$");
if (richStrMatch.Count > 0)
{
string richStr = richStrMatch[0].ToString();
int length = richStr.Length;
changeIndex = lineList[i].startCharIdx - length;
break;
}
}
}
if (changeIndex >= 0)
{
textStr.Insert(changeIndex, '\n');
this.text = textStr.ToString();
}
base.SetVerticesDirty();
}
原理
Text是继承Graphic的,所以在改变Text.text时,渲染会脏掉,此时重新渲染,在渲染之前进行正则表达式处理文字。
注意:
1.建议在想要处理标签枚举的前面都加上\,防止出现出现如+这样的正则表达式关键字导致代码报错。
2.使用StringBuilder,C#中不可修改String。
3.修改文字的textStr用全局变量,防止GC。
使用方法:
写一个类继承自Text或者在常常看到的RichText这种类中添加。