Код
InvalidOperationException: Collection was modified; enumeration operation may not execute.
System.ThrowHelper.ThrowInvalidOperationException (System.ExceptionResource resource) (at <cfc149f8218b496788d8493c87de777a>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNextRare () (at <cfc149f8218b496788d8493c87de777a>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNext () (at <cfc149f8218b496788d8493c87de777a>:0)
SignalRClient+<SendAndSyncData>c__Iterator1.MoveNext () (at Assets/Scripts/SignalRClient.cs:83)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
Делаю сетевую сервер-клиентскую игру. Сделал передачу координат, все прекрасно работает: координаты передаются, во всех окнах все гладенько двигается у всех, но спустя секунд 5-10 движений происходит вот эта ошибка и все! Связь будто обрывается и прекращается синхроницазия между игроками. Может кто подсказать как эту хрень избежать ?
Делаю с использованием SignalR.
Код
private IEnumerator SendAndSyncData()
{
yield return new WaitForSeconds(0.06f); //каждые 60 мс шлет Update
if (_isPlayerRegister)
{
if (_gameHelper.CurrentPlayerGameObject)
{
Vector3 pos = _gameHelper.CurrentPlayerGameObject.GetComponent<PlayerController>().SyncPosition;
Quaternion rot = _gameHelper.CurrentPlayerGameObject.GetComponent<PlayerController>().SyncRotation;
SyncObjectModel syncObjectModel = new SyncObjectModel()
{
Id = _gameHelper.CurrentPlayerGameObject.GetComponent<SignalRIdentity>().NetworkID,
X = pos.x,
Y = pos.y,
Z = pos.z,
aX = rot.x,
aY = rot.y,
aZ = rot.z,
aQ = rot.w
};
//отправляет на обновление syncObjectModel
hubProxy.Invoke("UpdateModel", syncObjectModel);
}
//синкаем позицию
if (_syncObjectPool.Count > 0)
{
foreach (var syncObjectModel in _syncObjectPool)
{
SignalRIdentity signalRIdentity = _gameHelper.OtherPlayers.FirstOrDefault(p => p.NetworkID == syncObjectModel.Id);
if (signalRIdentity)
{
PlayerController playerController = signalRIdentity.GetComponent<PlayerController>();
Vector3 pos = new Vector3(syncObjectModel.X, syncObjectModel.Y, syncObjectModel.Z);
Quaternion rot = new Quaternion(syncObjectModel.aX,
syncObjectModel.aY,
syncObjectModel.aZ,
syncObjectModel.aQ);
playerController.SyncPosition = pos;
playerController.SyncRotation = rot;
}
}
}
}
StartCoroutine(SendAndSyncData());
}
^
Так идет получение позиции в клиенте
Код
//рассылка обновления
public void BroadcastShape(object state)
{
if (_modelUpdated)
{
foreach (var item in _oneFrameSyncModels )
{
//если зарегестрирован значит имеет право слать свои координаты
//шлет всем кроме себя
if (_players.Any(p => p.ConnectionId == item.Authority))
//вызывать (AllExcept) у всех, кроме отсылающего (item.Authority) метод updateGameModels и слать в него item
_hubContext.Clients.AllExcept(item.Authority).updateGameModels(item);
}
//здесть обнуляем список изменений
_oneFrameSyncModels = new ConcurrentQueue<SyncObjectModel>();
_modelUpdated = false;
}
}
//обновление модели
public void UpdateModel(SyncObjectModel clientmodel)
{
_oneFrameSyncModels.Enqueue(clientmodel);
_modelUpdated = true;
}
^
А это то, что происходит на сервереДобавлено (06 Сентября 2018, 07:03)
---------------------------------------------
Все нашел ошибку. Забыл чистить лист на обновление