Призыв о помощи: Проблемы с процедурной генерацией

Всем привет, осваиваю Unity и работаю над проектом с процедурной генерацией, но столкнулся с парой проблем, которые у меня не получается решить собственными силами. Захотелось ими поделиться - вдруг кто-нибудь из вас уже с ней сталкивался?

Благодаря ютубу мне удалось откопать нужный скрипт процедурной генерации, который помог мне реализовать саму концепцию. Скрипт отличный, ролик рекомендую, тк несмотря на 2017, большинство команд не outdated и скрипт работает именно так, как заявлено в ролике, я проверил.

Только вот сам автор ролика тоже где-то нашел этот скрипт. И также как и я не очень понимает как этот скрипт работает, но попытался адаптировать его.

ссылка на файлы автора ролика

Трабл №1: Скрипт Player Zero или рендеринг освещения и объектов при длительном путешествии

Конечно, сделать прям бесконечную игру с бесконечной и адекватной генерацией всего это очень сложная задача для новичка в программировании.

Однако в данном случае речь идет об одном скрипте который должен был помочь и обнулять позицию игрока на карте, чтобы движку не нужно было рендерить новые области, сам игрок вроде бы бежит но остается на месте:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerZero : MonoBehaviour { [SerializeField] private TerrainController terrainController; [SerializeField] private float distance = 10; private void Update() { if (Vector3.Distance(Vector3.zero, transform.position) > distance) { terrainController.Level.position -= transform.position; transform.position = Vector3.zero;//only necessary if player isn't a child of the level } } }

И, при применении этого кода к моему проекту, он выдает такой результат:

Если это важно (мне кажется да), в моем стеке проекта есть только:
1. Game Creator и с помощью которого было реализовано управление и камера
2. Procedural Kit.
3. Скрипты из видеоролика.

Так что сам проект достаточно чистый, чтобы минимизировать количество областей, из-за которых могла случиться такая проблема.

Трабл №2: Вытаскивание объекта процедурной генерации в область взаимодействия игрока

Все процедурные тайли и объекты после спавна остаются таковыми — и даже если объект генерации "взять с собой" — то при достижении определенного расстояния, этот объект исчезает. А если возвращаешься на это расстояние - появляется.

Тут скорее вопрос: правильно ли я понимаю, что для решения этой проблемы имеет смысл создать массив для объектов, которые забирает игрок и данную проблему можно решить делая дубликат объекта?

Мол, вот ты столкнулся с процедурной генерацией, однако когда ты это сделал - один объект исчез, а на его месте появился другой, который тебя не бросит, если ты пройдешь 1000 метров.

Трабл №3 Текстуры шума

Это уже конечно совсем акт беспомощности, думаю с этим я точно разберусь сам.

Но мало ли мб покажете куда смотреть искать настройки импорта текстур, чтобы их можно было считывать скриптом, т.к. при замене нойза с Перлина на любой другой 2д шум, скрипт выдает такую ошибку:

Призыв о помощи: Проблемы с процедурной генерацией

Спасибо за внимание!

Уверен, для большинства здешних читателей которые работают с Unity — проблемы могут показаться примитивными. И, наверное, я могу их решить собственными силами если немного помучаюсь, в этом ведь суть программирования.

Однако, ничего не могу поделать с тем, что у меня внутри что-то откликнулось выставить эти вопросы на обсуждение) И поделиться роликом с хорошим рабочим скриптом, в этом есть определенная польза, как мне кажется!

Буду рад любым ответам, помогити плз.

44
23 комментария

Задача актуальна еще? Если так, то могу завтра закинуть скрипт с генератором ландшафта и объяснением его работы) 

1
Ответить

да, давай! будет оч круто, спасибо большое!

тот что есть террейн работает, но я искренне не знаю пока как такой ландшафт разнообразить - шум конечно работает, однако в его результате появляется хаотичный, но однотипный ландшафт и у меня случается тупик знания, могу только разнообразить ландшафт добавляя в него объекты, от деревьев и доп гор, неровностей

Ответить

Однако в данном случае речь идет об одном скрипте который должен был помочь и обнулять позицию игрока на карте,

Лучше этого не делать, особенно если есть физические объекты на карте. 

1
Ответить

хм, получается, лучше не трогать координаты игрока или сделать луп но без постоянного обнуления?

допустим если игрок достигает координаты Х 100, то его следующий шаг будет Х -100, а террейн новым тк он меняется при передвижении игрока

Ответить

В целом рекомендую сделать на основе террейна (просто большого), не использовать выключение отдаленных элементов ландшафта и все такое, террейн сам это нормально умеет делать. Объекты на карту расставить отдельно, после генерации и вот их уже выключать и включать при приближении (а лучше использовать просто лоды).

1
Ответить

вот по поводу этого интересно очень! тк у меня со спаунерами решение оказалось в целом эффективным и я вот думаю, тут либо рил отдельно расставлять объекты на карту (но как они будут считывать геометрию террейна?) и ставить их какнибудь высоко чтобы они при генерации террейна перед игроком - падали под воздействием гравитации или были с рейкастом который искал бы поверхность для появления

или

сделать как в том скрипте филд для расположения объектов на террейне? чтобы раскидывать рандомом спаунеры, которые создавали бы интерактивные объекты вроде людей, корованов и тд

Ответить

 при замене нойза с Перлина на любой другой 2д шум, скрипт выдает такую ошибку:

И в этой ошибке написано, как ее решить. В настройках импорта текстуры нужно поставить галку read/write enabled 

1
Ответить