Как я разрабатываю игру без опыта #5. Переработка дизайна и механик

- Зачем ты показываешь свой код всем идиот, твою игру взломают!?

- Ахаха, если взломают - значит игра хоть чуть-чуть, но успешна и стоит усилий взлома!

Часть 1, Часть 2, Часть 3, Часть 4


- Статистика страницы игры в Steam в конце поста.


Более 10 дней прошло с момента написания прошлого поста, хотя планировал писать каждые 2 дня по факту процесса разработки. Все эти дни был максимально погружен в редизайн и механики игры - чтоб не быть похожим. Так сделал работу над ошибками и изучил способ разделение кода скрипта на составляющие дабы не плодить 20+ тысяч строк.


В том числе старался больше работать потому, что игра должны была выйти в Steam еще 19го марта. А вспомнил я об этом только 18го марта днем - как же я пере**ался. В панике начал писать в поддержку с просьбой отодвинуть срок выпуска, особо без надежды, так как отвечает поддержка не всегда сразу. Однако мне повезло и мне ответили через 4 часа с одобрением на перенос срока выпуска игры. Было бы довольно плохо, если люди купили игру, а там одно меню и все...


И так. Что мы имеем спустя 10 дней "работы":

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Что касается части механик игры:

1) Строительство объектов вынесено из диалогов в отдельный пункт меню "Строительство". Чтоб не отвлекать игрока от основного повествования.

2) Добавлен новый ресурс и способ добычи - Камень. Необходим для ремонта поселений, а так же для строительства особой защиты от бури.

3) На рассмотрение добавлен новый ресурс - войска/стражники. Для совершения нападений на соседние королевства, а так же для разбавления механики защиты короля от покушений (если мало защитников осталось после войн - защитить короля они не смогут в определенных случаях)

3) 2 варианта защиты от непогоды - постоянная и дорогая, одноразовая и дешевая (вместо одного).

4) Сокращение вариантов погодных факторов до 1 (буря с ветром и дождем), но буря может начаться совершенно неожиданно и только эффект дождя в текущий день будет намеком на бурю следующей ночью.

5) Рандомизация добычи ресурсов - игрок получает не фиксированное количество ресурсов с добычи каждый день - где-то больше, где-то меньше. В одну игру может повезти и хватить на все, в другую игру придется сильно экономить и чем-то жертвовать (ибо игрок должен страдать)

6) Возможность разрушения построек с целью получения золота. (Единственный возможный вариант конвертации ресурсов в золото)

7) Возможность ремонта поселений после разрушения бурями.
8) Исключение из интерфейса каких либо подсказок и перенос их в диалог с советником, где он рассказывает - сколько стоит построить шахту или как вообще начать строить. Как мне кажется - для большего погружения в игру.

9) Возможность строительства объектов добычи еды и воды внутри селений для исключения затрат ресурсов на строительство объектов добычи за пределами селений и / или увеличения объема добычи.

10) Ограниченный выбор на добычу камня или золота - всего 5 шахт, но что они будут добывать, зависит от выбора игрока.

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

Так выглядит игровой интерфейс в итоговом варианте:

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Так же, слегка изменилась цветовая палитра. Добавлено два полутона для большего разбега в детализации (самому смешно) объектов. Точками помечены новые цвета в палитре.

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Кстати, по какой-то причине меняется гамма при сохранении изображений в Photoshop. Два одинаковых дома покрашены одинаково и выведены в PNG, но при повторном открытии файла и повторном перекрашивании этими же цветами - гамма отличается в итоге (более бледной становится).

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование
Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Вот список всех используемых наборов "асетов" в игре с ссылками на них:


1) Дома, лесопилки, горки камня и слитков у рудников, тележки рудников, мельницы, колодцы, мосты, рыбные станции, лодки, трава, дороги - PixelHole https://pixelhole.itch.io/pixelholes-overworld-tileset

2) Факелы в поселениях - OcO https://oco.itch.io/medieval-fantasy-props-pack

