Первая игра 2

Часть вторая — в которой я сдаюсь и опускаю руки

Оказалось, что вытянуть нужные мне данные — крайне сложная задача. Я пересмотрел кучу роликов, прочитал кучу информации, но все бесполезно. Несколько дней экспериментов — каждый раз одно и то же. Ошибка, ошибка, сплошные ошибки… Им не было конца

Заключение

Итак, я сдался. Вся затея пошла прахом. Постоянные ошибки сломили меня, а полное непонимание того, что делаю — добило окончательно

Так, а это что за текст?

Ахах, сдался — как же! Просто скипнул эту часть и перешел к следующему этапу. Благо, пока что это можно сделать относительно безболезненно. К загрузке данных вернусь как-нибудь потом. Итак, поехали дальше!

О возникших проблемах

Главная проблема — я вообще не знаю, как работать с таблицей, которая находится где-то там в гугле. Вторая — мой навык проггера. Он крайне низок — что-то около джуна (джун минус минус, ориентировочно). И третья — формат таблицы (о нем чуть ниже)

Нашел такое решение. И оно работает!

Смог адаптировать под моих героев и записать в них данные из таблицы! Проблема пришла внезапно. На первом листе у меня находятся, по сути, ссылки на айдишники из других листов. А cvs, насколько понял, не позволяет работать с другими листами! Штош, ищем другие варианты.

Поиски привели к https://docs.google.com/spreadsheets/d/*/expor? format=cs? edit#gid=0, где * это id таблицы, а после gid айди листа.

Ура — unity возвращает адрес нужного листа! Но данные все равно берутся с первого листа, агрррх! Я отчаялся. Почти потерял надежду. И тут, неожиданно, нахожу его: https://docs.google.com/spreadsheets/d/{key}/gviz/t? tqx=out:csv&sheet={sheet_name}. Ура, работает! Берет данные именно с нужного листа. Но вылезли баги — все id обрамлены теперь в « ». Решилось просто — указал, что нужно убирать символ ".

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

Итог вы знаете — пока так и не получилось

Следующий шаг

Удаляем все эксперименты — возвращаемся к самому началу до экспериментов с таблицами.

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

Выдал героям и противникам фейковые характеристики, добавил кнопки для использования скилла. Если мана накопится, то по нажатию герой делает БУМ!

Модернизировал выбор цели героем — теперь есть не только сингл-таргет скилл, но и бьющий несколько противников

Еще и здоровье теперь не просто отнимается, а делает это красиво постепенно. Циферки это здоровье — они дублируют полоску здоровья с кнопки скилла. Потом от них избавлюсь

Что вообще происходит на видео

Герой с 1000 здоровья это герой 1, его кнопка Skill Hero 1. По нажатию, если мана заполнилась, он бьет одного ближайшего противника

Герой с 2000 здоровья, соответственно, герой 2. По нажатию на его кнопку, он бьет всех противников, которые находятся на дистанции атаки

Естественно, количество кнопок зависит от количества героев — и у каждого свой скилл

Возникшие проблемы

Первая — архитектура. Уже начинается непонятно что — что-то откуда-то вызывает, что-то при этом происходит. В итоге сделал в confluence кучу страниц с названиями объектов и префабов. В них — страницы со скриптами. И в этих страницах описание того, что они делают со ссылками на те скрипты, которые вызывают. Надеюсь, это немного поможет упорядочить то, что у меня там происходит.

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

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

Немного важностей

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

private IEnumerator UpdateCurHealth() { while (_prevHealth > _curHealth) { yield return new WaitForSeconds(.1f); _prevHealth--; _healthCount.text = _prevHealth.ToString(); if (_prevHealth <= _curHealth) { _prevHealth = _curHealth; StopCoroutine(UpdateCurHealth()); } } }

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

Следующий этап

А дальше у меня прокачка! Научу героев получать опыт и повышать уровень

1010
15 комментариев

Уже начинается непонятно что — что-то откуда-то вызывает, что-то при этом происходит.

Погляди в сторону Dependency Injection, например, Zenject, он позволяет разобраться с проблемами динамического создания объектов, прокидывания всех нужных ссылок, и прочих приколов.

private IEnumerator UpdateCurHealth()

Ты сейчас сделал самописный твинер, который потом тебе ещё много раз придётся расширять, скорее всего. Можно использовать готовые решения, вроде DOTween, которые сильно облегчат подобные задачи. Сам в своё время часто с плавным изменением значений сталкивался.

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

Я так понимаю, у тебя в таблице будет храниться только кусок баланса, т.е. числа. По сути, у тебя там будет храниться некоторая структура данных, уникальная для каждого типа скиллов (абстрактный AOE урон, абстрактный direct урон, абстрактный хил), и ID'шниками тут будет выступать название самого класса, реализующего конкретный скилл (АОЕ-топот, direct-укол, хил-хил). В общем, под каждый тип скиллов создаёшь новый лист в таблице, с него тянешь инфу по ID'шнику, собранные данные передаёшь в билдер, получая структуру данных настроек скилла, которая инициализирует собой твой скилл.

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

2
Ответить

Комментарий недоступен

1
Ответить

Как много новых слов 😅
Пасиб, посмотрю))

DOTween - записал 👍

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

1
Ответить

Не знаю, что и сказать мою вторую игру https://nick-ryz.itch.io/ship-robot-one
https://www.youtube.com/watch?v=7gI5Y6GR7aQ&t=4s чертики назвали говном. А другие сказали, что в ней не хватает всего. Что скажут тебе ума не приложу.

1
Ответить

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

"А другие сказали, что в ней не хватает всего"

Да. Мда.

1
Ответить

Комментарий недоступен

1
Ответить

Зато у тебя есть продукт, который считаешь готовым - это просто здорово. Ты потратил кучу сил и не забросил)
А так я делаю потенциально коммерческий продукт - значит, меня вообще будут сравнивать с компаниями с миллиоными бюджетами) представляю, что там будет xD

Ответить