Unity c# UI.文本问题:(…)这是不支持的.UnityEngine.Canvas: SendWillRende

本文关键字:不支持 UnityEngine SendWillRende Canvas UI 文本 问题 Unity | 更新日期: 2023-09-27 18:11:20

尝试添加LineDescriptor(Clone) (UnityEngine.UI.Text)图形重建,而我们已经在图形重建循环。这是不支持的。UnityEngine.Canvas:SendWillRenderCanvases()

嘿,我得到了这个问题,当我试图更新与文本组件附加许多游戏对象的位置。你知道是什么原因引起的吗?

  for(int i = 0; i< dottedLines.Count; i++)
    {
        dottedLineStaff[dottedLines[i]][1].transform.position = RectTransformUtility.WorldToScreenPoint(Camera.main, dottedLineStaff[dottedLines[i]][0].transform.position);
    }

Unity c# UI.文本问题:(…)这是不支持的.UnityEngine.Canvas: SendWillRende

我遇到了这个错误,当我有一个异步插件控制脚本实例化UI预制。基本上,插件偶尔会在图形过程中实例化UI预制件。重建循环。在我与UI预制件交互之前,部分UI预制件会画得不正确。

我的解决方案是为下一个Update()调用的实例化排队,而不是在插件调用回调时实例化它们。类似于:

List<string> queue = new List<string>();
private object thisLock = new object();
public void PluginCallback(string name)
{
    // instead of instantiating/modifying UI elements here, queue them for later
    lock (thisLock)
    {
        queue.Add(name);
    }
}
void Update()
{
    lock (thisLock)
    {
        // shouldn't be in a Graphic.Rebuild loop now
        if (queue.Count > 0)
        {
            foreach (string name in queue)
            {
                Text text = (Instantiate(prefab) as GameObject).GetComponent<Text>();
                text.text = name;
            }
            queue.Clear();
        }
    }
}

仅供参考-我也看到其他帖子,问题更可能是一个Unity的错误(iOS,旧的Unity版本,等)。

编辑:添加锁的例子(https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)。我对这个问题所涉及的概念很陌生,所以我可能会随着时间的推移而改变我的答案……因此,我不认为这个例子总体上是适当的——我只是说,在我的情况下,它解决了OP描述的错误。