Инди
Zed
622

Здрасьти, а это снова я, человек-devlog

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

В закладки

О проекте

Для тех кто забыл, или новенький, я напомню суть моей игры. Игры в жанре выживания в открытом космосе. Близкий брат Raft

Что нового? Как дела?

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

Небольшие изменения

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

  • Теперь у статов персонажа появились иконки:
Про последний индикатор я расскажу чуть позже
  • У предметов начинают появляться их первые анимации, они так быстро растут, я так ими горжусь
Анимации есть не у всех объектов, пока что, только у некоторых, точнее только у этих... :(

Ну и наконец то я нашел иконку для пластика, спустя десять тысяч лет поисков я смог.

Это вроде как пластиковая канистра, не пакет из магазина.. 

Помните астероиды которые тупо весели на заднем фоне, а теперь они тупо летают на заднем фоне:

  • У объектов теперь есть обводка. Как же я устал искать реализацию этого в URP, ибо с шейдерами я не магистр.

Инвентарь

Ну а теперь настало время для рассказа истории боли и страдания. Был чудный вечерок, я сидел и смотрел в монитор. И в какой то момент я понял, что инвентарь меня не устраивает. Изначально я хотел обойтись без Drag&Drop системы. Думал хватит и того, что игрок подбирает предметы и они просто появляются на панели, но в какой то момент до меня дошло, что некоторые предметы важнее других и их нужно держать на слоте 1, а всякий мусор на последнем. И я взялся реализовывать эту систему, все шло хорошо, я быстро создал систему взаимодействия UI панели с инвентарем, прикрутил Drag&Drop, и все было бы хорошо, но........................ И с этого начинается моя история.

Главный антагонист моего романа вот этот парень, Dictionary.

Когда я делал инвентарь и почему не придал значение тому, что Dictionary это не совсем то, что мне надо. Главная проблема стало то, что Dictionary по своей сути это таблица хешей, и я не могу без диких танцев с бубном реализовать систему по типу:

Dictionary.Add(item, 10); //добавить предмет в конец списка

По сколько это таблица хешей, то она не работает по такому принципу. И я решил изменить его на:

private List<KeyValuePair<ItemConfig, int>> items;

Мне нужно было что бы я мог хранит данные в видел Предмет/Количество. Но лист тоже стал не тем, что мне надо. Главные проблемы были в переборах и поисках объектов в таком списке. Что бы все работало более менее как нужно было мне, приходилось допиливать расширения методов, использовать линку и тд. В общем сидя и смотря на это все

и испытывая лютый кринж, я подрубил свой мозг на максимум, и за пару часов реализовал все по нормальному. Удалил всю дурь которую написал, и сделал все проще. Если кому интересно то я создал структуру Item, и в нее поместил Config, и Int, и вместо листа и DICKtionary я создал обычный массив

private Item[] items;

Ну и переписал методы перебора и тд. И теперь мы имеем полностью рабочий Drag&Drop инвентарь:

Крафт

Над крафтом пока, что я работаю не очень много, ибо не могу придумать нормальный дизайн для UI. Снова подвергается редизайну.

Главное изменение в системе крафта, это то, что я убрал таймер крафта объектов. То есть теперь объект сразу будет появляться в инвентаре, не знаю зачем я вообще добавлял эту фичу.

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

Баги

Конечно про баги писать смысла нет, ибо никто кроме меня не играл в сей шедевр, но все таки статью я пишу по большей части для себя, что бы понять этапы. Поэтому почему бы не написать про баги:

  • У модели предмета кислородного баллона был pivot внизу и из-за этого объект в космосе крутился не от центра, а от основания, пофиксил путем преобразования модели в модель Probuilder и нажатием 1 кнопошки для централизации пивота по модели
  • Переработал спавнер предметов, теперь он работает от конфигов предметов а не от префабов, это не совсем баг, но для меня это ошибка
  • Так же спавнер теперь задает рандомное количество предмета, раньше он спанил предмет, он летел и когда игрок его подбирал он получал предмет в инвентарь в количестве +0

Движок

Немного расскажу про расширение движка для удобства работы.

Как вы знаете из прошлых статей у меня есть окно для работы с предметами, я его немного доработал и разделил все предметы по пунктам:

Так же добавил еще одно окно для построек:

Тут хранятся данные конфигов построек - Нужные ресурсы и тд.

И есть еще одно окно, но оно связано с самым интересным(по моему мнению), и об этом будет в самом конце.

Главное меню

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

Теперь оно выглядит как то так. Еще конечно сыро, но все же уже выглядит приятно. Нет ощущение дешевизны. Так же пока я создавал сей шедевр у меня рождались мемы(со звуком):

В главной роли Беттерс Стотч с лицом моего не самого смышленого соплеменника

Прикрутил панель настроек, и еще панели новая игра, загрузить игру

Добавил сцену загрузки между уровнями:

Ранняя пташка, еще бы красивенький фон и шрифт и вообще можно в AAA продавать

Еще был добавлен эффект затухания при переходе между сценами:

Накидал концепт меню паузы:

Геймплей

В геймплее в этот раз не было крупных изменений, ибо я не мог полноценно сесть за проект и работать над чем то глобальным. Но все же есть что то новенькое. В этот раз я добавил ограничения мира, все таки основной геймплей в данный момент сконцентрирован вокруг стартовой точки. И в любом случае нужно ограничить игрока в выходе за карту. Эти стало включение обморожения. Если описать это логически, то я это трактую, что игрок находится на той единственной орбите, где имеется оптимальная температура для пребывания.

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

temp. = distance(exitPoint, player) //Если описывать грубо

Это и есть тот самый индикатор про который я писал вышел:

Персонаж получает урон в зависимости от уровня обморожения.

Ну и на этом геймплей фишки кончаются :"(

Ну а теперь самое сладенькое

После последней своей статьи я решил выложить пост на Реддит, и результаты были выше ожиданий.

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

Прогресс перед глазами

Я активно пользуюсь сервисом Notion, до этого пользовался другими например Trello и тд. У меня появилась идея сделать страницу в Notion, и спарсить ее в юнити, что бы игроки которые заходят в игру они могли сразу видеть над чем идет работа, и что в какой стадии находится. Я создал страницу в Notion, и попробовал ее спарсить, и это был ужас, в юнити мне удавалось получить только часть страницы, причем это в лучшем случае. Страница оказалась совсем не для парса, я начал искать варианты экспорта страницы в Json онлайн, но все найденные решения были не тем, что мне надо. И я знаю про возможность экспорта страницы в таблицы, но это был не вариант, ибо нужно было бы производить кучу действий для обновлений данных уже в самой юнити, а я все же двигался в сторону одной кнопки для всего.

И я решил создать свой Notion в юнити.

Накидав примерный UI я приступил к реализации окна в движке. По итогу вышло что то вроде того:

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

Чат

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

Немного реализации, для чата я решил использовать Vivox, мне уже одобрили проект, и дали доступ как я понял на 100 одновременных пользователей в бета моде, и 5к после релиза.

Другие идеи

Хотелось бы добавить отдельную панель с формой фидбека, но не просто "Отправьте мне ваш текст", а реализовать систему риквестов, то есть игрок будет отправлять мне свою идею, и будет открываться закрытый чат, где я буду общаться с ним. Если идея будет мне нравится, то буду ее реализовывать.

В общем я хочу создать свой "форум" внутри игры.

Итог

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

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

Подводя итоги, работы еще много, но проект уже выглядит приятно, и думаю скоро я уже добью полноценную демку и залью ее на Itch.io, страницу я кстати уже создал на досуге:

Логотип думаю поменяется со временем
Ну не красота?

Дальнейшие планы пока не известны, все покажет мнение игроков демки. Но надеюсь игра дойдет до версии альфа 1.0, для меня это будет детской радостью.

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

Zed
+120
{ "author_name": "Zed", "author_type": "self", "tags": ["\u0438\u043d\u0434\u0438","\u0432\u044b\u0436\u0438\u0432\u0430\u0447"], "comments": 24, "likes": 21, "favorites": 15, "is_advertisement": false, "subsite_label": "indie", "id": 224996, "is_wide": false, "is_ugc": true, "date": "Wed, 07 Oct 2020 14:14:32 +0300", "is_special": false }
Объявление на DTF Отключить рекламу
0
24 комментария
Популярные
По порядку
Написать комментарий...
1

О, идейный чувак видимо

Ответить
1

Да скорее портфель+личная хотелка.

Ответить
0

Интересно, но пока что музыку добавлять в проект смысла нет)

