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]);
            }
        }
Example #2
0
        public void Spawn(ServerGameEntity entity)
        {
            ViewTypeEnum viewType      = entity.viewType.value;
            Vector3      spawnPosition = entity.spawnTransform.position;
            Quaternion   spawnRotation = entity.spawnTransform.rotation;
            GameObject   prefab        = prefabStorage.GetPrefab(viewType);
            GameObject   go            = physicsSpawner.Spawn(prefab, spawnPosition, spawnRotation);

            go.Link(entity);
            entity.AddTransform(go.transform);
            Rigidbody rigidbody = go.GetComponent <Rigidbody>();

            entity.AddRigidbody(rigidbody);
            entity.AddView(go);

            //todo не забыть убрать компонент
            // entity.RemoveSpawnTransform();
        }
Example #3
0
        public void Spawn(ServerGameEntity entity)
        {
            ViewTypeEnum viewType      = entity.viewType.value;
            Vector3      spawnPosition = entity.spawnTransform.position;
            Quaternion   spawnRotation = entity.spawnTransform.rotation;
            GameObject   prefab        = prefabStorage.GetPrefab(viewType);
            GameObject   go            = physicsSpawner.Spawn(prefab, spawnPosition, spawnRotation);

            go.layer = playersLayerNumber;
            go.Link(entity);
            entity.AddView(go);
            entity.AddTransform(go.transform);
            Rigidbody rigidbody = go.GetComponent <Rigidbody>();

            entity.AddRigidbody(rigidbody);
            shootingPointsHelper.AddShootingPoints(go, entity);
            Collider[] colliders = go.GetComponents <Collider>();
            entity.AddWarshipColliders(colliders);
        }