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#是不允许你在迭代器中直接修改。
大概是这个意思【这是个错误示范

public void ShowMyCard(int[] card)
    {
        if (myCardsDic.Count > 0)
        {
            foreach (int k in myCardsDic.Keys)
            {
       if(满足一个条件)
                   {
                        //删除或者修改此元素
            //myCardsDic.Remove(k);
          }
            }
        }
    }

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

    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)
            {
       //做你要做的事情
            }
        }
    }

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

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

    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();
            }
        }
    }

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

    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报错内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Unity3D运行报DllNotFoundException错误的解决方案

    起因 unity程序build到pc上,拿到其他人的机器上结果有些功能不正常,看log里面大概是 Fallback handler could not load library: xxx.dll DllNotFoundException: xxx.dll 初看以为是缺失dll,但是实际上并不是这样,首先在很多人机器上都是没有问题的,只在极少数机器上才出现异常,另外报错的dll都是有的,并不存在缺失的问题. 后来网上搜了一下,看到http://answers.unity3d.com/questio

  • 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/c

  • AngularJS报错$apply already in progress的解决方法分析

    本文实例分析了AngularJS报错$apply already in progress的解决方法.分享给大家供大家参考,具体如下: 如果我们使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我们很可能会遇到类似下面的错误,虽然这个错误没有太大影响,但是在日志中看起来还是很不爽的,日志中记录的异常或者错误,就应该是需要关注和解决的问题,否则就没有必要出现在日志中了. Error: [$rootScope:inprog] $apply already

  • Mybatis报错: org.apache.ibatis.exceptions.PersistenceException解决办法

    Mybatis报错: org.apache.ibatis.exceptions.PersistenceException解决办法 一.问题描述 写好配置文件用JUnit进行测试,一运行就报错: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiat

  • bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法

    日期插件 bootstrap-datetimepicker 在火狐下出现一条报错信息:TypeError: (intermediate value).toString(-).split(-)[1] is undefined 这条错误必然出现,难道没有在 Firefox 下进行测试. 在 Firefox 下查看项目 demo (http://www.malot.fr/bootstrap-datetimepicker/demo.php)可以正常运行,但这个 demo.php 使用的是 2013-3-

  • maven package 打包报错 Failed to execute goal的解决

    总结一下maven 打包,项目工程开发工具idea14,使用 JDK 1.8 版本 1.打包前需要先将idea关掉,不然会导致mvn clean的时候,部分文件删除不掉,mvn package的时候,也会丢失文件. 2.mvn package打包报错:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project 解决办法: 1. p

  • vue3.0报错Cannot find module ‘worker_threads‘的解决办法

     记录一下vue3.0的第一次尝试,启动项目的时候报错Cannot find module 'worker_threads',查了一下发现是因为个人电脑node版本太低,查看了一下版本 node -v v11.2.0 然后升级一下自己的node版本再执行启动命令就OK了 npm install -g n (mac记得加sudo) n latest 总结:需要把node.js升级到版本12以上,就可以解决vue3.0报错Cannot find module 'worker_threads'的问题了

  • Windows环境下npm install 报错: operation not permitted, rename的解决方法

    前言 最近发现了一个问题,运行 npm install 命令安装依赖包,在 Mac 上的 Vagrant 装的虚拟机上没问题,在阿里云 CentOS 上也没问题,但是在 Windows 环境同样是 Vagrant 装的环境相同的虚拟机上就是不成功,报错如下: npm ERR! Error: EPERM: operation not permitted, rename '/usr/share/nginx/html/tanteng.me/node_modules/duplexify' -> '/us

  • sql2000报错Successfully re-opened the local eventlog解决方法

    报错1:Unable to read local eventlog (reason: 事件日志文件已在读取间更改. 报错2:Successfully re-opened the local eventlog - NOTE: Some events may have been missed. 微软解释: http://support.microsoft.com/default.aspx?scid=kb;en-us;811484 解决办法: 如果要防止错误日志, 中出现这些消息可以使用跟踪标志 25

  • asp在iis7报错行号不准问题的解决方法

    在Win7中做ASP开发,发现了一个非常蛋疼的问题.出现错误的时候,行号不准,很难快读定位到出问题的代码(在Win2003的IIS6就没有问题).命名代码仅有几十行,报错的行号确到了几千行(应该IIS7运行时把 asp 所有include的代码给合并到了一个文件),如图: 经过查看IIS7中的ASP配置,发现 有个 计算行号的选项,设置为true就可以了.(注意:点击右侧的应用后,虽然提示生效,但是实际没有生效.必须用 iisreset 重启IIS后才可以生效)

  • vue-cli创建项目时由esLint校验导致报错或警告的问题及解决

    目录 vue-cli创建项目时由esLint校验导致报错或警告 eslint语法限制项目报错解决 vue-cli创建项目时由esLint校验导致报错或警告 vue-cli创建项目后编写代码控制台一片黄 但不影响代码执行 但是看着就是很不爽啊 到网上搜索了一下这个问题,想起来初始化项目时安装了esLint校验工具 嗯,我看到了很多办法都是下面这样的 1.因为你设置了eslint,如果你不想有规范的js代码,可以重新初始化关掉eslint. Use ESLint to lint your code?

随机推荐