3) Заборы поселений - rowdy41 https://rowdy41.itch.io/small-forest

4) Скалы, шахты, ступеньки - finalbossblues https://finalbossblues.itch.io/dark-dimension-tileset

5) Защита от бури постоянная - Jestan https://jestan.itch.io/classic-rpg

6) Защита от бури временная - Arktentrion https://arktentrion.itch.io/2d-rpg-kit-the-game

7) Деревья - ansimuz https://ansimuz.itch.io/patreons-top-down-collection

8) Вода - Szadi art. https://szadiart.itch.io/craftland-demo

9) Портреты персонажей - Exuin https://emily2.itch.io/pixel-portraits-32x32

10) Эффект строительства - ansimuz https://ansimuz.itch.io/explosion-animations-pack

11) Иконки ресурсов - Kyrise https://kyrise.itch.io/kyrises-free-16x16-rpg-icon-pack и VECTORPIXELSTAR https://vectorpixelstar.itch.io/food

12) Кирпичная кладка по контуру диалога - Alcoholism https://alcoholism.itch.io/dark-castle-tileset

13) Шрифт (на данный момент) - Poppy Works https://poppyworks.itch.io/silver

14) Музыка - Tim Beek https://timbeek.itch.io/royalty-free-music-pack


Все остальное (очень малое) было собственноручно и мучительно прорисовано и анимировано.

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

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Окей думаю я, вперед, обновляйся.

Обновился...

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

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

Теперь о коде игры. Господа программисты и разработчики, вэлком унижать автора :)


Все таки начал делить один большой скрипт на составляющие. И теперь это аж 11 файлов скриптов :)

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Но по порядку с главного меню:


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

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

И соответственно скрипта с методами с запуском этих анимаций в событии нажатия соответствующих кнопок. А так же для кнопок выхода из игры метод Application.Quit(); и для запуска игры в методе Update условие - при появлении панели на позиции 0, запуск сцены игры методом SceneManager.LoadScene();

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Если кому-то будет нужна / интересна информация о создании кнопок, простых анимаций изменения состояния, добавления функций при нажатии кнопок - напишите, я распишу отдельно подробно.

Основной код в скрипте главного меню отведен для меню настроек - выбор языка, разрешения экрана, громкости музыки и эффектов. По этому пункту очень подробно расписано тут https://www.red-gate.com/simple-talk/dotnet/c-programming/how-to-create-a-settings-menu-in-unity/ В принципе весь код для меню настроек я взял оттуда, только еще не разобрался - почему в списке всех доступных разрешений, все пункты дублируются. Есть мысль попробовать перенести цикл в метод Awake() вместо Start(), но это позже.


Теперь то, что успел накодить с игровым процессом


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


2) Кнопки справа от диалога - Строительство, новый день, настройки и выход. Если кнопки настройки и выход плюс-минус понятны из предыдущего абзаца, то кнопка нового дня так же как в главном меню - запускает анимацию шторки и отнимает единицу от счетчика дней внизу-справа экрана. А вот кнопка строительства уже интереснее - она вызывает меню строительства объектов добычи ресурсов и собственно этот же скрипт отвечает за все строительство.

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Однако код так же просто и содержит так же одни "ИФЫ" :). Все объекты добычи в игре объявлены и пронумерованы в этом скрипте и изначально при старте отключены в иерархии юнити. При нажатии на кнопку с определенным объектом скрипт проверяет по порядку каждый объект этого типа (всего 5 для каждого из ресурсов) и при нахождении какого-либо в выключенном состоянии - включает его. А в методе Update() происходит покадровая проверка для дизактивации кнопки при обнаружении отсутствия отключенных в иерархии объектов этой кнопки, а так же при недостаточном количестве ресурсов для постройки.

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

3) Разрушение объектов обрабатывается через 2 скрипта - один отвечает за подсветку объекта при наведении на него и открытии меню объекта при нажатии, второй за нажатие на кнопку и отключение объекта

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

