Зомбоновости #1

Это первая запись в новом формате о ходе разработки игры Zombotron, поэтому я решил обнулить счетчик и изменить название. Сегодня поговорим об актуальном!

В прошлой записи я уже успел написать, что за ушедшее лето было сделано много, но похвастаться мне особо не чем — это совсем не значит, что вся проделанная работа ушла коту под хвост. Наоборот! Все очень даже замечательно и мне удалось продвинуться далеко вперед. Только как с наскоку продемонстрировать этот прогресс — мне не понятно, потому что визуально почти ничего не изменилось.

Так вот, по ходу дальнейших записей, время от времени я буду возвращаться к тому, что было сделано за лето и отдельно отмечать это, чтобы потом не было недопонимания вроде: «Ого! Как ты это сделал за неделю?!», или что-то вроде этого :)

Система частиц

Если вдруг кто не знает: на системе частиц обычно базируются все спец-эффекты в играх. ? новая система частиц для новой игры — это как раз то, чем я занимался в последнее время. Возникает справедливый вопрос: зачем я это делал, когда в Unity есть стандартная система частиц!?

Ответ очень простой: я не понял стандартной системы частиц Unity. Нет, конечно, же я её понял и разобрался, даже сделал несколько эффектов в ней. Но, что-то мне подсказывало, что стандартная система частиц в Unity создана явно не для художников и не художниками, а скорее программистами для галочки: чтобы было!

Что именно не так в системе частиц Unity — можно рассказывать долго. Я же напишу кратко: с ней все в порядке и её можно и нужно использовать. Просто я привык к большему и не смог найти и половины тех параметров, которые я так люблю. Далее несколько фактов, что именно не так:

Факт 1: Представьте себе простой эффект — горение факела или костра. Тут все просто, должны быть частицы огня и дыма, а для пущей убедительности можно еще и искр добавить. Но тут возникает такая штука: стандартная система частиц может работать только с одним видом частиц, то есть, чтобы создать огонь, дым и искры, нужно создать три системы частиц и настроить их. Неудобно, но терпимо!

Факт 2: Создал я три системы частицы для эффекта горения факела, а потом решил, что нужно разнообразить частицы 2-3 разновидностями. Но система частиц может работать только с одним видом частиц. То есть, хочешь вариаций, умножай количество систем частиц на количество вариаций, итого на одно только горение факела будет задействовано шесть систем частиц. А если захочется настройки какие подкрутить — придется править для каждой системы отдельно.

Факт 3: Когда пуля попадает в стену, от стены отламываются несколько кусочков и согласно физическим законам отскакивают от всего физического. Но до чего же скучно выглядит эффект, правда? Один и тот же камень падает по одной и той же траектории. Так не бывает! Но в стандартной системе нет никаких настроек, которые бы позволяли хоть как-то задавать случайность поведения партиклов.

Факт 4: ?того: для каждого эффекта нужно создать несколько систем частиц, настроить каждую, объединить их в префаб и положить куда-то в «ресурсы», чтобы воссоздать и воспроизвести эту красоту, когда случится знаменательное событие, дождаться завершения эффекта и убрать его куда-нибудь в пул — это все забота разработчика. То есть, используя стандартную систему частиц, все равно нужно писать свой менеджер эффектов, который будет следить за их работой.

Факт 5: Я очень люблю анимированные частицы — это когда каждый кадр жизни, каждой частички с любовью отрисован заранее. Но такой подход не популярен. ? чтобы засунуть в стандартную систему частиц Unity красиво анимированную частицу, нужно соблюдать некоторые условия: например, анимация каждой частицы должна быть отдельным атласом и иметь строго пропорциональные кадры. ? как итог: тут только на одних частицах получится по 100500 атласов, а как это все отразится на батчинге — я даже не проверял, наверное проблем с этим не будет, но ресурсов получится много.

В общем, стандартная система частиц Unity вполне себе годная для стандартного решения, но в идеале лучше сделать что-то свое, чтобы решить все недостатки и сделать поведение частиц уникальным и удобно настраиваемым.

Конечно, где своя система частиц, там должен быть и свой редактор для настройки этой системы с формированием библиотеки эффектов, с экспортом и импортом. А как сделать красивый и удобный редактор для системы частиц без редактора редакторов?!

Редактор редакторов

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

Задача простая: нужно удобно расположить окна ввода, текстовые метки и всякие кнопки. Как это сделать без редактора редакторов — я ума не приложу. Высчитывать и подгонять координаты каждой кнопки наугад, рисовать мокап окна на бумаге в клеточку? Да-ладно! Все гораздо проще: я быстро сделал ~~редактор редакторов~~ редактор форм.

Свое знакомство с программированием я начал с Delphi 5 и еще в нем раскладывал точно таким же образом различные компоненты для своих скромных поделок. Но в прогрессивном 2016 году такие редакторы больше никому не нужны! Зачем!? Ведь только от одной силы мысли разработчика, кнопки и поля ввода встают в нужные места. Во всяком случае, мне так показалось — когда я прочитал твиты вроде: «Зачем тебе это?»

Так выглядит окно редактирования формы в Delphi 5.

А еще знаете, что в 2016 году разработчикам что не нужно? Конечно, же ListView и TreeView! Ну во всяком случае так думают разработчики разработчиков. Ой простите, так думают разработчики Unity, а если в Unity так подумали, то и все остальные разработчики будут придерживаться этой точки зрения и обязательно уличат меня в использовании морально устаревших компонентов. ? всем пофиг, что сам Unity не брезгует в использовании этих удобных компонентов.

Пример само-писного TreeView в Unity который не доступен разработчикам.

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

Редактор системы частиц

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

Получилось все очень быстро и красиво. Единственное, что я не успел сделать за неделю, так это подготовить несколько полноценных пробных эффектов, которые бы отражали всю суть проделанной работы. Но это не критично. Делать абстрактные эффекты для демонстрации возможностей — это скучно и не интересно, к тому же пустая трата времени. Поэтому полноценно обкатать ханд-мэйд систему частиц удастся уже тогда, когда я подготовлю анимированные частицы для новой игры. То есть, в ближайшие 2-3 недели.

Принцип работы моей системы заключается в том, что она содержит Emitter — источник появления партиклов, который представляет собой стандартный GameObject с моим скриптом эффекта. Все вложенные в него эффекты-настройки являются лишь дата-компонентами, которые содержат в себе все необходимые настройки и они не доступны для просмотра и редактирования стандартными средствами Unity. В качестве частиц используются заранее настроенные GameObject сохраненные в Prefab. Таким образом, моя система частиц может пулять практически любыми игровыми объектами, даже стандартными системами частиц Unity!

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

В общем, мне удалось сделать полезные компоненты и разработать свою систему частиц на основе старых наработок. Как итог, теперь я могу быстро и удобно создавать новые эффекты с анимированными частицами, где кадры анимированных частиц могут быть легко объединены в один атлас. А как эта система проявит себя в будущем — покажет время! У меня есть еще несколько идей, как можно развить систему и какие новые настройки можно добавить, но пока это не настолько востребовано лично мной, поэтому дальнейшее развитие я отложил на потом.