You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:07:31