【Unity】解决InvalidOperationException: Collection was modified; enumeration operation may not execute.
今天在Unity运行时遇到了InvalidOperationException: Collection was modified; enumeration operation may not execute。
打开代码后发现用到了Dictionary数据结构,但也并没有在foreach循环中修改它,只是在Update中调用了它而已。
foreach (var item in statusTimers)
{
var status = item.Key;
statusTimers[status] -= deltaTime;
if (statusTimers[status] <= 0f)
{
if (statusesToRemove == null)
{
statusesToRemove = new Dictionary<CharacterStatusType, float>();
}
statusesToRemove.Add(status, statusTimers[status]);
}
}
经过仔细检查多个文件,我在一个携程中调用了一个增添方法,这个方法对Dictionary进行了添加操作,而此时另一边Update正处于foreach遍历当中,所以发生冲突产生错误。
private IEnumerator CastRoutine()
{
// ...
target._stateManager.AddStatus(_addStatus, _statusTime);
}
public void AddStatus(CharacterStatusType status, float duration)
{
if (!statusTimers.ContainsKey(status))
{
statusTimers.Add(status, duration);
UpdateCurrentStatus();
}
else
{
// 如果已存在该异常状态,保留较长的持续时间
float existingDuration = statusTimers[status];
statusTimers[status] = Mathf.Max(existingDuration, duration);
UpdateCurrentStatus();
}
}
解决办法:Unity提供了线程安全的集合类ConcurrentDictionary,能够在携程中正确处理对字典的并发访问。把Dictionary替换掉即可。
本文作者:香菇0_0
本文链接:https://www.cnblogs.com/Xiang-gu/p/18601775
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步