/// <summary>
        /// Load the scene.
        /// </summary>
        /// <param name="scene">Scene.</param>
        /// <param name="sceneData">Data.</param>
        /// <param name="additiveLoadScenes">Additive load scenes.</param>
        /// <param name="autoTransition">If set to <c>true</c> auto move.</param>
        public static void LoadScene(EScenes scene, SceneDataPackBase sceneData = null, EScenes[] additiveLoadScenes = null, bool autoTransition = true)
        {
            // Send default scene data.
            if (sceneData == null)
            {
                sceneData = new SceneDataPackBase(TransitionManagerInstance.CurrentGameScene, additiveLoadScenes);
            }

            TransitionManagerInstance.StartTransition(scene, sceneData, additiveLoadScenes, autoTransition);
        }
        /// <summary>
        /// Starts the transition.
        /// </summary>
        /// <param name="nextScene">Next scene.</param>
        /// <param name="sceneData">Scene data.</param>
        /// <param name="additiveLoadScenes">Additive load scenes.</param>
        /// <param name="autoTransition">If set to <c>true</c> auto transition.</param>
        public void StartTransition(
            EScenes nextScene,
            SceneDataPackBase sceneData,
            EScenes[] additiveLoadScenes,
            bool autoTransition
            )
        {
            if (isRunning)
            {
                return;
            }

            StartCoroutine(TransitionCoroutine(nextScene, sceneData, additiveLoadScenes, autoTransition));
        }
        /// <summary>
        /// Transition coroutine.
        /// </summary>
        /// <returns>The coroutine.</returns>
        /// <param name="nextScene">Next scene.</param>
        /// <param name="sceneData">Scene data.</param>
        /// <param name="additiveLoadScenes">Additive load scenes.</param>
        /// <param name="autoTransition">If set to <c>true</c> auto transition.</param>
        private IEnumerator TransitionCoroutine(
            EScenes nextScene,
            SceneDataPackBase sceneData,
            EScenes[] additiveLoadScenes,
            bool autoTransition
            )
        {
            isRunning = true;

            CanEndTransition.Value = autoTransition;

            if (fade == null)
            {
                Initialize();
                yield return(null);
            }

            // Start transition.
            fade.FadeIn(1.0f);

            // Wait for transition animation.
            yield return(onTransitionFinishedInternal.FirstOrDefault().ToYieldInstruction());

            // Set data what gave by previous scene.
            SceneLoader.PreviousSceneData = sceneData;

            // Load main scene as single scene.
            yield return(SceneManager.LoadSceneAsync(nextScene.ToString(), LoadSceneMode.Single));

            // Load sub scenes.
            if (additiveLoadScenes != null)
            {
                yield return(additiveLoadScenes.Select(scene =>
                                                       SceneManager.LoadSceneAsync((int)scene, LoadSceneMode.Additive)
                                                       .AsObservable()).WhenAll().ToYieldInstruction());
            }
            yield return(null);

            // Release unused assets memories.
            Resources.UnloadUnusedAssets();
            GC.Collect();

            yield return(null);

            // Set current scene.
            currentGameScene = nextScene;

            // Publish notification of scene loaded.
            onAllSceneLoaded.OnNext(Unit.Default);

            if (!autoTransition)
            {
                // Wait for OpenLoadedNextScene function.
                yield return(CanEndTransition.FirstOrDefault(x => x).ToYieldInstruction());
            }

            CanEndTransition.Value = false;


            // Start fadeout animation.
            fade.FadeOut(1.0f);

            // Wait for completed to open fade.
            yield return(onTransitionFinishedInternal.FirstOrDefault().ToYieldInstruction());

            // Publish notification of finished scene transition.
            onTransitionAnimationFinishedSubject.OnNext(Unit.Default);

            isRunning = false;
        }