Ответить
2

"Человек, но devlog!
Он как human,
Но из words!"

Ответить
1

подписался, интересный проект, и выглядит симпатишно. удачи тебе!

интересные идеи в блоке про комьюнити, не бойся развиваться в эту сторону, отсекая слишком сложные в реализации вещи. у меня идей особо нет, кроме традиционных twitter/discord, народ такое любит

у notion есть неофициальные API-клиенты на go, python и java. юзаю на питон-проекте уже почти год, полёт нормальный, ничего не отваливается. официальный API всё обещают, но без конкретных сроков

Ответить
1

Спасибо! Надеюсь смогу реализовать действительно стоящую систему связи с комьюнити. Дискорд и тому подобное как по мне не удобное решение, у меня дискород сервер по прошлой игре, и когда люди на релизе писали там ИДЕИ они не очень цепляли. Но в защиту Дискорда скажу, только благодаря нему со мной связались американские игроки и сказали, что у них не получается подключится к серверам. 

Да, я видел API на питоне, но в этом и основная проблема) Я не хочу использовать питон в юнити, ибо шанс конфликта или отвала чего либо 99.999999%, а подгонять API и корректировать времени нет :( Да и думаю авто экспорта с авто обновлением будет достаточно. По сути иметь "свой" notion в движке даже удобно. А сейчас еще хочу посмотреть UI Builder или как то так, фича от юнити для создания UI с XML и USS(CSS только USS xD) и сделать себе супер красивый и удобный редактор

Ответить
1

хорошо бы в начале таких статей напоминать, что это за игра такая

Ответить
0

Спасибо, учту

Ответить
1

Интересные штуки по части работы с комьюнити, лаек.

Ответить
0

Если есть какие либо варианты я бы с радостью послушал) Ибо пока что кроме описанных в статье фич идей не так много. А очень хотелось бы работать бок о бок с комьюнити. 

Ответить
1

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

Ответить
0

Спасибо! Надеюсь не затяну с демкой.

Ответить
1

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

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

Для общения игроков уже дофига готовых инструментов, начиная с Discord. Лучше импортировать сообщения из канала через API в игру и давать ссылку для тех, кто хочет написать.

Ответить
0

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

Ответить
0

немного не понял почему для инвентаря Dictionary не подошел, и зачем в них хранить структуру айтемов? если можно хранить только id и количество
private Dictionary<string, int> _iventory = new Dictionary<sting,int>();

void Add(string id, int count){
if(_iventory.ContainsKey(id)){
_iventory[id] += count;
}else{
_iventory.Add(id, count);
}
}

Ответить
1

Основная проблема как я писал в статье, это то, что Dictionary это таблица хешей. Когда ты будешь выбрасывать и подбирать предмет, он не будет вставать в конец. К примеру когда у тебя инвентарь
[0] = Bluprint
[1] = Oxygen
[2] = Food

И ты выбросишь [1]
у тебя как бы будет
[0] = Oxygen
[1] = Food

Но когда ты поднимешь blueprint, то он снова будет на той же позиции как до выброса
[0] = Bluprint
[1] = Oxygen
[2] = Food

А мне нужно что бы предмет отправлялся в конец
[0] = Oxygen
[1] = Food
[2] = Bluprint

В Dictionary на сколько Я знаю, может я упустил какое то обновление или еще что то, но я не знаю возможности добавления гибкости как в листе или массиве без бубнов.

А структура это своего рода замена ключу и значению.

Ответить
1

понял, как то не обращал на это внимание, щас проверил, оказывается это так и работает)

Ответить
0

Да я тоже никогда не замечал этого, и в основном пилил все подобия инвентаря на Dictionary. А в этот раз так не прокатило

Ответить
0

А взять отдельно массив ключей, отсортировать их и дать на вход условному UI инвентаря нельзя?

Ответить
0

Не совсем уверен, что я полностью понимаю твой вариант. Можешь привести пример?)

Ответить
1

В Godot к примеру есть Dictionary и у него через метод keys() можно получить массив всех ключей. Иногда бывает удобно. Потому и спросил, так как не знаю какой функционал доступен. Просто интереса ради.
Пример:
var Resources : Dictionary = {
RES1 : 10,
RES5 : 15,
RES3 : 3
}
func TestFunc():
Resource.keys().custom_sort("MySortFunc")

Ответить
0

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

То есть когда используешь например тот же List.Add(item) то ты посылаешь объект в самый конец, в последнюю ячейку List list[list.Count - 1]
А в Dictionary не так. По этой причине сразу отпадает возможность использовать это.

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

Ответить
1

Ну да, я понимаю суть - требуется сохранение порядка, а map обычно отсортировывает элементы. Ну понятно в общем, спасибо)

Ответить

Комментарии

null