С кнопкой отключения / разрушения объекта все очень просто - 2 метода OnMouseEnter и OnMouseExit для смены спрайта кнопки при наведении мыши и метод OnMouseDown для отключения объявленного в скрипте объекта и самой кнопки из иерархии.


С кнопкой подсветки и появления меню строения я помучился, а именно над подсветкой. Unity почему-то никак не хотел принимать new Color(), а начал адекватно работать только с new Color32 - информацию по этому нашел тут https://answers.unity.com/questions/1017582/hex-colors-in-unity.html (подкрашивается цвет спрайта поверх него). И те же самые методы OnMouse

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

4) Ремонт поселений производится по такому же принципу и коду как и разрушение, за одним исключением - целевой объект не отключается, а включается т.к. спрайт поселения у меня лежит поверх спрайта разрушенного поселения и идентичен ему (просто стерт частично в фотошопе)


5) Имеется в запасе скрипт для тултипов ресурсов - при наведении на кнопку строительства объекта над цифрой ресурсов появляется подсказка о стоимости постройки

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

Скрипт сделан похожим на OnMouseEnter, только через Event Trigger. В инспекторе объекта нажимать Add Component - Event Trigger - Add New Event Type - PointerEnter и Pointer Exit и далее так же как с кнопкой - пишем метод на включение и метод на отключение объекта в иерархии и выбираем в Event Trigger скрипт и соответствующий метод (если нужно кому-то подробнее, то я так же распишу как и с кнопками, и анимациями).


Но так же я нашел очень подробный видео урок как сделать тултипы в более правильном их формате тут https://www.youtube.com/watch?v=HXFoUGw7eKk

6) Ну и скрипт для дрожания камеры при начале бури. Скрипт взят из видео урока тут https://www.youtube.com/watch?v=9A9yj8KnM8c

P.S. Для тех кому интересно как обстоят дела со страницей игры в магазине. Ситуация так себе. Чуть более чем за месяц, страницу показало 41,991 человек. Из них посетило страницу 4,655 человек, что соответствует 11.09% переходов. В список желаний игру добавили 156 человек

Как я разрабатываю игру без опыта #5. Переработка дизайна и механик Игры, Разработчики игр, Компьютерные игры, Unity, Своими руками, Гифка, Длиннопост, Графика, Программирование

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


Спасибо вам большое, за то, что прочитали этот бред рукожопа :)

Лига Разработчиков Видеоигр

6.6K постов22.1K подписчиков

Добавить пост

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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

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

бля... там хотяб фотографии были:D  ты типа решил усложнить, вообще кусок текста написал :D Хуясе челенж кншн... я не знаю, по этому тексту я нихуя не понял, не то, что ответить понял ты или нет Х_Х Суровый ты, всё-таки, человек...

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Хорошо, буду разбираться и пробовать. Если не получится напишу что ни**я не работает и все **вно)
показать ответы
1
Автор поста оценил этот комментарий

* DestroyResource (орфографическая ошибка)
* метод Start можно убрать (полностью, переменные типа bool по-умолчанию инициализируется в false, если не указано иное)
* SpriteRenderer стоит вынести в переменную, и, либо задать вручную через поле в инспекторе, либо закешировать при инициализации скрипта, чтобы в дальнейшем обращаться просто spriteRenderer.color, а не вот это вот всё.
*  Для цветов так же стоит создать переменные, чтобы в случае чего легко поменять цвет через инспектор
*

builMenu.SetActive = !isActive;
isActive = !isActive;

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Спасибо за подсказку, попробую изменить. По поводу орфографической ошибки - мой английский вери бэд. Как Вам такое?)
Иллюстрация к комментарию
показать ответы
2
Автор поста оценил этот комментарий

не стыдно чего-то не знать. Стыдно не знать и впаривать, что знаешь.

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

чего куда присваивание? Это ссылочная информация. Вообще рассуждать о "одно-два обращения", используя геткомпонент - это какой-то особый вариант извращений. Гет проходит по всем компонентам и спрашивает у каждого - слышь, а ты не кнопка, а ты? а ты? а ты? а ты? а ты? О! А ты кнопка. Заебись.

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

