Unity報錯InvalidOperationException: out of sync的解決
Unity 報錯 之 InvalidOperationException: out of sync
報錯原文:
InvalidOperationException: out of sync
System.Collections.Generic.Dictionary2+Enumerator[System.Int32,UnityEngine.Transform].VerifyState () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:912) System.Collections.Generic.Dictionary2+Enumerator[System.Int32,UnityEngine.Transform].MoveNext () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:278)
System.Collections.Generic.Dictionary`2+KeyCollection+Enumerator[System.Int32,UnityEngine.Transform].MoveNext () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:1028)
BigHandCard+c__Iterator6.MoveNext () (at Assets/Scripts/Public/HandCards.cs:781)
UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
在網(wǎng)上查了下是在迭代器中直接修改引起的。c#是不允許你在迭代器中直接修改。
大概是這個意思【這是個錯誤示范
public void ShowMyCard(int[] card) { if (myCardsDic.Count > 0) { foreach (int k in myCardsDic.Keys) { if(滿足一個條件) { //刪除或者修改此元素 //myCardsDic.Remove(k); } } } }
若有這樣的需求,應(yīng)該這樣寫,【大致邏輯:遍歷字典存儲滿足條件的元素,然后操作你剛存儲的元素】
public void ShowMyCard(int[] card) { if (myCardsDic.Count > 0) { List<int> myCardsList = new List<int>(); foreach (int k in myCardsDic.Keys) { if(滿足一個條件) { //保存這個元素 myCardsList.Add(myCardsDic[k]); } } foreach (int item in myCardsList) { //做你要做的事情 } } }
而我遇到的問題,和上面的問題不太一樣
我的問題:是在遍歷字典的時候使用了協(xié)程,然后有其他的情況下調(diào)用了這個字典,從而導(dǎo)致了上面的這個錯誤的產(chǎn)生,報錯代碼大致如下:
public IEnumerator ShowMyCard(int[] card) { if (myCardsDic.Count > 0) { foreach (int k in myCardsDic.Keys) { float x = myCardsDic[k].localScale.x; myCardsDic[k].DOScaleX(0, 0.02f).OnComplete(() => { myCardsDic[k].DOScaleX(x, 0.02f); }); yield return new WaitForFixedUpdate(); } } }
我遇到問題的解決辦法:在使用過程中不使用協(xié)程的方式去操作,發(fā)現(xiàn)效果也還不錯,修改代碼如下:
public void ShowMyCard(int[] card) { if (myCardsDic.Count > 0) { foreach (int k in myCardsDic.Keys) { float x = myCardsDic[k].localScale.x; myCardsDic[k].DOScaleX(0, 0.02f).OnComplete(() => { myCardsDic[k].DOScaleX(x, 0.02f); }); } } }
You are modifying the dictionary while iterating over it. This is a big no-no.
您正在修改字典,同時遍歷它。這是一個大大的禁忌。
到此這篇關(guān)于Unity報錯InvalidOperationException: out of sync的解決的文章就介紹到這了,更多相關(guān)Unity報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# PaddleDetection yolo實現(xiàn)印章檢測
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合PaddleDetection yolo實現(xiàn)印章檢測,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11