public void Update()
        {
            HashSet <GameObject> visibleNow = FogOfWarUtility.GetVisibleObjects(players);

            visibleObjetcs.RemoveWhere((GameObject go) =>
            {
                return(go == null);
            });

            foreach (GameObject gameObject in visibleObjetcs)
            {
                if (!visibleNow.Contains(gameObject))
                {
                    if (gameObject.GetComponent <INonExplorable>() == null)
                    {
                        MapObject mapObject = gameObject.GetComponent <MapObject>();
                        switch (mapObject.mapObjectType)
                        {
                        case MapObjectType.Station:
                            StationScout removeStation = null;
                            foreach (StationScout stationScout in knowScoutedStations)
                            {
                                if (stationScout.mapObjectId == mapObject.id)
                                {
                                    removeStation = stationScout;
                                    break;
                                }
                            }
                            if (removeStation != null)
                            {
                                knowScoutedStations.Remove(removeStation);
                            }
                            break;

                        case MapObjectType.Asteroid:
                            AsteroidScout removeAsteroid = null;
                            foreach (AsteroidScout asteroidScout in knowScoutedAsteroids)
                            {
                                if (asteroidScout.mapObjectId == mapObject.id)
                                {
                                    removeAsteroid = asteroidScout;
                                    break;
                                }
                            }
                            if (removeAsteroid != null)
                            {
                                knowScoutedAsteroids.Remove(removeAsteroid);
                            }
                            break;
                        }
                    }
                }
            }

            visibleObjetcs = visibleNow;
        }
    private void SetStationConstructionButtonClickCallback(StationConstructor stationConstructor, GameObject button, StationConstruction stationConstruction)
    {
        button.GetComponent <Button>().onClick.AddListener(() =>
        {
            Vector3 spawnPosition = stationConstructor.gameObject.transform.position;

            GameObject stationPrefab = Spawner.Instance.dummyStationDictionary[stationConstruction.stationType];
            GameObject station       = Instantiate(stationPrefab, spawnPosition, Quaternion.identity);

            if (possibleStation != null)
            {
                Destroy(possibleStation.gameObject);
            }

            station.SetActive(true);
            FogOfWarUtility.SetRendering(true, station);
            possibleStation = new PossibleStationConstruction(station, stationConstruction, stationConstructor);
            ObjectSelector.Instance.lockSelection = true;
        });
    }
    private IEnumerator RenderEnumerator()
    {
        while (true)
        {
            ICollection <GameObject> visibleNow = FogOfWarUtility.GetVisibleObjects(players);

            foreach (GameObject gameObject in visibleObjects)
            {
                if (gameObject != null && !visibleNow.Contains(gameObject))
                {
                    if (gameObject.GetComponent <INonExplorable>() == null)
                    {
                        MapObject mapObject = gameObject.GetComponent <MapObject>();
                        switch (mapObject.mapObjectType)
                        {
                        case MapObjectType.Station:
                            StationController stationController = gameObject.GetComponent <StationController>();
                            GameObject        station           = Spawner.Instance.SpawnDummyStation(stationController.stationType, stationController.Station, gameObject.transform.position, gameObject.transform.rotation, stationController.constructionProgress, true);
                            dummyRealGameObjectAssociations.Add(new DummyRealGameObjectAssociation(gameObject, station));
                            break;

                        case MapObjectType.Asteroid:
                            AsteroidController asteroidController = gameObject.GetComponent <AsteroidController>();
                            GameObject         asteroid           = Spawner.Instance.SpawnDummyAsteroid(asteroidController.prefabIndex, asteroidController.resourceType, asteroidController.ResourceQuantity, gameObject.transform.position, gameObject.transform.rotation, true);
                            dummyRealGameObjectAssociations.Add(new DummyRealGameObjectAssociation(gameObject, asteroid));
                            break;
                        }
                    }

                    FogOfWarUtility.SetRendering(false, gameObject);
                }
            }

            foreach (GameObject gameObject in visibleNow)
            {
                if (!visibleObjects.Contains(gameObject))
                {
                    FogOfWarUtility.SetRendering(true, gameObject);
                    //if(dummyRealGameObjectAssociations.Conta)

                    dummyRealGameObjectAssociations.RemoveWhere((DummyRealGameObjectAssociation drgoa) =>
                    {
                        bool remove = drgoa.real.Equals(gameObject);
                        if (remove)
                        {
                            Destroy(drgoa.dummy);
                        }
                        return(remove);
                    });
                }
            }

            dummyRealGameObjectAssociations.RemoveWhere((DummyRealGameObjectAssociation drgoa) =>
            {
                bool remove = drgoa.real == null;
                if (remove)
                {
                    Destroy(drgoa.dummy);
                }
                return(remove);
            });

            visibleObjects = visibleNow;

            dummyRealGameObjectAssociations.RemoveWhere((DummyRealGameObjectAssociation drgoa) =>
            {
                bool remove = drgoa.real.Equals(gameObject);
                if (remove)
                {
                    Destroy(drgoa.dummy);
                }
                return(remove);
            });
            yield return(null);

            yield return(null);

            yield return(null);
        }
    }
    private void LoadGameSceneData()
    {
        List <GameObjectSerializedObjectAssociation <AsteroidControllerPersistance> > asteroids = new List <GameObjectSerializedObjectAssociation <AsteroidControllerPersistance> >();

        List <GameObjectSerializedObjectAssociation <AsteroidFieldControllerPersistance> > asteroidFields = new List <GameObjectSerializedObjectAssociation <AsteroidFieldControllerPersistance> >();
        List <GameObjectSerializedObjectAssociation <ShipControllerPersistance> >          ships          = new List <GameObjectSerializedObjectAssociation <ShipControllerPersistance> >();
        List <GameObjectSerializedObjectAssociation <BulletControllerPersistance> >        bullets        = new List <GameObjectSerializedObjectAssociation <BulletControllerPersistance> >();
        List <GameObjectSerializedObjectAssociation <StationControllerPersistance> >       stations       = new List <GameObjectSerializedObjectAssociation <StationControllerPersistance> >();

        List <MapObjectSerializedObjectAssociation> mapObjects = new List <MapObjectSerializedObjectAssociation>();

        foreach (AsteroidFieldControllerPersistance asteroidFieldControllerPersistance in gameSceneData.asteroidFields)
        {
            GameObject field = Spawner.Instance.SpawnAsteroidField(asteroidFieldControllerPersistance.mapObjectPersitance.id, new AsteroidFieldAsteroidSettings(), asteroidFieldControllerPersistance.mapObjectPersitance.localPosition, asteroidFieldControllerPersistance.size, false);

            asteroidFields.Add(new GameObjectSerializedObjectAssociation <AsteroidFieldControllerPersistance>(field, asteroidFieldControllerPersistance));

            mapObjects.Add(new MapObjectSerializedObjectAssociation(field.GetComponent <MapObject>(), asteroidFieldControllerPersistance.mapObjectPersitance));

            foreach (AsteroidControllerPersistance acp in asteroidFieldControllerPersistance.asteroids)
            {
                Vector3    position = acp.mapObjectPersitance.localPosition + acp.mapObjectPersitance.localPosition;
                GameObject asteroid;
                if (acp.prefabIndex == -1)
                {
                    asteroid = Spawner.Instance.SpawnAsteroid(acp.mapObjectPersitance.id, field.GetComponent <AsteroidFieldController>(), acp.resourceType, acp.resourceQuantity, position, false);
                }
                else
                {
                    asteroid = Spawner.Instance.SpawnAsteroid(acp.prefabIndex, acp.mapObjectPersitance.id, field.GetComponent <AsteroidFieldController>(), acp.resourceType, acp.resourceQuantity, position, false);
                }

                asteroids.Add(new GameObjectSerializedObjectAssociation <AsteroidControllerPersistance>(asteroid, acp));
                mapObjects.Add(new MapObjectSerializedObjectAssociation(asteroid.GetComponent <MapObject>(), acp.mapObjectPersitance));
            }
        }

        foreach (BulletControllerPersistance bcp in gameSceneData.bulletControllerPersistances)
        {
            GameObject bullet = Spawner.Instance.SpawnBullet(bcp.mapObjectPersitance.id, BulletFactory.getInstance().CreateBullet(bcp.bullet.bulletType).prefab, bcp.mapObjectPersitance.localPosition, bcp.mapObjectPersitance.localRotation);
            bullets.Add(new GameObjectSerializedObjectAssociation <BulletControllerPersistance>(bullet, bcp));
            mapObjects.Add(new MapObjectSerializedObjectAssociation(bullet.GetComponent <MapObject>(), bcp.mapObjectPersitance));
        }

        foreach (PlayerPersistance playerPersistance in gameSceneData.players)
        {
            foreach (ShipControllerPersistance sp in playerPersistance.ships)
            {
                GameObject ship = Spawner.Instance.SpawnShip(sp.mapObjectPersitance.id, sp.shipType, playerPersistance.player, sp.mapObjectPersitance.localPosition, Quaternion.identity, false);
                ship.GetComponent <ShipController>().initialized = sp.initialized;
                ships.Add(new GameObjectSerializedObjectAssociation <ShipControllerPersistance>(ship, sp));
                mapObjects.Add(new MapObjectSerializedObjectAssociation(ship.GetComponent <MapObject>(), sp.mapObjectPersitance));
            }

            foreach (StationControllerPersistance scp in playerPersistance.stations)
            {
                GameObject station = Spawner.Instance.SpawnStation(scp.mapObjectPersitance.id, scp.stationType, playerPersistance.player, scp.mapObjectPersitance.localPosition, scp.mapObjectPersitance.localRotation, scp.constructionProgress, false);
                stations.Add(new GameObjectSerializedObjectAssociation <StationControllerPersistance>(station, scp));
                mapObjects.Add(new MapObjectSerializedObjectAssociation(station.GetComponent <MapObject>(), scp.mapObjectPersitance));
            }
        }

        foreach (GameObjectSerializedObjectAssociation <AsteroidFieldControllerPersistance> association in asteroidFields)
        {
            association.gameObject.GetComponent <AsteroidFieldController>().SetObject(association.serializedObject);
        }

        foreach (GameObjectSerializedObjectAssociation <AsteroidControllerPersistance> association in asteroids)
        {
            association.gameObject.GetComponent <AsteroidController>().SetObject(association.serializedObject);
        }

        foreach (GameObjectSerializedObjectAssociation <ShipControllerPersistance> association in ships)
        {
            ShipController shipController = association.gameObject.GetComponent <ShipController>();

            if (shipController.initialized)
            {
                shipController.SetObject(association.serializedObject);
            }
        }

        foreach (GameObjectSerializedObjectAssociation <StationControllerPersistance> association in stations)
        {
            association.gameObject.GetComponent <StationController>().SetObject(association.serializedObject);
        }

        foreach (GameObjectSerializedObjectAssociation <BulletControllerPersistance> association in bullets)
        {
            association.gameObject.GetComponent <BulletController>().SetObject(association.serializedObject);
        }

        PlayerDatabase.Instance.SetObject(gameSceneData.players);

        foreach (MapObjectSerializedObjectAssociation association in mapObjects)
        {
            association.mapObject.SetObject(association.serializedObject);

            association.mapObject.gameObject.SetActive(true);
        }

        Spawner.Instance.nextId = gameSceneData.nextMapObjectId;
        if (gameSceneData.shipConstructionManagerPersistance != null)
        {
            ShipConstructionManager.Instance.SetObject(gameSceneData.shipConstructionManagerPersistance);
        }

        MapObject[] trueMapObjects = GameObject.FindObjectsOfType <MapObject>();
        for (int i = 0; i < trueMapObjects.Length; i++)
        {
            FogOfWarUtility.SetRendering(false, trueMapObjects[i].gameObject);
        }
    }