Комментарии 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() с этим временем.
Проблема фона легко решается скайбоксом. Тогда не нужен будет отдельный спрайт в конце. Скайбокс даже можно сгенерировать нейронкой, а не рисовать самому.
Road Run, или как я свою первую игру делал. Часть 7