木骰

关于Unity2019富文本显示异常的问题

Unity2019 的Text不再存储 空格 回车 富文本标签等的顶点信息,导致以往通过<quad>标签占位方式实现的图文混排,图片坐标都计算错误了。
https://blog.csdn.net/wanzi215/article/details/103970269

我的富文本实现方案:
https://blog.csdn.net/akof1314/article/details/49028279

这个方案通过<quad>标签占位,计算出标签顶点所在位置的坐标并插入图片。
Unity2019以前的版本 对Text文本内容的每个字符都会占4个顶点,所以原先计算图片坐标的方式是获取到<quad>标签在文本内容中的下标,再乘以4,得到最终渲染的顶点下标。但是Unity2019之后对于这些最终不显示的文本,都不再存储顶点信息了,所以按照这个方式计算得到的顶点下标,实际多算了一些空格 和 富文本标签。那么其实只需要在计算<quad>字符下标的时候剔除掉它前面不会渲染的文本内容所占的字符长度就行了。

剔除空格和回车比较简单,直接正则匹配一下就行。然后还要剔除富文本的标签内容,这里如果要考虑标签填写是否正确就很麻烦了,因为像<color></color>这种标签,你如果不填写完整,或格式写的不对的话,最终是会按文本显示出来的,这样这个标签字符就不能剔除,这种情况考虑起来太复杂。

不过一般富文本用在显示玩家输入的内容的话,是会禁止玩家输入 <xxx> 这种内容的,我们项目是会把这种输入替换成 [xxx] 这样。那如果是用在非玩家输入内容的显示的话,富文本标签填写不完整 或 填写错误,本来就是不对的。所以这个地方,对于富文本标签的剔除,我觉得直接把 <xxx> 这样的内容全部剔除掉,不管它是不是富文本的标签,不过这样的话,游戏中就不能再显示 <xxx> 这样的内容了,我觉得问题也不大,用别的字符替换一下好了。

这样的话 写一个正则匹配,把<quad>标签之前 匹配到的文本内容全部剔除掉就行。

	/// <summary>
    /// Unity2019 之后的版本 需要剔除空格 换行  和 富文本标签占的顶点
    /// </summary>
    private static readonly Regex s_VertexFilter = new Regex(@"(<(.+?)>|[ \n\r\t]+)", RegexOptions.Singleline);

然后修改计算图片顶点下标的地方,减掉匹配到的文本

	protected void UpdateQuadImage()
    {
		//........
		
		var filters = s_VertexFilter.Matches(text);
        m_ImagesVertexIndex.Clear();
        foreach (Match match in s_Regex.Matches(text))
        {           
            var picIndex = match.Index;
            for (int idx = 0; idx < filters.Count; idx++)
            {
                var filter = filters[idx];
                if (filter.Index >= match.Index)
                    break;
                picIndex -= filter.Length;
            }
			//因为\<quad>标签对应的纹理还是会渲染的,并且仍然占4个顶点,而每个\<quad>会对应一张图片
			//所以这里加回前面的图片数量,就是加回\<quad>对应的纹理占的顶点
			picIndex += m_ImagesVertexIndex.Count;
			var endIndex = picIndex * 4 + 3;
            m_ImagesVertexIndex.Add(endIndex);
			
		//.......
		}
	}

其它地方和以前一样,无需修改。
这样富文本方案可以继续使用<quad>占位的方式实现,只是不能再填写<xxx>这样的内容了。

— 于 共写了1607个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*