Дневник дилетанта. Часть 2. Реализация.
В предыдущих постах я подробно описал, почему мы делаем игру и какая идея была признана достаточно интересной, чтобы перейти к ее реализации.
Поэтому теперь поговорим о непосредственно создании нашего шедевра казуальной игроиндустрии.
Так как я являюсь дизайнером, немного пиарщиком (смотри ссылки выше) и идейным вдохновителем, но уж никак не программистом, эту часть повествования я передаю
в профессиональные руки Mozg00FF. Чтобы было проще и никто не запутался, его слова будут выделены.
Платформа
Почему Unity спросите вы? Если коротко, то так сложилось. До этого я пробовал разные платформы и способы создания игр. Например, тот же Bomberman, упомянутый в первом посте, был написан полностью на WinApi с использование Directx 11. Это был интересный опыт, но слишком трудоёмкий.
Пробовал пользоваться Unreal Engine, но он мне не очень понравился в связи с тем, что после хоть какого-то опыта использования Unity он мне казался дико неудобным. Возможно, сейчас я пересмотрел бы свои взгляды, но в данный момент я ещё больше привык к Unity и уже вряд ли начну пользоваться чем-то другим без серьёзных на то причин.
Изначально же Unity была выбрана как популярная платформа с достаточно большим комьюнити, которое позволяло быстро и просто научиться ею пользоваться.
У меня нет многолетнего опыта использования Unity, поэтому не буду утверждать, что надо делать так, как делал я. Данная статья скорее будет рассказом о том, как те или иные вещи сделаны у нас.
Фон
Итак. Начало разработки, на мониторе пустой проект и надо с чего-то начинать. В первую очередь поезд должен ехать, а если точнее, то поезд как раз стоит на месте, а вот фон едет. Значит, делаем фон. Мой предыдущий опыт использования Unity показал, что для того, чтобы впоследствии разработка не превратилась в ад, нужно делать максимально универсальные, независимые объекты, которые будут выполнять одну конкретную функцию.
Первым кирпичиком в постройке нашего приложения стали холмы фона. Нужно было как-то генерировать деревья на них. Первая проблема заключалась в том, что холмы имеют
не прямоугольную форму, а висящие в воздухе деревья нас не устраивают. Соответственно, нельзя просто взять и сгенерировать деревья рандомно. После поиска возможных вариантов решения генерация была сделана следующим образом:
1) К объекту холма добавляем компонент Polygon Collider 2D. Этот компонент позволяет получить точную форму холма.
2) В настройках объекта создаем два параметра minTreeCount и maxTreeCount, которые задают границы количества случайно генерируемых деревьев.
3) Далее в цикле генерируем случайные точки на холме, и проверяем попали ли они в наш коллайдер. Если точка попала, то генерируем в ней дерево.
В результате получалось нечто такое:
Иногда, конечно, холмы генерировались красиво, а иногда так, как на этой картинке. Как можно заметить — верхнее дерево находится поверх нижнего, что выглядит как минимум странно.
Да и густой лес слишком сильно загружает картинку деталями. В итоге, мы вместе посмотрели на эту генерацию и решили, что такой вариант нас всё же не устраивает.
Перед нами возникла проблема, как генерировать деревья так, чтобы они не налезали друг
на друга, и при этом всё это красиво генерировалось. Не знаю, насколько придуманное мною решение является классическим для таких ситуаций, но генерацию я сделал следующим образом.
На холм я добавил 4 простых спрайта, которые обозначают зоны генерации деревьев
по горизонтали:
Для поддержания порядка эти зоны были добавлены в пустой объект с названием SpawnZones и визуально отключены, так как их отрисовка нам в игре не нужна. В итоге структура объекта выглядит следующим образом:
Теперь переходим к генерации самих деревьев.
1) При создании объекта, ищем среди потомков объект с названием SpawnZones. В нём перебираем всех потомков и считаем их количество. Количество деревьев на холме будет
по-прежнему в переделах от minTreeCount и до maxTreeCount, но не больше, чем количество зон генерации.
2) Определившись с количество деревьев на холме, случайно выбираем зоны, в которых будут сгенерированы объекты.
3) Для каждой зоны генерируем дерево. Это происходит так же, за исключением того,
что пределы генерации точек по X выбираются по границам зоны, а по Y — по координатам верхней и нижней границы коллайдера.
4) После того, как деревья сгенерированы — удаляем ранее найденный объект SpawnZones
для того, чтобы не разводить лишних объектов в процессе работы игры.
На этом можно было бы закончить, но если уж делать универсальные холмы, то они всё равно должны быть немного более рандомными. Поэтому добавляем параметры, отвечающие за размеры холма и деревьев. В итоге в инспекторе такой холм полностью настраивается и удобно используется в дальнейшем:
В итоге получаем вот такие случайно сгенерированные холмы:
На сегодня закончим.
Если технические подробности пришлись вам по вкусу, то пишите и спрашивайте, ТРЕБУЙТЕ еще.
В следующий четверг мы обсудим сложное движение фона, проблемы проектирования
и на закуску — приятные фишечки поезда, придающие игре индивидуальность.





Лига Разработчиков Видеоигр
9.9K пост23.4K подписчика
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"