Четверг, 28 Марта 2024, 16:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ошибка на сервере SignalR
Ошибка на сервере SignalR
ArtemSДата: Четверг, 06 Сентября 2018, 06:36 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Код
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)
---------------------------------------------
Все нашел ошибку. Забыл чистить лист на обновление


хуяк, хуяк и в продакшн

Сообщение отредактировал ArtemS - Четверг, 06 Сентября 2018, 06:51
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Ошибка на сервере SignalR
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг