如何修改TextMeshPro的text属性时避免颜色异常变化
TextMeshPro修改文本后顶点颜色短暂回退默认值的解决办法
修改TextMeshPro的text属性后,立即通过UpdateTime设置顶点颜色(红色或白色),接着调用ForceMeshUpdate(),但文本仍会短暂显示默认的绿色。相关代码如下:
public void ChangeText(string text) { if (m_textMeshPro != null) { m_textMeshPro.text = text; UpdateTime(m_timeTemp); // set vertex color m_textMeshPro.ForceMeshUpdate(); } }
问题原因
TextMeshPro在设置text时会触发内部的文本变更流程,其中包含重新生成顶点数据、应用默认样式颜色的逻辑。这个流程可能在你手动设置顶点颜色之后、ForceMeshUpdate()执行之前的帧内时机运行,直接覆盖了你设置的颜色,导致短暂显示默认绿色。
解决办法
方法1:临时禁用自动更新,避免内部逻辑覆盖
先关闭TextMeshPro的自动更新机制,修改完文本和颜色后再恢复,确保你的颜色设置优先级更高:
public void ChangeText(string text) { if (m_textMeshPro != null) { // 保存原有设置 bool wasAutoSizeEnabled = m_textMeshPro.enableAutoSizing; bool wasStaticScale = m_textMeshPro.isTextObjectScaleStatic; // 临时关闭自动更新相关功能 m_textMeshPro.enableAutoSizing = false; m_textMeshPro.isTextObjectScaleStatic = true; // 修改文本和顶点颜色 m_textMeshPro.text = text; UpdateTime(m_timeTemp); m_textMeshPro.ForceMeshUpdate(); // 恢复原有设置 m_textMeshPro.enableAutoSizing = wasAutoSizeEnabled; m_textMeshPro.isTextObjectScaleStatic = wasStaticScale; } }
方法2:直接操作Mesh顶点数据,跳过TMP内部样式逻辑
在UpdateTime里直接修改Mesh的颜色数组并手动更新几何结构,绕开TMP的默认颜色应用流程:
private void UpdateTime(string timeText) { TMP_TextInfo textInfo = m_textMeshPro.textInfo; if (textInfo.characterCount == 0) return; // 根据你的逻辑设置目标颜色(红或白) Color targetColor = Color.red; Color32[] vertexColors = textInfo.meshInfo[0].colors32; // 遍历可见字符修改顶点颜色 for (int i = 0; i < textInfo.characterCount; i++) { TMP_CharacterInfo charInfo = textInfo.characterInfo[i]; if (!charInfo.isVisible) continue; int vertexIndex = charInfo.vertexIndex; vertexColors[vertexIndex] = targetColor; vertexColors[vertexIndex + 1] = targetColor; vertexColors[vertexIndex + 2] = targetColor; vertexColors[vertexIndex + 3] = targetColor; } // 直接更新Mesh并刷新显示 textInfo.meshInfo[0].mesh.colors32 = vertexColors; m_textMeshPro.UpdateGeometry(textInfo.meshInfo[0].mesh, 0); }
方法3:使用富文本指定颜色(最省心)
直接在文本中嵌入TMP的富文本颜色标签,完全避免手动修改顶点颜色的冲突:
public void ChangeText(string text, Color targetColor) { if (m_textMeshPro != null) { // 将颜色转为十六进制格式 string colorHex = ColorUtility.ToHtmlStringRGB(targetColor); // 用富文本包裹文本 m_textMeshPro.text = $"<color=#{colorHex}>{text}</color>"; m_textMeshPro.ForceMeshUpdate(); } }
内容的提问来源于stack exchange,提问作者user24923965
相关产品推荐
相关产品推荐

