Как сделать траву в unity

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Я новичок в юнити, поиском не нашел ответ на свой вопрос. Хочу, чтобы корова ходила по моему террейну и ела траву, при этом трава бы исчезала или превращалась в утоптанную. Я в курсе, что можно сделать траву из мешей, но тогда потребуется слишком много мешей для целого поля травы. Можно сделать генерацию мешей травы в поле видимости игрока, но мне нужно как-то учитывать, сколько травы съедено и вытоптано коровой в то время, пока игрок на нее не смотрит, и генерировать меши травы исходя из того, где трава реально должна быть. Может быть, есть какой-то более простой способ реализовать это? Типа поставить корове на рот какой нибудь коллайдер, попадая в который травинки бы исчезали с террейна? И как то инкрементировать кол-во исчезнувшей травы в переменную "насыщение коровы"?

Llevellyn
> И как то инкрементировать кол-во исчезнувшей травы в переменную "насыщение
> коровы"?
лучше сразу утилизация в какашки коровьи лепёшки

Llevellyn
> Типа поставить корове на рот какой нибудь коллайдер
адронный

самый дешевый с точки зрения производительности вариант это пустой грунт и таблички "вся трава поедена коровами"

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

Новичку самое то. Пока будешь разбираться, как устроен террейн, как его программно модифицировать, пока напишешь с нуля нечто работоспособное и не сильно тормозное, набьёшь столько шишек, что из полного новичка станешь любителем.

Llevellyn
> но тогда потребуется слишком много мешей для целого поля травы
Обычно так и делается. Большое кол-во геометрии не будет большой проблемой, если грамотно сделать батчинг(а если трава имеет однотипную текстуру, или даже несколько текстур с атласом - то её всю можно за один дип нарисовать).

Все, разобрался. Надо сначала теребить функцию terrainData.GetDetailLayer чтоб узнать кол-во травы под коровьим ртом, а потом terrainData.SetDetailLayer чтоб ее уменьшить/удалить. Я так понимаю что при каждом вызове SetDetailLayer трава
в клетке будет генериться по-новому, и спрайты встанут в других направлениях? Можно ли этого как-то избежать?

Также вопросно, как корове найти траву? Предполагаю, что простейшим вариантом будет, если корова будет запрашивать GetDetailLayer с площадью, скажем, 10х10 клеток, как-то находить в этом массиве координату ближайшей к ней травы и идти туда? А если в массиве одни нули, то запрашивать массив с бОльшей площадью в надежде что там что то будет? Как такой способ повлияет на производительность (если коров будет много, например)? Есть ли еще какие-то, более оптимальные способы?

Mr F
Интересно чем не устраивает редактирование TerrainData через код, которое делается в 20 строчек кода вместе с рассчетом позиции "рта коровы" на террейне.

Блин, какой кайфовый проект! Без шуток. Я б попилил игрулю про коров.

А по сабжу: да, стоит попробовать сначала через terrain data, и только если будет слишком медленно, то написать уже свои луга, с травой и коровами.

Отличительной чертой Unity является его гибкость, адаптивность к разработке как небольших 2D-паззлов или аркад, так и к разработке больших-серьезный стратегий, RPG или игр других жанров. В то же время, одной из парадигм Unity является простота освоения и удобство работы.

Создание ландшафта в Unity сравнимо с работой в редакторе ландшафта Warcraft 3. Немногим сложнее, зато предоставляются возможности по созданию действительной красивых ландшафтов.

Часть первая. С чего начать?

Начать следует, конечно, с установки и запуска редактора.
Процесс установки пропустим, так как он не вызовет затруднений ни у кого.
Итак, редактор запущен. Создаем или загружаем проект, в котором предстоит делать ландшафт. Если вы уверены, что не используете никаких ассетов с графикой, то следует выбрать ассет Environment из стандартной комплектации.
Следующее действие - добавить в проект этот самый "террейн", который будем создавать.
Для этого в верхнем (главном) меню выбираем GameObjects - > 3D Objects - > Terrain.

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

Часть вторая. И что это за кнопки?

Первый инструмент, на иконке которого изображены горы со стрелочкой вверх (и который выделен на рисунке бирюзовым)- это создание неровностей. Им можно создавать возвышения (кликнув на террейне в нужном месте) или впадины (то же самое, но с зажатым шифтом).
Обратите внимание , что для получения эффекта нужно настроить кисть - её форму, размер и "силу" (Opacity - непрозрачность).
Обратите внимание также, что для создания полноценных впадин террейн нужно сначала поднять. В противном случае ландшафт лишь выровняется до минимального уровня.
В этом уроке не будет рекомендаций по созданию красивого ландшафта. Не будет даже советов по использованию созданного ландшафта. Цель урока - помочь освоиться с базовыми функциями редактора и, может быть, помочь преодолеть так называемый "ступор незнакомого интерфейса", возникающий у многих людей при запуске незнакомой программы или знакомой с изменившимся интерфейсом.

