C# 富文本的问题及其在unity中如何在屏幕上更新

C# 富文本的问题及其在unity中如何在屏幕上更新,c#,unity3d,C#,Unity3d,对于我的游戏,我希望有一个对话系统,其中一些单词的颜色不同。现在,我使用.ToCharArray命令在屏幕上键入了正常的白色文本。这允许我一次在屏幕上键入一个字母。我还查找并发现了一种称为富文本和标记的东西,它允许我用不同的颜色给文本上色,而将其余部分保留为白色。问题是,正在键入句子,然后在ui中更新以显示颜色,因此在短暂的一秒钟内,将显示句子,直到文本变为绿色。有没有办法使文本的颜色生效?是否有一种资产可以让我在统一中改变某些单词的颜色?任何帮助都将不胜感激 在DataBlock脚本对象中,我

对于我的游戏,我希望有一个对话系统,其中一些单词的颜色不同。现在,我使用.ToCharArray命令在屏幕上键入了正常的白色文本。这允许我一次在屏幕上键入一个字母。我还查找并发现了一种称为富文本和标记的东西,它允许我用不同的颜色给文本上色,而将其余部分保留为白色。问题是,正在键入句子,然后在ui中更新以显示颜色,因此在短暂的一秒钟内,将显示句子,直到文本变为绿色。有没有办法使文本的颜色生效?是否有一种资产可以让我在统一中改变某些单词的颜色?任何帮助都将不胜感激

在DataBlock脚本对象中,我在文本区域中键入了我想要的句子。然后我把我想改变的词放在周围。这导致TypeSentance协同例程键入从可脚本对象提取的sentance。这也使得TypeSentance协同程序能够在第二次更新之前打印出文本和文本周围的内容

第一稿 第二稿
我希望结果是文本以我选择的颜色输出,但它是用和打印的,然后更新以显示颜色

您的描述不清楚,因为您缺少一些字符,并且没有给出示例
正文
。此外,还不清楚您使用哪个UI组件

尽管如此,我假设您在遍历字符串时将无效标记设置为文本。您可以在中找到有关受支持的RichtText的更多信息

例如:

  • 此文本效果良好:
    “此文本为绿色和红色”

  • 此文本缺少结束标记,
    -并且不会被
    UI解析为
    RichText
    。text
    组件:
    “此文本为绿色

要解决此问题,您可以解析文本(每次提取零件时)并检查是否缺少结束标记。如果缺少标记,您只需将其添加到末尾。
此外,您还必须忽略开始标记

您的代码有更多错误
  • 更新必须大写。否则Unity不会调用它。但我想你是从其他地方自己调用它的吗?这是非常误导的,应该重命名

    private void Update()
    {
       updateGraphic()
    }
    

  • 如果您正在正确更新,但一帧显示的文本为全白色,则只需在对象关闭时更新文本(
    gameObject.SetActive(false)
    ),然后将其关闭,即可在第一帧上应用更改
    gameObject.SetActive(true)

    public class GameCode : MonoBehaviour
    {
    [SerializeField] DataBlock[] DataBlocks;
    int currentDataBlock = 0;
    
    private void update()
    {
       updateGraphic()
    }
    
    public void updateGraphic()
        {
            StopAllCoroutines();
            StartCoroutine(TypeSentance(DataBlocks
    [currentDataBlock].getBodyText()));
    
            currentDataBlock++
    
    }
    
    IEnumerator TypeSentance(string sentance)
        {
            bodyTextBox.text = "";
            foreach (char letter in sentance.ToCharArray())
            {
                bodyTextBox.text += letter;
                yield return new WaitForSeconds(0.001f);
            }
        }
    }
    
    private void Update()
    {
       updateGraphic()
    }