コード例 #1
0
    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;
        }
    }
コード例 #2
0
    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;
    }
コード例 #3
0
    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));
    }
コード例 #4
0
    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.");
            }
        }
    }