void OnEnable() { if (config == null) { throw new NullReferenceException("MasterConfiguration is not set in GameManager"); } else if (config.roomConfiguration == null) { throw new NullReferenceException("MasterConfiguration exists, but has no RoomConfiguration"); } else if (config.roomConfiguration.FirstRoom == null) { throw new NullReferenceException("First room is null. Is GlobalGameData set up correctly?"); } var startingScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); var startingRoomDefinition = SceneToRoom(startingScene); _currentRoom = startingRoomDefinition; _currentRoomManager = FindObjectOfType(typeof(BaseRoomManager)) as BaseRoomManager; if (Camera.main != null && _currentRoomManager != null) { Camera.main.backgroundColor = _currentRoomManager.cameraClearColor; } }
public void UnloadPreviousRoom() { if (_previousRoomManager == null) { return; } _previousRoomManager.gameObject.SetActive(false); //this is an async operation, but we don't really care when it finishes UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(_previousRoomManager.gameObject.scene); _previousRoomManager = null; }
public void LoadRoom(RoomDefinition room) { UnityEngine.Debug.Log("LoadRoom: " + (room != null ? room.name : "NULL")); if (room == null) { throw new ArgumentNullException("room"); } if (string.IsNullOrEmpty(room.scenePath)) { throw new ArgumentException("room must have a non-null path"); } _previousRoomManager = _currentRoomManager; _currentRoomManager = null; StartCoroutine(_LoadRoom_Inner(room)); }
IEnumerator _LoadRoom_Inner(RoomDefinition room) { var previousScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); //get the lighting settings for the current scene _previousLightingSettings = RoomLightingSettings.CreateFromCurrentRoom(); var loadOperation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(room.scenePath, UnityEngine.SceneManagement.LoadSceneMode.Additive); while (!loadOperation.isDone) { yield return(new WaitForEndOfFrame()); } //HACK-ish: do not break the "Assets/.../*.unity" convention for scenes // For whatever reason, the naming is very particular for GetSceneByPath() var nextScene = UnityEngine.SceneManagement.SceneManager.GetSceneByPath("Assets/" + room.scenePath + ".unity"); if (nextScene.IsValid()) { _hasTransitionedLightingForCurrentRoom = false; UnityEngine.SceneManagement.SceneManager.SetActiveScene(nextScene); //get the lighting settings for the current room _currentLightingSettings = RoomLightingSettings.CreateFromCurrentRoom(); RoomLightingSettings.Set(_previousLightingSettings, null); } else { _currentLightingSettings = _previousLightingSettings; } var allRoomManagers = FindObjectsOfType(typeof(BaseRoomManager)); foreach (var obj in allRoomManagers) { if (obj != null && (obj is BaseRoomManager)) { var man = (obj as BaseRoomManager); if (man != null && man.gameObject.scene.IsValid()) { if (man.gameObject.scene == nextScene) { _currentRoomManager = man; } else if (man.gameObject.scene == previousScene) { _previousRoomManager = man; } } } } _currentRoom = room; if (_previousRoomManager != null && _currentRoomManager != null) { float originalRoomYPosition = _currentRoomManager.transform.position.y; _currentRoomManager.transform.position = Vector3.up * (_previousRoomManager.topPlane.transform.position.y + (_currentRoomManager.transform.position.y - _currentRoomManager.bottomPlane.transform.position.y)); if (originalRoomYPosition != _currentRoomManager.transform.position.y) { UnityEngine.Debug.LogWarning("The Y-position for (" + _currentRoomManager.GetType().Name + ") does not correspond to its position as saved in the scene asset. The scene-manager will be moved, but objects marked as static may break."); } } }