コード例 #1
0
        public ZoneLoader ChangeZone(ZoneData to, bool waitForConnections)
        {
            var from   = CurrentZone;
            var loader = new ZoneLoader {
                IsDone = false
            };

            if (from != null)
            {
                LeaveZone(from, to);
            }

            if (to != null)
            {
                if (to.Status == ZoneStatus.Loaded && !waitForConnections)
                {
                    EnterLoadedZone(loader, to, from);
                }
                else
                {
                    StartCoroutine(EnterUnloadedZone(loader, from, to, waitForConnections));
                }
            }
            else
            {
                loader.IsDone = true;
            }

            return(loader);
        }
コード例 #2
0
        private IEnumerator UnloadZone(ZoneData data)
        {
            if (data.Status != ZoneStatus.Loaded)
            {
                Debug.LogFormat("attempting to unload zone {0} which is not loaded", data.Zone.name);
                yield break;
            }

            data.Status = ZoneStatus.Unloading;
            data.LoadedState.Reset();
            _loadedZones.Remove(data);

            var loader = SceneManager.UnloadSceneAsync(data.SceneIndex);

            if (loader == null)
            {
                Debug.LogFormat("failed to unload zone {0}", data.Zone.name);
                yield break;
            }

            while (!loader.isDone)
            {
                yield return(null);
            }

            data.Status = ZoneStatus.Unloaded;
        }
コード例 #3
0
        private IEnumerator EnterUnloadedZone(ZoneLoader loader, ZoneData from, ZoneData to, bool waitForConnections)
        {
            Pause();

            if (to.Status == ZoneStatus.Unloaded || to.Status == ZoneStatus.Unloading)
            {
                yield return(StartCoroutine(LoadZone(to)));
            }

            while (to.Status == ZoneStatus.Loading)
            {
                yield return(null);
            }

            if (waitForConnections)
            {
                yield return(StartCoroutine(LoadConnections(to, from)));
            }
            else
            {
                StartCoroutine(LoadConnections(to, from));
            }

            EnterZone(to, from);
            Unpause();
            loader.IsDone = true;
        }
コード例 #4
0
        private IEnumerator LoadConnections(ZoneData to, ZoneData from)
        {
            foreach (var index in to.Connections)
            {
                var data = Zones[index];

                if (data.Status == ZoneStatus.Unloaded || data.Status == ZoneStatus.Unloading)
                {
                    StartCoroutine(LoadZone(data));
                }
            }

            while (_pendingLoads > 0)
            {
                yield return(null);
            }

            foreach (var loadedZone in _loadedZones)
            {
                var objects = loadedZone.Zone.Scene.Scene.GetRootGameObjects();

                foreach (var obj in objects)
                {
                    obj.SetActive(loadedZone.Zone.MapLayer == to.Zone.MapLayer);
                }
            }
        }
コード例 #5
0
ファイル: WorldStateWindow.cs プロジェクト: larsolm/Archives
 public PlayerSelection(ZoneData zone)
 {
     Zone            = zone;
     PersistentStore = new VariableStoreControl(zone.PersistentState, zone.Zone.name, "", true, true);
     SessionStore    = new VariableStoreControl(zone.SessionState, zone.Zone.name, "", true, true);
     LoadedStore     = new VariableStoreControl(zone.LoadedState, zone.Zone.name, "", true, true);
     ActiveStore     = new VariableStoreControl(zone.ActiveState, zone.Zone.name, "", true, true);
 }
コード例 #6
0
        protected override void OnAwake()
        {
            Zones = new ZoneData[SceneManager.sceneCountInBuildSettings];

            foreach (var zone in World.Zones)
            {
                Zones[zone.Scene.Index] = new ZoneData(zone);
            }
        }
コード例 #7
0
        private void UnloadConnections(ZoneData from, ZoneData to)
        {
            foreach (var index in from.Connections)
            {
                var data = Zones[index];

                if (to == null || (data != to && !to.Connections.Contains(data.SceneIndex)))
                {
                    StartCoroutine(UnloadZone(data));
                }
            }

            if (to == null || !to.Connections.Contains(from.SceneIndex))
            {
                StartCoroutine(UnloadZone(from));
            }
        }
