Как рандомизировать сцены с помощью синглтона? ⇐ C#
-
Гость
Как рандомизировать сцены с помощью синглтона?
У меня в настройках сборки 9 сцен, но я хочу использовать только сцены с индексом от 2 до 8, поэтому я составил список, содержащий эти числа (sceneOrder). Я также хочу, чтобы сцены следовали друг за другом случайным образом, поэтому есть метод перетасовки. Кроме того, я не хочу, чтобы они повторялись, поэтому я удаляю из списка текущий «загружаемый» индекс сборки.
Есть кнопка, которая появляется в каждой сцене через определенное время и при нажатии на нее должна загрузиться следующая сцена в соответствии с перетасованным списком (sceneOrder).
По предложению друга я сделал синглтон-класс для списка на основе этого видео. (Я не совсем знаком с шаблонами проектирования, я только начал их изучать.)
Но когда я пытаюсь запустить код, он работает только для первой кнопки, после этого он зависает в этой сцене.
Код MenuContoller устанавливается для каждого холста в каждой сцене, а метод nextSceneRandom() устанавливается для кнопок OnCliCk().
с использованием System.Collections; использование System.Collections.Generic; использование UnityEngine; использование UnityEngine.SceneManagement; Открытый класс MenuController: MonoBehaviour { общественный недействительный nextSceneRandom () { ИНТ NextSceneIndex = 0; активныйИндексСцены(); Debug.Log("Количество сцен: " + RandomScenes.instance.sceneOrder.Count); если (RandomScenes.instance.sceneOrder.Count > 0) { Debug.Log("sceneOrder[0]: " + RandomScenes.instance.sceneOrder[0]); nextSceneIndex = RandomScenes.instance.sceneOrder[0]; RandomScenes.instance.sceneOrder.RemoveAt(0); Debug.Log("после удаления, SceneOrder[0] (следующая сцена): " + RandomScenes.instance.sceneOrder[0]); SceneManager.LoadScene(nextSceneIndex, LoadSceneMode.Single); } еще { Debug.Log("------------------- Все сцены были воспроизведены. --------------------" ); } } общественный недействительный onlyFirstButton () { RandomScenes.instance.setSceneOrder(); } } Код RandomScenes устанавливает игровой объект в каждой сцене:
с использованием System.Collections; использование System.Collections.Generic; использование UnityEngine; публичный класс RandomScenes: MonoBehaviour { общедоступный статический экземпляр RandomScenes; общественный список SceneOrder; частная пустота Пробуждение () { экземпляр = это; DontDestroyOnLoad(this.gameObject); } общественный недействительный setSceneOrder () { SceneOrder = новый список {2, 3, 4, 5, 6, 7, 8}; for (int t = 0; t < SceneOrder.Count; t++) { int tmp = SceneOrder[t]; int r = Random.Range(t, SceneOrder.Count); SceneOrder[t] = SceneOrder[r]; SceneOrder[r] = tmp; } for (int i = 0; i < SceneOrder.Count; i++) { Debug.Log("Порядок списка сцен: " + i + ". индекс сборки сцены: " + SceneOrder); } } } И я получу это, если запущу код: войти
Первоначально, до использования одноэлементного подхода, я получал аналогичную ошибку. Отличие заключалось в том, что список SceneOrder был у меня в файле MenuController, и этот файл находился на холсте каждой сцены.
Что я упускаю или делаю неправильно? Какой еще подход мне следует попробовать?
Любая помощь приветствуется.
У меня в настройках сборки 9 сцен, но я хочу использовать только сцены с индексом от 2 до 8, поэтому я составил список, содержащий эти числа (sceneOrder). Я также хочу, чтобы сцены следовали друг за другом случайным образом, поэтому есть метод перетасовки. Кроме того, я не хочу, чтобы они повторялись, поэтому я удаляю из списка текущий «загружаемый» индекс сборки.
Есть кнопка, которая появляется в каждой сцене через определенное время и при нажатии на нее должна загрузиться следующая сцена в соответствии с перетасованным списком (sceneOrder).
По предложению друга я сделал синглтон-класс для списка на основе этого видео. (Я не совсем знаком с шаблонами проектирования, я только начал их изучать.)
Но когда я пытаюсь запустить код, он работает только для первой кнопки, после этого он зависает в этой сцене.
Код MenuContoller устанавливается для каждого холста в каждой сцене, а метод nextSceneRandom() устанавливается для кнопок OnCliCk().
с использованием System.Collections; использование System.Collections.Generic; использование UnityEngine; использование UnityEngine.SceneManagement; Открытый класс MenuController: MonoBehaviour { общественный недействительный nextSceneRandom () { ИНТ NextSceneIndex = 0; активныйИндексСцены(); Debug.Log("Количество сцен: " + RandomScenes.instance.sceneOrder.Count); если (RandomScenes.instance.sceneOrder.Count > 0) { Debug.Log("sceneOrder[0]: " + RandomScenes.instance.sceneOrder[0]); nextSceneIndex = RandomScenes.instance.sceneOrder[0]; RandomScenes.instance.sceneOrder.RemoveAt(0); Debug.Log("после удаления, SceneOrder[0] (следующая сцена): " + RandomScenes.instance.sceneOrder[0]); SceneManager.LoadScene(nextSceneIndex, LoadSceneMode.Single); } еще { Debug.Log("------------------- Все сцены были воспроизведены. --------------------" ); } } общественный недействительный onlyFirstButton () { RandomScenes.instance.setSceneOrder(); } } Код RandomScenes устанавливает игровой объект в каждой сцене:
с использованием System.Collections; использование System.Collections.Generic; использование UnityEngine; публичный класс RandomScenes: MonoBehaviour { общедоступный статический экземпляр RandomScenes; общественный список SceneOrder; частная пустота Пробуждение () { экземпляр = это; DontDestroyOnLoad(this.gameObject); } общественный недействительный setSceneOrder () { SceneOrder = новый список {2, 3, 4, 5, 6, 7, 8}; for (int t = 0; t < SceneOrder.Count; t++) { int tmp = SceneOrder[t]; int r = Random.Range(t, SceneOrder.Count); SceneOrder[t] = SceneOrder[r]; SceneOrder[r] = tmp; } for (int i = 0; i < SceneOrder.Count; i++) { Debug.Log("Порядок списка сцен: " + i + ". индекс сборки сцены: " + SceneOrder); } } } И я получу это, если запущу код: войти
Первоначально, до использования одноэлементного подхода, я получал аналогичную ошибку. Отличие заключалось в том, что список SceneOrder был у меня в файле MenuController, и этот файл находился на холсте каждой сцены.
Что я упускаю или делаю неправильно? Какой еще подход мне следует попробовать?
Любая помощь приветствуется.
Мобильная версия