public void Execute()
 {
     try
     {
         int newestTickNumber = snapshotBuffer.GetNewestTickNumber();
         //Пришла новая информация
         if (lastSavedTickNumber < newestTickNumber)
         {
             //Обновить локальный счётчик
             lastSavedTickNumber = newestTickNumber;
             SnapshotWithLastInputId newest = snapshotBuffer.GetNewestSnapshot();
             ushort playerEntityId          = PlayerIdStorage.PlayerEntityId;
             if (playerEntityId == 0)
             {
                 //todo изменить порядок установки playerEntityId
                 throw new Exception("PlayerEntityId не установлен");
             }
             //проверить, что игрок правильно предсказан или пересоздать текущее состояние
             predictionManager.Reconcile(newest, playerEntityId);
         }
         else
         {
             //новый тик от сервера не пришёл
         }
     }
     catch (Exception e)
     {
         log.Error(e.FullMessage());
     }
 }
        public void Execute()
        {
            int newestTickNumber = snapshotBuffer.GetNewestTickNumber();

            if (newestTickNumber == lastShowedTickNumber)
            {
                return;
            }

            lastShowedTickNumber = newestTickNumber;
            SnapshotWithLastInputId newestGameState = snapshotBuffer.GetNewestSnapshot();

            HashSet <ushort> needDelete = new HashSet <ushort>(dictionary.Keys);

            foreach (var pair in newestGameState.transforms)
            {
                ushort entityId      = pair.Key;
                var    viewTransform = pair.Value;

                Vector3    position = viewTransform.GetPosition();
                Quaternion rotation = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up);

                if (!vectorValidator.TryValidate(position))
                {
                    log.Debug("Проблема позиции");
                    continue;
                }

                needDelete.Remove(entityId);
                //Такой обьект уже есть на сцене
                if (dictionary.TryGetValue(entityId, out var gameObject))
                {
                    //Обновить
                    gameObject.transform.position = position;
                    gameObject.transform.rotation = rotation;
                }
                else
                {
                    //Создать
                    GameObject prefab = clientPrefabsStorage.GetPrefab(viewTransform.viewTypeEnum);
                    GameObject go     = physicsSpawner.Spawn(prefab, position, rotation);
                    dictionary.Add(entityId, go);
                }
            }

            //Удалить лишние объекты
            foreach (ushort entityId in needDelete)
            {
                Object.Destroy(dictionary[entityId]);
            }
        }