コード例 #8
0
        private IEnumerator LoadZone(ZoneData data)
        {
            while (data.Status == ZoneStatus.Unloading)
            {
                yield return(null);
            }

            if (data.Status != ZoneStatus.Unloaded)
            {
                Debug.LogFormat("failed to load zone {0}: the zone is already loaded", data.Zone.name);
                yield break;
            }

            var loader = SceneManager.LoadSceneAsync(data.Zone.Scene.Index, LoadSceneMode.Additive);

            if (loader == null)
            {
                Debug.LogFormat("failed to load zone {0}: the zone has not been assigned a scene", data.Zone.name);
                yield break;
            }

            _pendingLoads++;
            data.Status = ZoneStatus.Loading;

            while (!loader.isDone)
            {
                yield return(null);
            }

            if (data.Tilemap == null)
            {
                Debug.LogFormat("failed to load zone {0}: the zone does not contain MapProperties", data.Zone.name);
                SceneManager.UnloadSceneAsync(data.SceneIndex);
                data.Status = ZoneStatus.Unloaded;
            }
            else
            {
                data.Status = ZoneStatus.Loaded;
                _loadedZones.Add(data);
            }

            _pendingLoads--;
        }
コード例 #9
0
        private void EnterZone(ZoneData to, ZoneData from)
        {
            if (to == CurrentZone)
            {
                Debug.LogFormat("attempting to enter zone {0} but it is already CurrentZone", from.Zone.name);
                return;
            }

            if (to.Zone.BackgroundMusic != null && (from == null || to.Zone.BackgroundMusic != from.Zone.BackgroundMusic))
            {
                AudioManager.Instance.Push(to.Zone.BackgroundMusic, 1.0f, 1.0f, 1.0f);
            }

            SceneManager.SetActiveScene(to.Zone.Scene.Scene);
            CurrentZone = to;

            if (OnZoneEntered != null)
            {
                OnZoneEntered(to);
            }
        }
コード例 #10
0
        private IEnumerator TransitionZone(ZoneLoader loader, ZoneData to, string spawnName, Transition transition, bool waitForConnections)
        {
            Player.Instance.Controller.Freeze();

            yield return(StartCoroutine(TransitionManager.Instance.StartTransition(transition)));

            var zoneLoader = ChangeZone(to, false);

            yield return(StartCoroutine(TransitionManager.Instance.ObscureTransition()));

            while (!zoneLoader.IsDone)
            {
                yield return(null);
            }

            var spawn = to.GetSpawnPoint(spawnName);

            Player.Instance.Mover.WarpToPosition(spawn.Position, spawn.Direction, spawn.Layer);

            yield return(StartCoroutine(TransitionManager.Instance.FinishTransition()));

            Player.Instance.Controller.Thaw();
            loader.IsDone = true;
        }
コード例 #11
0
        private void LeaveZone(ZoneData from, ZoneData to)
        {
            if (from != CurrentZone)
            {
                Debug.LogFormat("attempting to leave zone {0} but CurrentZone is {1}", from.Zone.name, CurrentZone.Zone.name);
                return;
            }

            if (OnZoneLeft != null)
            {
                OnZoneLeft(from);
            }

            CurrentZone = null;
            SceneManager.SetActiveScene(gameObject.scene);

            UnloadConnections(from, to);
            from.ActiveState.Reset();

            if (from.Zone.BackgroundMusic != null && (to == null || from.Zone.BackgroundMusic != to.Zone.BackgroundMusic))
            {
                AudioManager.Instance.Pop(1.0f, 1.0f, 1.0f);
            }
        }
コード例 #12
0
ファイル: WorldStateWindow.cs プロジェクト: larsolm/Archives
 private void CurrentZoneChanged(ZoneData zone)
 {
     _loadPending = true;
     Repaint();
 }
コード例 #13
0
ファイル: WorldStateWindow.cs プロジェクト: larsolm/Archives
 public void AddToSelection(ZoneData zone)
 {
     _playerSelections.Add(new PlayerSelection(zone));
 }
コード例 #14
0
 private bool IsInZone(Mover mover, ZoneData zone)
 {
     return(zone.Zone.MapLayer == CurrentZone.Zone.MapLayer &&
            zone.Tilemap.Bounds.Contains(mover.CurrentGridPosition));
 }
コード例 #15
0
 private void EnterLoadedZone(ZoneLoader loader, ZoneData to, ZoneData from)
 {
     StartCoroutine(LoadConnections(to, from));
     EnterZone(to, from);
     loader.IsDone = true;
 }
コード例 #16
0
 protected virtual void OnZoneEntered(ZoneData zone)
 {
     Mover.SetCurrentZone(zone);
     Mover.OccupyCurrentTiles();
 }
コード例 #17
0
 protected virtual void OnZoneLeft(ZoneData zone)
 {
     Mover.UnoccupyCurrentTiles();
     Mover.SetCurrentZone(null);
 }
コード例 #18
0
 public void SetCurrentZone(ZoneData zone)
 {
     CurrentZone = zone;
 }