Как рандомизировать сцены с помощью синглтона?C#

Место общения программистов 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, и этот файл находился на холсте каждой сцены.

Что я упускаю или делаю неправильно? Какой еще подход мне следует попробовать?

Любая помощь приветствуется.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»