лечу по фотографии... недораха...

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Будет исполнено)
4
Автор поста оценил этот комментарий
Плюсанул за целеустремленность
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Благодарю
Автор поста оценил этот комментарий

я уже говорил: могу поменторить, если нужно, вот дискорд, там уже человек 10 (не знаю кто все эти люди, пишут активно трое) собралось https://discord.gg/xcq2CrjC

раскрыть ветку (1)
Автор поста оценил этот комментарий
Да я только сейчас додумался посмотреть профиль и посты...
1
Автор поста оценил этот комментарий

ход конём: builMenu.SetActive(!builMenu.activeSelf);
вжух! и не надо лишних булей

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

Вторая строчка всё ещё нужна, которая isActive = !isActive;
эти 2 строки вместо всего, что было раньше в том методе

раскрыть ветку (1)
Автор поста оценил этот комментарий
Я так и написал, но все равно при разрушени и повторном строительстве, при клике на объекте не вызывается меню, только после второго клика. Как будто в булевой переменной остаётся значение true
показать ответы
3
Автор поста оценил этот комментарий

это один метод... примерно как на втором скрине. Передаешь туда объект и название анимации и он тебе всё делает. И этот подход тебя пододвинет к пониманию ООП, который ты СО СТРАШНОЙ СИЛЫ стараешься неиспользовать %) И прекрати использовать GetComponent<>() в каждой щели, это говно. Если тебе нужно обратиться к объекту - сохрани его в переменную и обращайся. Гетать, особенно в апдейте - оцтой

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий
Void ClickButton()
{ script.ButtonAnimationPlay(button1, "ButtonSet"}
я правильно понял?
показать ответы
3
Автор поста оценил этот комментарий

это один метод... примерно как на втором скрине. Передаешь туда объект и название анимации и он тебе всё делает. И этот подход тебя пододвинет к пониманию ООП, который ты СО СТРАШНОЙ СИЛЫ стараешься неиспользовать %) И прекрати использовать GetComponent<>() в каждой щели, это говно. Если тебе нужно обратиться к объекту - сохрани его в переменную и обращайся. Гетать, особенно в апдейте - оцтой

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий
Но это же 2 строки - присваивание и затем обращение вместо одного обращения)
показать ответы
Автор поста оценил этот комментарий

сохранение с компрессией могло быть. Я бы в эту сторону копал.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Ваши мысли как всегда в правильную сторону. Решил проверить меню сохранения. Я по старой привычке сохраняю изображения горячими клавишами для web. Видимо для web идёт какая то компрессия
Автор поста оценил этот комментарий

ooops.. очепятка
builMenu.SetActive = !isActive;

=>

builMenu.SetActive(!isActive);

раскрыть ветку (1)
Автор поста оценил этот комментарий
Единственный момент, при отключении меню - isActive остаётся видимо true, потому что при повторном строительстве и клике - меню не вызывается. Только при втором клике
показать ответы
Автор поста оценил этот комментарий

ooops.. очепятка
builMenu.SetActive = !isActive;

=>

builMenu.SetActive(!isActive);

раскрыть ветку (1)
Автор поста оценил этот комментарий
Вы вовремя, я только собрался менять. Спасибо
Автор поста оценил этот комментарий
Возможно вы и правы на счёт того что нечего переживать взлома кода, я тоже раньше так думал, но вот когда несколько конкурентов начали десятки и даже сотни моих фотографий товаров выкладывать в свои интернет-магазины, то мне стало обидно и я начал шлепать вотермарки.
раскрыть ветку (1)
Автор поста оценил этот комментарий
Тут просто немного другая ситуация. Я в разработке использую части кода из свободных видеороликов, использую изображения со свободными лицензиями, кто я такой чтоб возмущаться после этого по поводу взлома или копирования материалов)
Автор поста оценил этот комментарий

В фотошопе формат файла RBG/CMYK менял?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Нет. В rgb и создавал документ и сохранял в нем же