服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity报错InvalidOperationException: out of sync的解决

Unity报错InvalidOperationException: out of sync的解决

2022-11-21 14:27Czhenya C#

今天在做个东西,发现报错,特此来记录一下,本文介绍了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)

在网上查了下是在迭代器中直接修改引起的。c#是不允许你在迭代器中直接修改。
大概是这个意思【这是个错误示范

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void ShowMyCard(int[] card)
    {
        if (myCardsDic.Count > 0)
        {
            foreach (int k in myCardsDic.Keys)
            {
       if(满足一个条件)
                   {
                        //删除或者修改此元素
            //myCardsDic.Remove(k);
          }
            }
        }
    }

若有这样的需求,应该这样写,【大致逻辑:遍历字典存储满足条件的元素,然后操作你刚存储的元素】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)
        {
   //做你要做的事情
        }
    }
}

而我遇到的问题,和上面的问题不太一样

我的问题:是在遍历字典的时候使用了协程,然后有其他的情况下调用了这个字典,从而导致了上面的这个错误的产生,报错代码大致如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
        }
    }
}

我遇到问题的解决办法:在使用过程中不使用协程的方式去操作,发现效果也还不错,修改代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.
您正在修改字典,同时遍历它。这是一个大大的禁忌。

到此这篇关于Unity报错InvalidOperationException: out of sync的解决的文章就介绍到这了,更多相关Unity报错内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Czhenya/article/details/101803955

延伸 · 阅读

精彩推荐
  • C#QT、WPF、PyQt、Electron 桌面应用解决方案

    QT、WPF、PyQt、Electron 桌面应用解决方案

    Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。本文为大家分享下QT、WPF、PyQt、Electron 桌面应用解决方案,有需要的朋友可以参考...

    知乎6802022-09-01
  • C#详解C#中的out和ref

    详解C#中的out和ref

    本文主要介绍了out和ref的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧...

    Alan_beijing9282021-12-18
  • C#详谈C# 图片与byte[]之间以及byte[]与string之间的转换

    详谈C# 图片与byte[]之间以及byte[]与string之间的转换

    下面小编就为大家带来一篇详谈C# 图片与byte[]之间以及byte[]与string之间的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编...

    C#9762021-12-24
  • C#C# 线程同步的方法

    C# 线程同步的方法

    这篇文章主要介绍了C# 线程同步的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    冬冬他哥哥10692022-09-29
  • C#C#多线程之线程控制详解

    C#多线程之线程控制详解

    这篇文章主要为大家详细介绍了C#多线程之线程控制的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    云梦鸿5032022-01-19
  • C#C#获取网页源代码的方法

    C#获取网页源代码的方法

    这篇文章主要介绍了C#获取网页源代码的方法,涉及C#基于自定义函数读取网页html代码的方法,具有一定参考借鉴价值,需要的朋友可以参考下...

    C#教程网9612021-10-26
  • C#C# WPF 通过委托实现多窗口间的传值的方法

    C# WPF 通过委托实现多窗口间的传值的方法

    这篇文章主要介绍了C# WPF 通过委托实现多窗口间的传值的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    hello黄先森6342022-02-28
  • C#C# Resources资源详解

    C# Resources资源详解

    这篇文章主要为大家详细介绍了C# Resources资源,包括Resource Basics、Strongly Typed Resources等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    路灯下的诗人4532021-12-16