39

Как это сделано в видео играх

Я разрабатываю мобильную игру со стилем Low Poly на движке Unity3D, в которой автомобиль должен уклоняться и объезжать препятствия, с другими элементами подобного геймплея.
Сегодня я поделюсь с вами способами реализации некоторых игровых функций.

Искры от столкновения с препятствием.
Я использую это для визуального обозначения игроку, что он столкнулся с объектом.
Как это выглядит:

На объект, к которому прикреплён основной коллайдер автомобиля,

Как это сделано в видео играх Gamedev, Секреты игр, Гифка, Длиннопост, Мобильные игры

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

Как это сделано в видео играх Gamedev, Секреты игр, Гифка, Длиннопост, Мобильные игры

Визуализация чистки дороги от снега.
Выглядит это так:

Начнём с сугробов которые образуются за ковшом, для их реализации я использую две системы частиц, которые испускают частицы с режимом отображения Mesh (Сетка), в них указанны заранее подготовленные модели сугробов. Появление частиц, сугробов, происходит при условии, что объект перемещается.
К ковш автомобиля имеет два триггера, которые при входе в триггер снега, запускают системы частиц, при выходе останавливают.

Как это сделано в видео играх Gamedev, Секреты игр, Гифка, Длиннопост, Мобильные игры

С этим понятно, а теперь как убрать из отображения снег, в зоне из которой его условно убрали.
Для этого использую Trail, он оставляет линию по ходу движения. В нём назначен материал, со специальным шейдером. Принцип действия тут прост, в материале снега указана очередь рендера выше, чем у всех других объектов. В материале который имеет Trail, указана очередь рендера ниже чем у снега, но выше чем у всех остальных объектов. При перекрытии снега, линией от Trail, будет отображено всё что находиться под снегом.
Шейдер выглядит так:

Как это сделано в видео играх Gamedev, Секреты игр, Гифка, Длиннопост, Мобильные игры

Спасибо за внимание.
Кому стало интересно, следить за развитием игры можно в группе ВК: https://vk.com/gwtgo

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

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

раскрыть ветку (6)
2
Автор поста оценил этот комментарий

Там ещё и collision.other.tag надо сначала проверять и запускать foreach только если условие выполняется.

Да уж, в умелых руках даже крестики-нолики можно заставить тормозить на топовом железе.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Да, дофига лишней нагрузки. Зачем там вообще foreach не понятно, достаточно было бы прицепить какой-то определённый источник частиц (или два, или три) и на нем воспроизводить частицы при столкновении, причем при on collision enter, а не stay. Выглядело бы не так реалистично, конечно (искры не всегда там где идёт столкновение), но в плане оптимизации сильно лучше. А двигать систему частиц каждый кадр это ппц мне кажнтсч

раскрыть ветку (2)
Автор поста оценил этот комментарий

Ахахахахахахахааххахахаахаххаахаа, ты хоть понял что сказал? Ты бы ещё выдал, что нибудь на подобрее этого: "А двигать (Иггрока/Машину/Самолёт) каждый кадр это ппц мне кажнтсч"

Автор поста оценил этот комментарий

Тебе самому не стыдно такую чушь нести?

Автор поста оценил этот комментарий

А а, справка в комментарие кода, по этому методу гласит обратное https://docs.unity3d.com/ScriptReference/Collider.OnCollisio...

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Она ничего обратного не гласит. Тут надо понять как в итоге отрисуется кадр. Порядок такой: сначала код перебирает весь массив точек столкновения, к каждой из них передвигает систему частиц и вызывает Play() (который сработает только в следующем кадре).

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

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

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку