Всем привет!
Сегодня расскажу о том, как я делал деревья для своей игры. Так как у меня полностью процедурно генерируемый рогалик, то и деревья должны быть такими же!
Я не старался сделать самые красивые и правдоподобные деревья в игровой индустрии, т.к. мало того что работаю один, так ещё и есть сомнения что unity смог бы это съесть.
Поэтому к деревьям были немного иные требования:
- Деревья можно срубить и получить с них древесину, чтобы скрафтить себе костер и не умереть от холода;
- Раз деревья рубят, то они должны и расти;
- Деревья должны быть разнообразными.
На этом я остановился по хотелкам и приступил к работе. Чтобы процедурно генерировать деревья, надо для начала определить их структуру:
- Основной ствол (большой и могучий)
- Ветки (большие, средние, маленькие)
- Кусты с зеленью
Основной ствол и ветки генерируются похожим образом: у них есть заранее заготовленный материал с текстурой (вроде березы или сосны), который натягивается на процедурно генерируемый меш.
Для построения меша сначала генерируется основа - ломаная линия. Далее от каждой точки основы создаются точки меша по шестиугольнику. В зависимости от толщины ветки этот шестиугольник умножается на коэффициент. После чего все точки соединяются в треугольники. Это достаточно просто, так как точки добавляются последовательно, и на каждом шагу известно что +1 это следующая точка против часовой стрелки, а +6 это точка сверху над текущей.
Фрагменты растительности же я "отрисовал" заранее для каждого типа дерева. На самом деле просто смоделировал высоко детализированные ветки в блендере и запек их.
Итак, у нас есть фундамент с помощью которого можно сгенерировать какое-то дерево. Но деревьев много и они разные, у них много различных параметров, начиная от продолжительности роста и максимальной высоты, до частоты ветвления и углов между ветками. И тут на выручку приходят конфиги! Все конфиги я храню в таблицах, которые импортируются потом в json.
На этом моменте можно было бы сказать, что кот в шляпе и можно идти отдыхать, но не тут то было! Хоть в моей игре и можно перемещаться исключительно влево-вправо по типу платформера, но деревья же растут не только на "игровой дорожке", но и на фоне. А это значит, что нужны менее детализированные варианты деревьев на фон.
Самые ближние отличаются от своих старших родителей тем, что не имеют никакого разрушения и процесса роста. Они просто есть. С отдалением от камеры уменьшается количество веток, количество полигонов и детализация текстурок, но формирование происходит по-прежнему из генератора. Самые дальние деревья же состоят исключительно из билбордов, которые имеют несколько вариации на каждый тип дерева. Подобная система лодов позволяет размещать достаточно большое (около 2 тысяч) количество деревьев без просадок фпсов.
Вот на этом моменте можно считать деревья практически законченными. Есть ещё всякие разные механики по типу разрушения деревьев, но там особо нечего рассказывать, там просто создается дубликат верхней части дерева и соответственно меши пересчитываются таким образом, что у верхней части верх, а у нижней (внезапно!) низ. Таким образом, кстати, обрубленный пень с некоторым шансом может продолжить расти.
В качестве выводов могу добавить то, что лично мне понравилось полученное. Деревья выглядят достаточно разнообразными, умеют расти в реальном и ломаться. А что ещё нужно от жизни?
Если Вам интересно почитать ещё что-то про мою игру, то можете глянуть предыдущие посты из серии или заглянуть в группу вк, в которой я гораздо чаще и подробнее делюсь подробностями разработки: https://vk.com/voidside_game