Войти
ПрограммированиеФорумГрафика

Unity3D: как сделать пропадание/изменение травы на террейне?

#0
0:10, 11 июня 2019

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


#1
14:20, 11 июня 2019

https://docs.unity3d.com/ScriptReference/TerrainData.html

#2
17:50, 11 июня 2019

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

#3
(Правка: 18:15) 18:13, 11 июня 2019

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

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

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

#4
0:01, 12 июня 2019

Trey
> https://docs.unity3d.com/ScriptReference/TerrainData.html

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

#5
9:33, 12 июня 2019

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

#6
18:24, 12 июня 2019

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

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

#7
19:40, 12 июня 2019

Было бы конечно намного удобнее написать свою систему травы на шейдерах, чем мучаться с юнити, который на это не расчитан.
Создаёшь RenderTexture маску, белое - есть трава, чёрное - нет травы. UV текстуры пусть соотносятся с мировой XZ позицией. Корова каждый кадр пусть рисует квад с каким-нибудь пятнышком своим ртом в соответствующее место, мультипликативным блендом. Текстура не очищается, а постепенно зарисовывается ей.
Трава пусть состоит из больших шмотов-моделей по 100 пучков сразу, рисуй только несколько вокруг камеры. Шмоты в вертексном шейдере пусть читают карту высот и упомянутую маску. В принципе, можно даже совместить обе текстуры в одну (пусть корова просто понижает карту высот травы под собой).
Чтоб корова искала траву, создаёшь 2д массив (ту же самую маску) отдельно в C# и синхронно записываешь туда те же значения, что на GPU квадом. Сканишь ячейки вокруг коровы, пока не найдёшь какую-нибудь с травой. Корове необязательно быстро думать, так что сканирование можно растянуть на много кадров (например, каждый кадр только 100 клеток может проверить).

#8
13:14, 13 июня 2019

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

#9
0:35, 14 июня 2019

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

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

#10
(Правка: 4:31) 4:15, 14 июня 2019

pahaa, там не только коровы будут :)

Как узнать, что трава в клетке террейна находится за пределами навмеша? А то у меня корова идет к траве на склоне, на который не может залезть и тупит. Я пока нашел только вариант с юзанием функции NavMesh.FindClosestEdge и измерением расстояния от центра клетки террейна до NavMeshHit.position - если это расстояние больше длины половины клетки, то считать клетку недоступной.
Или юзать NavMesh.SamplePosition с дистанцией, равной длине половины клетки, и если он возвращает false то тоже считать клетку недоступной.
Но мне кажется что должен быть вариант проще и правильнее. Может быть, спрашивать у terrainData GetSteepness у клетки, и если она больше 45 градусов, то считать ее непроходимой?

ПрограммированиеФорумГрафика