如何防止TextMeshPro的文本属性修改时颜色变化

问题描述 投票:0回答:1

如你所见,我使用了一种方法来修改TextMeshPro的文本属性,修改后,我立即更改其顶点颜色(红色或白色),然后使用ForceMeshUpdate方法。然而,文本仍然暂时返回到默认颜色(绿色)。我目前知道修改文本属性时会调用一系列方法。我正在研究源代码中问题的原因。为了避免浪费太多时间,我想请问有人对这个问题有什么想法吗?

public void ChangeText(string text)
{
    if (m_textMeshPro != null)
    {
        m_textMeshPro.text = text;
        UpdateTime(m_timeTemp); // set vertex color
        m_textMeshPro.ForceMeshUpdate();
    }
}
unity-game-engine unityscript textmeshpro
1个回答
0
投票

@TheQuaX

我试过了,好像没效果。事实上,在我调用 ChangeText 方法之前,有一个协程不断地调用 UpdateTime 方法,直到我触发某个条件,然后调用 ChangeText。修改文本属性之前一切正常,但是一旦更改属性,文本会瞬间渲染回默认颜色(绿色)。

经过研究,发现UGUI的渲染机制是把需要渲染的内容插入到一个待渲染队列中,然后在下一帧统一渲染。当文本属性改变时,TMP需要重新渲染文本。显然,要渲染的顶点与之前渲染的顶点不一样,因此TMP无法使用之前设置的顶点颜色来设置新的顶点,因此TMP使用默认颜色进行渲染。不过我的研究只到了这里,还需要澄清一些事情: 1、待渲染的内容是否像快照一样和渲染数据一起插入到渲染队列中,以及什么时候轮到渲染,按照插入时的状态渲染,还是只插入到队列中,轮到渲染的时候,用渲染时的数据渲染。 2. ForceMeshUpdate 背后的机制是什么,它应该如何工作,为什么不起作用?

另外,我目前的解决方案是使用额外的TMP提前修改文本,并将其设置为不可见。当当前TMP需要修改文字时,用多余的TMP替换当前TMP的视觉效果,然后将当前TMP设置为不可见。当然,这种方法会消耗更多的内存,我不知道哪个更好,ForceMeshUpdate还是这个解决方案。

但是,我仍然需要上述解决方案的其他解决方案。

无论如何,谢谢你的建议。

© www.soinside.com 2019 - 2024. All rights reserved.