Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決
Unity 報(bào)錯(cuò) 之 InvalidOperationException: out of sync
報(bào)錯(cuò)原文:
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#是不允許你在迭代器中直接修改。
大概是這個(gè)意思【這是個(gè)錯(cuò)誤示范
public void ShowMyCard(int[] card)
{
if (myCardsDic.Count > 0)
{
foreach (int k in myCardsDic.Keys)
{
if(滿足一個(gè)條件)
{
//刪除或者修改此元素
//myCardsDic.Remove(k);
}
}
}
}
若有這樣的需求,應(yīng)該這樣寫(xiě),【大致邏輯:遍歷字典存儲(chǔ)滿足條件的元素,然后操作你剛存儲(chǔ)的元素】
public void ShowMyCard(int[] card)
{
if (myCardsDic.Count > 0)
{
List<int> myCardsList = new List<int>();
foreach (int k in myCardsDic.Keys)
{
if(滿足一個(gè)條件)
{
//保存這個(gè)元素
myCardsList.Add(myCardsDic[k]);
}
}
foreach (int item in myCardsList)
{
//做你要做的事情
}
}
}
而我遇到的問(wèn)題,和上面的問(wèn)題不太一樣
我的問(wèn)題:是在遍歷字典的時(shí)候使用了協(xié)程,然后有其他的情況下調(diào)用了這個(gè)字典,從而導(dǎo)致了上面的這個(gè)錯(cuò)誤的產(chǎn)生,報(bào)錯(cuò)代碼大致如下:
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();
}
}
}
我遇到問(wèn)題的解決辦法:在使用過(guò)程中不使用協(xié)程的方式去操作,發(fā)現(xiàn)效果也還不錯(cuò),修改代碼如下:
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.
您正在修改字典,同時(shí)遍歷它。這是一個(gè)大大的禁忌。
到此這篇關(guān)于Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決的文章就介紹到這了,更多相關(guān)Unity報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#通過(guò)進(jìn)程調(diào)用cmd判斷登錄用戶權(quán)限代碼分享
最近自己開(kāi)發(fā)軟件需要讀取本地配置文件,因?yàn)榈卿浻脩舻臋?quán)限不夠會(huì)導(dǎo)致無(wú)法讀取文件進(jìn)而導(dǎo)致程序崩潰,查了一些解決方法,代碼分享如下2013-12-12
C#使用對(duì)象序列化類庫(kù)MessasgePack
這篇文章介紹了C#使用對(duì)象序列化類庫(kù)MessasgePack的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
淺析WPF中控件拖拽與拖動(dòng)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何在WPF中實(shí)現(xiàn)控件拖拽與拖動(dòng)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

