private void UnoadGameLevel(GameLevel level)
        {
            string levelName = level.Name;

            LevelParametrs levelParam = _levelSetups.Find((param) => param.Name.Equals(levelName));

            Debug.Assert(levelParam != null);

            Scene scene = SceneLoader.GetSceneByName(levelParam.SceneName);

            if (!scene.isLoaded)
            {
                Debug.LogAssertion("Level is already unloaded! Level name: " + level.Name);
                return;
            }

            level.OnStartUnloading();

            switch (levelParam.UnloadMode)
            {
            case UnloadType.Disactivate:

                foreach (var go in scene.GetRootGameObjects())
                {
                    go.SetActive(false);
                }

                level.LevelObjects = null;
                level.OnFinishUnloading();
                break;

            case UnloadType.UnloadAndDestroy:
                StartCoroutine(SceneLoader.UnloadSceneAsync(
                                   levelParam.SceneName,
                                   (() =>
                {
                    level.LevelObjects = null;
                    level.OnFinishUnloading();
                })));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private void LoadGameLevel(GameLevel level)
        {
            string levelName = level.Name;

            LevelParametrs levelParam = _levelSetups.Find((param) => param.Name.Equals(levelName));

            Debug.Assert(levelParam != null);

            // Проверим, не загружен ли уже данный уровень
            // Если в LevelParametrs стоит Disactivate mode и уровень уже загружен, значит просто активируем его

            Scene scene = SceneLoader.GetSceneByName(levelParam.SceneName);

            if (scene.isLoaded)
            {
                switch (levelParam.UnloadMode)
                {
                case UnloadType.UnloadAndDestroy:
                    Debug.LogAssertion("Level is already loaded! Level name: " + level.Name);
                    break;

                case UnloadType.Disactivate:
                {
                    level.OnStartLoading();

                    foreach (var go in scene.GetRootGameObjects())
                    {
                        go.SetActive(true);
                    }

                    if (levelParam.SetActiveOnLoad)
                    {
                        SceneLoader.SetSceneActiveByName(levelParam.SceneName);
                    }

                    level.OnFinishLoading();
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            else
            {
                level.OnStartLoading();

                if (levelParam.LoadAsync)
                {
                    StartCoroutine(SceneLoader.LoadSceneAsync(
                                       levelParam.SceneName,
                                       levelParam.Additive,
                                       levelParam.SetActiveOnLoad,
                                       () =>
                    {
                        level.LevelObjects = SceneLoader.GetSceneByName(levelParam.SceneName).GetRootGameObjects();
                        level.OnFinishLoading();
                    }));
                }
                else
                {
                    StartCoroutine(SceneLoader.LoadScene(
                                       levelParam.SceneName,
                                       levelParam.Additive,
                                       (() =>
                    {
                        level.LevelObjects = SceneLoader.GetSceneByName(levelParam.SceneName).GetRootGameObjects();
                        level.OnFinishLoading();
                    })
                                       ));
                }
            }
        }