Наверняка после недолгих экспериментов вы получили некие резкие перепады высот, которые смотрятся "не очень". Для их устранения нам поможет Smooth terrain, расположенный справа через одну. Выглядит он как всё та же горка с каплей воды рядом (На рисунке выделен желтым). Это отнюдь не создание воды, как может показаться. Это сглаживание.
Левее, кстати, расположен инструмент для создания плато ( выделен зеленым ) - он выравнивает высоту. Для захвата необходимой высоты зажимаем Shift, после чего "рисуем" плато без зажатого шифта.
Следующие инструменты позволяют наложить на ландшафт текстуры, расположить деревья и декорации. Последняя кнопка на этой панели - настройки.

Для добавления текстуры (иконка - кисть, выделена красным ), нужно сначала добавить тайлы. Ниже настроек кистей будет панель текстур. Нажимаем Edit textures - > Add texture и подбираем нужную (и как Normal, и как Smoothness) из списка предложенных (к слову, их можно добавлять самостоятельно, но об этом в другой раз). Для наглядности можно создать первой текстурой GrassRockyAlbedo, а второй - GrassHillAlbedo, после чего поэкспериментировать с настройками кисти и текстуры, порисовав травой.
Преимуществом Unity является обилие кистей и довольно высокая гибкость их настроек, что после небольшой практике позволяет с легкостью создавать интересные ландшафты с минимумом усилий.

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

Также, на панельке можно найти кнопку "Mass Place Trees", которая позволяет заполнить весь террейн указанным количеством деревьев.
Последний инструмент ( выделен синей рамкой) - расположение деталей, то есть всяческих украшений, вроде травы. Опять же, в изначальной поставке их не то, чтобы много.
К примеру, выбираем Edit Details -> Add Grass Texture и выбираем текстуру GrassFrond01AlbedoAlpha после чего испытываем её кистью.

Заключение

Создание ландшафта в Unity3D - это не трудно. Конечно, использование Unity не гарантирует запредельный уровень графики без приложения каких-либо усилий, да и модели и текстуры, вероятно, придется делать самостоятельно или с привлечением художников и 3D-артистов, искать в сети, либо покупать. Охватить все тонкости в рамках одной статьи решительно невозможно. Более того, статья рассматривает лишь одну грань работы с Unity.

Надеюсь, что она помогла абсолютным новичкам немного разобраться с интерфейсом и возможностями Unity.

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

— знакомимся с понятием текстура – texture

— добавляем на сцену новый 3D-объект Plane, который в играх часто используется в качестве плоскости пола.

— создаём новый материал с именем grass (трава), чтобы нанести его на Plane

— учимся позиционировать (размещать) объекты на сцене так, чтобы они хорошо был видны в окне Game при запуске игры или предварительном просмотре. Для этого регулируем положение (координаты и наклон) как самих объектов, так и камеры (Main Camera)

— узнаём о том, что лучше начинать создавать игровую локацию в начале координат (центре) сцены — ЭТО ВАЖНО!

— для быстрого обнуления координат объекта Plane используем инструмент Reset Position контекстного меню компонента Transform в окне Inspector. Аналогично можно обнулять координаты любого объекта

— знакомимся с возможностью переключения вида сцены на вид сверху для более удобного и быстрого перемещения объектов и сбоку для переориентации на сцене

— находим в интернете текстуру травы и используем её для соответствующего материала,

— настраиваем tiling (частоту повторяемости) текстуры в материале для большей реалистичности отображения.

Цикл уроков создан при поддержке компании Melsoft games.

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

Анимация внутри Unity

Что мы имеем - просто траву в несколько слоев для осуществления колыханий которой я решил подыскать соответствующую программу.

В первую очередь выбор пал на Anima2d - встроенный в Unity3d инструмент для костной анимации, который выглядел очень достойно, да и опыт работы с программой у меня уже был, ведь с помощью неё была реализована анимация главного героя

Повозившись пару часов в инструментарии, я таки заставил вполне лицеприятно колыхаться траву, но просадки FPS всё усугубили. Из-за плохой оптимизации, даже включение “костей” только в поле видимости игрока, не улучшало ситуацию, так что этот способ мне не подошел.

Анимация в DragonBones

Следующем вариантом был DragonBones – та же скелетная анимация, но с последующим портированием оной в Unity, что довольно трудоёмко – один поиск плагинов и подходящего Json чего стоят (о нём как-нибудь в другой раз).

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

Ручная покадровая рисовка

Кратко - спустя 12 нарисованных кадров, я понял, что этого очень мало для плавной анимации, так что осознав масштаб работы (3 слоя по 45-60кадров), я всё бросил.

Шейдеры

С самого начала было понятно, что этот вариант самый лучший - шейдеры мощная вещь и способна на многое, но увы для её освоения требуются много сил и навыков. Я попросту понятия не имею, что это такое и как оно работает. Сколько бы советов на формах не перечитал, сколько бы видео на ютубе не пересмотрел, все равно, эта тема остается для меня темной лошадкой.

В конечном счете я вернулся к изначальному варианту и оставил траву без анимации.

Читайте также: