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