Существует множество туториалов о том, как создавать виртуальные 3D-ландшафты, я даже вчера написал один. Но мне еще предстоит найти какие-либо учебные пособия, которые покажут вам, как заполнить эту местность процедурными растениями, камнями, деревьями и некоторыми другими причудливыми вещами. Все эти заводы будут построены с использованием гибкой и простой в использовании архитектуры. Это позволит дизайнерам в вашей команде быстро прототипировать изменения растительности, не беспокоя вас. Все это будет сделано в Unity, но, как и в других моих руководствах, вы можете легко перенести код на любой другой язык. Итак, без лишних слов, давайте приступим!

Это будет серия учебных пособий; в этой части я покажу вам, как настроить системы, чтобы у вас была отправная точка для будущих руководств. В следующих нескольких статьях я расскажу вам, как сгенерировать растения, камни и деревья.

Построение системы

Во-первых, мы должны создать новый класс, известный как «VegetationObject». Этот класс будет работать как базовый класс или, говоря простым языком, как пример для других классов, которые могут быть смоделированы по его образцу. Этот класс будет содержать функции и переменные, которые дочерние классы будут наследовать автоматически. Это может значительно упростить нашу жизнь, потому что позволяет гораздо больше модульности с различными частями растительности, которые можно создать.

Внутри класса VegetationObject мы собираемся объявить переменную и пару функций. Нам нужна строка с именем VegetationName; эта строка будет использоваться для упрощения организации для дизайнеров, которые будут создавать множество различных объектов и должны будут отслеживать их. Кроме того, нам понадобится несколько разных функций — я расскажу о них ниже. Внутренности функций — это просто заполнители для дочерних классов, которые мы создадим в будущих руководствах, поэтому обратите внимание, что они будут генерировать только замещающую плоскость со случайным цветом. Когда вы настраиваете функции, помните, что вам нужно сделать их виртуальными, чтобы другие классы могли их переопределить.

ГенерироватьМатериал

Функция GenerateMaterial принимает целое число в качестве аргумента и выводит Материал. Целое число представляет индекс, которым будет материал при рендеринге на объекте. Это позволит нашей растительности иметь несколько материалов, что полезно в случае с деревьями, которые состоят из двух отдельных частей.

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

Код этой функции будет показан ниже — он просто сгенерирует материал по умолчанию для плоскости, сгенерированной функцией GenerateMesh. Таким образом, программирование функции достаточно очевидно. Сначала мы создаем материал из пустого шейдера. Мы хотим, чтобы цвета на кубе генерировались случайным образом, поэтому нам нужно установить параметр цвета материала на новый цвет со случайным оттенком.

Генерировать сетку

Для функции GenerateMesh нам не нужно вводить какие-либо входные данные, но нам нужно будет вывести новую сетку. Эта новая сетка будет тем, что компьютер отображает на экране, с применением материала из предыдущей функции.

Для нашего примера класса сетка будет простой трехмерной плоскостью, поэтому код для нее будет довольно статичным. Просто чтобы оживить ситуацию — мы будем генерировать случайную высоту и ширину для плоскостей, чтобы они выглядели хоть немного интересно.

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

Вот и все! (Сейчас)

Это все, что у меня есть для вас сегодня, но завтра я планирую показать вам, как создавать кусты. В следующие несколько дней я надеюсь покрыть камни, деревья, кусты и другие растения.

Чтобы получать уведомления, когда я публикую эти статьи, подпишитесь на мою учетную запись на Medium и хлопните в ладоши этой статье. Вы можете не осознавать, насколько это помогает, но это очень помогает. Так что, а пока, спасибо, что дочитали до этого места, и хорошего дня!