コード例 #1
0
        public void Load(IEnumerable <string> sceneNames, LoadStreamMode loadStreamMode = LoadStreamMode.Default)
        {
            if (isLoading)
            {
                Debug.LogErrorFormat("Cannot load! Loading in progress.");
                return;
            }

            m_activeSceneName = null;
            m_thread          = StartCoroutine(LoadThread(sceneNames, loadStreamMode));
        }
コード例 #2
0
        public void Reset(LoadStreamMode loadStreamMode = LoadStreamMode.Default)
        {
            if (isLoading)
            {
                Debug.LogErrorFormat("Cannot reset! Loading in progress.");
                return;
            }

            m_activeSceneName = SceneManager.GetActiveScene().name;
            m_thread          = StartCoroutine(LoadThread(m_loadedSceneNames, loadStreamMode, true));
        }
コード例 #3
0
        protected virtual IEnumerator LoadThread(IEnumerable <string> sceneNames, LoadStreamMode loadStreamMode = LoadStreamMode.Default, bool reset = false)
        {
            isLoading    = true;
            m_operations = new List <AsyncOperation>();

            // Wait until all blockers are finished
            while (m_blockers.Any(x => x.blocking))
            {
                yield return(null);
            }

            // Find scene names to be unloaded
            var unloadedSceneNames = reset
                                ? m_loadedSceneNames
                                     // Skip any scenes included in next state
                                : m_loadedSceneNames.Except(sceneNames);

            // Unload previous scenes
            foreach (var sceneName in unloadedSceneNames.Distinct())
            {
                m_operations.Add(SceneManager.UnloadSceneAsync(sceneName));
            }

            // Remove null operations
            m_operations = m_operations.Where(x => x != null).ToList();

            // Wait until all scenes are unloaded
            while (m_operations.Any(x => !x.isDone))
            {
                value = CalcValue();
                yield return(null);
            }
            value = 0.5f;

            // Clear operations
            m_operations = new List <AsyncOperation>();

            // Find scene names to be loaded
            var loadedSceneNames = reset
                                ? sceneNames
                                   // Skip any scenes included in previous state
                                : sceneNames.Except(m_loadedSceneNames);

            // Start loading scenes
            foreach (var sceneName in loadedSceneNames)
            {
                if (SceneManager.GetSceneByName(sceneName) != null)
                {
                    var operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
                    if ((!m_autoLoad && loadStreamMode == LoadStreamMode.Default) || loadStreamMode == LoadStreamMode.ManualLoad)
                    {
                        operation.allowSceneActivation = false;
                    }

                    m_operations.Add(operation);
                }
            }

            // Wait until all scenes are loaded
            while (m_operations.Any(x => !x.isDone))
            {
                value = CalcValue() + 0.5f;
                if (((!m_autoLoad && loadStreamMode == LoadStreamMode.Default) || loadStreamMode == LoadStreamMode.ManualLoad) && m_operations.All(x => x.progress >= 0.9f))
                {
                    isReady = true;
                    if (isActivated)
                    {
                        m_operations.ForEach(x => x.allowSceneActivation = true);
                    }
                }

                yield return(null);
            }
            value = 1f;

            // Remember loaded scenes
            m_loadedSceneNames = sceneNames.ToList();
            isLoading          = false;
        }
コード例 #4
0
 public void Load(string sceneName, LoadStreamMode loadStreamMode = LoadStreamMode.Default)
 {
     Load(new[] { sceneName }, loadStreamMode);
 }