2016-10-03 8 views
0

グラフィック再構築ループの中にすでにグラフィック再構築のためにLineDescriptor(Clone)UnityEngine.UI.Text)を追加しようとしています。これはサポートされていません。 UnityEngine.Canvas:SendWillRenderCanvases()Unity C#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); 
    } 
+0

私はそれを解決しました。私は多くのオブジェクトに対して同じ参照を共有することに問題がありました。一言で言えば、あらかじめ作成された参照を使ってすべてのTextオブジェクトを保存しようとしましたが、バグ「null参照」を取得するのではなく、取得しました。私が新しいTextオブジェクトを保存するたびに、古いものはその参照を失った。 –

答えて

0

UIプレハブをインスタンス化するスクリプトを非同期プラグインで制御しているときにこのエラーが発生しました。基本的に、このプラグインはGraphic.Rebuildループ中に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(); 
     } 
    } 
} 

ちょうどFYI - 私はまた、問題が可能性が高いユニティのバグ(iOSの、古いUnityバージョンなど)であった他の記事を見てきました。

EDIT:例にロックされました(https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)。私はこの問題に関わる概念にはかなり新しいので、私は時間の経過とともに私の答えを進化させているかもしれません...したがって、私はこの例の一般的な妥当性については全く主張しません - 私は私の場合、 OPは説明する。

関連する問題