Как стать автором
Обновить

Комментарии 2

В прошлый раз я закончил свой рассказ

в этом месте должна быть ссылка на прошлый материал.

Код всего класса RandomExtractor целиком приведён ниже.

Зачем так сложно? Кладём все сегменты в список, перемешиваем его и идём по списку возвращая сегменты по одному. Как дошли до конца - снова перемешиваем

	IEnumerator getSegment<T>(T[] segments) {
		List<T> segmentsList = new List<T>(segments);
		while (true) {
			shuffle(segmentsList);
			foreach(T value in segmentsList)
				yield return value;
		}
	}

...
// Получение случайного значения. Каждый вызов iterator.MoveNext() 
// будет присваиваьит iterator.Current новое случайное значение
var iterator = getSegment<int>(new int[] { 1, 2, 3 });
iterator.MoveNext();
Debug.Log(iterator.Current);

Код функции shuffle можно найти например тут, там строк 10 от силы.

В целом, если скорость движения игрока постоянна, то нам достаточно просто создавать новые сегменты каждые X секунд (например, через StartCoroutine), а не замерять расстояние в каждом апдейте. Если хотим ставить сегменты прям идеально - можно держать ссылку на последний созданный и спавнить новый в N метрах от него. Удаление - также: мы знаем скорость, а значит, знаем за какое время сегмент окажется за камерой и станет не нужен. Сразу после его создания вызываем Destroy() с этим временем.

Проблема фона легко решается скайбоксом. Тогда не нужен будет отдельный спрайт в конце. Скайбокс даже можно сгенерировать нейронкой, а не рисовать самому.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории