{"id":2568,"title":"\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439 \u0438\u0437 \u00ab\u042f\u043d\u0434\u0435\u043a\u0441\u0430\u00bb \u0432 Google","url":"\/redirect?component=advertising&id=2568&url=https:\/\/vc.ru\/promo\/321806-kak-ne-zamorachivatsya-s-reklamnoy-kampaniey-i-bystro-nastroit-ee-v-google-obyasnyaem-v-5-50-i-500-slovah&placeBit=1&hash=842592b001f89eba8e751c8412550d4825bd0026e6df82eb3f2e06239bc3df51","isPaidAndBannersEnabled":false}
Инди
Шурик Потехин

Detective Stranding - дипломная работа для провинциальной шараги

Учась на четвёртом курсе одного из самых "престижных" колледжей моего родного города по специальности "программирование в компьютерных системах", передо мной встал вопрос "Что ты будешь делать на диплом?"

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

Начальный этап

В начале я решил разобраться, кто вообще будет участвовать в разработке. Команда у нас в итоге собралась из трёх человек:

  • Я занимался разработкой всей визуальной части игры, написанием сценария, геймдизайном и всем прочим.
  • Программист, который делал всю техническую часть игры.
  • Музыкант, который написал нам два трека (НО ЗАТО КАКИХ).

Разработка началась в Марте. Был определён сеттинг и стиль проекта, его движок и завязка.

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

Завязка проекта

Почему Unity, а не Ren'py

У нас уже были наработки механик визуальной новеллы в Unity и мы захотели их доработать. Это было основной причиной почему мы выбрали не Ren'py.

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

Схема истории из редактора Yarn Editor

Графическая часть

Самая большая проблема была с фонами, в конечном итоге мы пришли к выводу, что сделать самостоятельно мы их не можем. У меня был опыт разработки 2D окружения и я понял, что рисуя фоны в одиночку, мы не успеем выпустить продукт к сроку.

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

Пример обработки фотографии для фона

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

Внешний вид трёх персонажей

Геймплей

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

Одна из первых сцен

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

Программирование

да я знаю что код гавно

Программист

В конечном итоге

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

Во время всех защит никто из преподавателей не расспрашивал меня на счёт кода, хотя, я напомню, я учился на программиста, а по сути показывал проект, в котором я, как программист, практически не участвовал.

В итоге я защитил дипломную работу на пять просто показав и рассказав про игру.

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

Спасибо за внимание!

0
48 комментариев
Популярные
По порядку
Написать комментарий...
Террористический месяц

да я знаю что код гавно

По своему опыту скажу, что код для инди игр никогда не будет идеальным, так что говнокод это нормально, самое главное то что оно работает !!! 

26

Код в принципе не бывает идеальным, как говорится, сутра пишем код, вечером его рефакторим

19

Если код хотя бы вечером рефакторится, у него уже есть шанс стать нормальным.

Гораздо хуже бывает тогда, когда сначала пишут "на похуй, но чтобы работало", а потом продолжают таким же макаром дописывать весь остальной проект. Дописывать новых костылей приходится всё больше и больше, исходник превращается в огромную пирамиду говна с вершиной в жопе у программиста...
Так, а с чего я начал?

18

У хорошего программиста и говно-код читабельный и масштабируемый, как по мне :)
Хуже когда говнокодер пытается в хороший код и получается вообще черти что состоящее из десятков классов ненужных  которые наследуют друг друга и вызываются каждый друг в друге 🤡 условно прочитал про хорошую реализацию, а применить на практике не смог, и без опыта лепишь везде подряд ред.

5

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

8

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

4

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

12

Примем во внимание и возможно переименуем. Спасибо за отзыв

1

Парочка пожеланий:

- расскажите о том, что в коде кажется наиболее интересным, почему это было сделано так.
Ну или просто хоррор код-порно с объяснением почему ТАК делать не надо.

- добавьте персонажам моргание. Это очень сильно оживляет картинку, хотя по трудозатратам - достаточно дёшево.
В остальном персонажи вполне норм.

PS: если в сценарии есть лица с различными раздвоением личности (ПТСР, "шиза от белочки", шизофрения) - могу помочь с корректным описанием/составлением текста. Есть нюансы, которые нужно/можно показать так, что это будет хорошей инструкцией по работе/взаимодействию с такими людьми.

4

 расскажите о том, что в коде кажется наиболее интересным, почему это было сделано так

Лонгрид.
Первое что пришло на ум - жоподробительная система сохранений. Внутренний сериализатор то хорош, то на гавно похож. В данный момент например используется Newtonsoft Json для удобства  и по какой-то причине сохранять некий класс Yarn Spinner он адекватно может. А вот загружать уже нет.. Пикрил - недофикс данной проблемы, проверяющий наличие переменной либо удаляет ее если задается false.Так же в сохранении непонятно что делать с неубираемыми юнити данными и поэтому первое что пришло в голову - ужасный статик класс (https://github.com/cvertee/DetectiveStranding/blob/main/Assets/Scripts/Core/GameData.cs) с ПРЯМЫМ!!! доступом ко всем сохраняемым данным. DontDestroyOnLoad может наверное спасет ситуацию. Stay tuned как грица
Второе это предметы, на которые можно кликать. Делается это ужаснейшим способом через создание префабов с заскриптованными местами для клика как на втором пике (https://github.com/cvertee/DetectiveStranding/blob/main/Assets/Scripts/Game/ClickableItem.cs). Неудобно, но работает. А по другому в голову ничего и не пришло.
Третье - баги команды загрузки фона в диалогах. По какой-то причине (не помню какой именно) ломало все, кидало исключение и все в таком духе. Решением стало благословение от самих разрабов ярнспиннер а именно - блокируемая команда, которая бы лишь после загрузки фона сообщала о том что фон загружен и ярн бы стал выполнять следующие команды. https://github.com/cvertee/DetectiveStranding/blob/cf3ed06da31230b5f18d1184b9df60004937235d/Assets/Scripts/Game/Background.cs#L39
О блокируемых командах - https://yarnspinner.dev/docs/unity/working-with-commands/#adding-commands-through-code

7

Слушай, это звучит как три статьи)

С духом Старого Хабра, как говорится.
Только надо расписать покрасивее, типа "вот кусок кода, вот что он делает, а вот почему это кошмар"....

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

7

Возможно-возможно в #личныйопыт пойдет, думаю через время сохранения еще больше усложнятся вместе с ядром визуалки и будет целый эпос о том почему все-таки RenPy хех.

2

лучше писать "по горячим следам", иначе забудется.
Да и просто как "проработка опыта" и осмысление.

1

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

Очень классно, что вы сделали законченный проект, молодцы.

1

Не согласен.
Иногда лучше поддерживать код гомогенным, чтобы снизить когнитивную нагрузку.

в этом случае лучшим вариантом является использовнаие (isTrue) || (!isTrue).

0

Да, это правда, но так как писать bool == true довольно глупо, то это мотивирует отказаться от подобной записи и для фолса, но в таком случае можно не заметить восклицательный знак

1

но так как писать bool == true довольно глупо

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

Так же и здесь - есть причины, при которых такое написание является рациональным. Например, это следование единому паттерну оформления.

Но тут уже у кого какие травмы, конечно)
Кого за лишний перевод строки били, а кого за его отсутствие.

0

В ужасных тороплениях писал многие вещи, действительно надо перелопачивать

0

Аще забей.
Код обслуживать тебе, потому лучше писать так, как тебе удобнее и понятнее.
А то ещё тревогу словишь из-за ожидания UB, нафиг надо.

Опять же, я вот имею опыт в разных языках. И таки шо я вам скажу: в винде у с++ есть баг, при котором свежая булька имеет состояние "не_инициализирована". И она ни "true," ни "false".
И это я не говорю про питон, где можно пользоваться троичной логикой (True/None/False), что бывает удобно.

0

 Код обслуживать тебе

Ну это понятно, но когда дело доходит до портфолио - всем судя по вакансиям  в геймдеве нужный СОЛИДный целованный специалист который знает каждый паттерн и которому можно платить 500 баксов. Поэтому ввожу в привычку чистить код, чтобы потом спокойно писать таковой и показывать.

0

Ну, справедливо.

Хорошо быть на одном стеке технологий, легко привыкнуть)

1

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

1

Это если в апдейте.
Тут всё логично - проверка сцены на консистентность, только один раз используется.
Так что зависит от компонента, как часто он появляется.

Это вы ещё
if (1!=1){};

никогда не использовали.

0

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

0

во-первых, это тяжелая операция,

при инициализаци уровня это не столь важно.

если разработка ведется более чем 1 программистом

если

вы сами используете неудовлетворённую зависимость.

Хотя в таком раскладе да, нужно создавать менеджера, следящего за консистентностью как отдельный объект - тогда можно будет передать типа "вот он тут главный"
А ещё поглядывать на архитектуру и комментировать, но это уже другая тема.

0

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

В данный момент нет персонажей с такими заболеваниями, но спасибо зато, что предложили помощь, если что обратимся!

1

Отличная история, удачи в дальнейших твоих играх, или программах, смотря по какому пути пойдёшь 

3

Благодарим от всего сердца!

0

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

2

Благодарим от всего сердца! Вам тоже удачи! 

0

А зачем на шарагу то выебывается, если никто так и не доебался?

1

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

1

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

1

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

2

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

А можно поподробнее, какие редакторы и стили рисовки рассматривались? И почему остановились именно на топаз студио?

1

Остановились на Топазе потому что у него был бесплатный триал на месяц и понравились его эффекты. На мой взгляд он лучше всего имитирует рисовку, которую чаще всего используют в визуальных новеллах и полнометражных аниме (там используют обработанные 3D болванки). К примеру могу привести стиль Макото Синкая, именно к нему я пытался подобраться как можно ближе.

Со стилем персонажей, как можно заметить, я не совсем определился, если на них внимательно посмотреть, то они все немного разные. Рассматривались стили из других новелл, например из Феникса Райта или просто банальный анимешный стиль из какого-нибудь Sunrider.

Из ПО рассматривали фотошоп, FotoSketcher и прочие проги, которые можно посмотреть из запроса в гугле. Топаз увидел на стриме у одного художника. 

1

Понял, спасибо за развернутый ответ)

1

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

У художников которые этим занимаются часто можно прямо паком купить персонажей и под себя собрать.
Что-то типо такого:

1
Террористический месяц

Yarn каким-то образом облегчил работу с диалогами?

0

Йеп. На самом деле очень даже приятная либа для работы с диалогами. Приходилось конечно модифицировать немного чтобы разделяло строки на имя персонажа и фразы. Но в остальном все есть в интеграции, команды легко можно добавлять либо через атрибуты либо адским методом (https://github.com/cvertee/DetectiveStranding/blob/cf3ed06da31230b5f18d1184b9df60004937235d/Assets/Scripts/DialogueManager.cs)
По поводу документации - супер годно объясняет основы, но почему-то куда-то вглубь авторы положили кучу годных вещей.
Самый больной минус - официальные тулзы супер медленно поддерживаются, еле-еле лично пинал разрабов чтоб фиксили ИХ ЖЕ продукт которым они пользовались каждый день (при разработке ночи в лесу). В ужасно раннем доступе, но в целом работают.

2
Террористический месяц

Понятно. Спасибо за объяснение.

1

а где видео проекта? трейлер? прохождение? не всем хочется скачивать, а просто мимолетно оценить  =)

0

Оу. Видео то было, просто сейчас переделывается под новую версию. Раньше в итче было такое

1

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

В Фотошопе есть целая галерея фильтров, среди которых сразу несколько дадут результат если не идентичный, то ОЧЕНЬ похожий. Так что не понятно, зачем были эти поиски.

0

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

0

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

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

2

Вы молодцы, получилось очень круто за такой то срок.
А я в ренпае все ручками делаю ориентируясь на майнд мэп в смартфоне(рил жопная боль).
Такую штуку как у вас к ренпаю не прикрутить? Для оптимизации процесса

0

Сами диалоги? Можно но нужно переписывать до чертиков всего, автоматизатора пока особо нет.

0
Читать все 48 комментариев
null