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

Ссылка на часть 1

Первая часть была написана 24 ноября, прошло 10 дней...

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

Заключение

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

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

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

Ремарка

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

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

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

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

Смог адаптировать под моих героев и записать в них данные из таблицы! Проблема пришла внезапно. На первом листе у меня находятся, по сути, ссылки на айдишники из других листов. А 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 указан у героя. После долгих часов мучений нашел корень проблемы — в найденном решении при вытаскивании таблиц тут же присваиваются найденные значение. Значит, нужно переписывать — разделять методы так, чтобы появилась нужная гибкость. Отныне и навсегда — отдельно вытягиваем таблицы, отдельно проходимся по ним, ища то, что нужно, отдельно записываем герою нужные характеристики.

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

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

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

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

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

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

Изначальный код по поиску ближайшего объекта взят с Unity

 public GameObject FindClosestTarget(GameObject[] objectsArray)
    {
        //Debug.Log("target");

        _debugTarget = null;

        GameObject[] gos;
        gos = objectsArray;
        GameObject closest = null;
        float distance = Mathf.Infinity;
        Vector3 position = transform.position;
        foreach (GameObject go in gos)
        {
            if (go != null && go.activeSelf)
            {
                Vector3 diff = go.transform.position - position;
                float curDistance = diff.sqrMagnitude;
                if (curDistance < distance)
                {
                    closest = go;
                    distance = curDistance;
                }
            }
        }
        return closest;
    }

А вот такой код появился для поиска всех объектов, которые находятся на дистанции атаки. Просто взял готовое решение по поиску и переделал чутка

public GameObject FindAllClosestTargets(int index)
    {
        //Debug.Log("target");

        GameObject closest = null;
        float distance = GetComponent<Characteristics>().Attack_Range;
        Vector3 position = transform.position;
        
            if (_enemys[index] != null && _enemys[index].activeSelf)
            {
                Vector3 diff = _enemys[index].transform.position - position;
                float curDistance = diff.sqrMagnitude;

                //Debug.Log("curDistance = " + curDistance);
                //Debug.Log("distance = " + distance);

                if (curDistance <= distance)
                {
                    closest = _enemys[index];
                    //distance = curDistance;
                }
            }

        return closest;
    }

Вызов выглядит так

for (int i = 0; i < _targetAnalyse.Enemys.Length; i++)
    {
      Attack(_targetAnalyse.FindAllClosestTargets(i), dmg); // dmg принимает мультипликатор урона
    }

И все - теперь герои умеют в AoE (атака по области)

Мда, с английским я не слишком заморачивался)

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

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

Герой с 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());
            }
        }
    }

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

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

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

Комментарии (13)


  1. Rezzet
    05.12.2021 14:32
    +6

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


    1. Vivicpony Автор
      05.12.2021 14:47
      +1

      Сложнее из-за низкого порога вхождения: теперь любой школьник может сделать игру - конкуренция просто адская

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


      1. NikS42
        08.12.2021 10:02

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

        Шанс что-то сделать у него появится только если он возьмёт себя в руки и будет играть не в тот проект, который *Ну тут вроде все понятно, туда это, сюда это, тут разберусь, напильником и норм, сделаю это. А счётчик уровня у меня сам по себе в процессе апнется, скилл разблокируется, и следующий проект уже будет огонь* а в архитектуру как таковую. Читать про паттерны, принципы разработки. Осмыслить каждый модуль с точки зрения поддерживаемости и переиспользуемости. Параллельно учиться не убегать от проблем вроде недовязанных табличек в Excel, а лучше, учиться вовремя задавать себе вопрос, точно ли это решение годится и как будет правильно. А иначе это все мертворожденное.


        1. Vivicpony Автор
          08.12.2021 10:24

          Согласен с тем, что учиться нужно - как и грамотно подходить к написанию проекта. Но и в таком "безалаберном" подходе есть свои плюсы)

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

          Во-вторых... С таким подходом я не осознаю всей сложности того, за что я взялся. Если бы я хорошо понимал, насколько это сложно, я бы 100% не начал делать эту игру xD

          И в третьих, у меня позиция такая: если не умеешь что-то делать, это не значит, что ты не можешь сделать что-то классное))

          И просто пример того, что незнание программирования не должно останавливать от попыток сделать то, что хочешь))

          Тут даже со своим скиллом понимаю ,насколько все плохо в видео)) Но она выпущена, работает и собирает деньги!

          Но опять же - соглашусь ,что обучение важно


          1. Vivicpony Автор
            08.12.2021 11:07

            upd: узнал, что не выпущена. Но, тем не менее, есть рабочая версия. Будем считать, что имел ввиду именно это


    1. Kardy
      05.12.2021 18:46
      +1

      >а такое чувство что стало только сложнее.

      Так и есть, стало сложнее.
      Т.е. да, повторить ААА игру какого-нибудь 1998-2000 года сейчас может команда школьников за лето. НО даже в инди сегменте приходится учитывать огромное количество наворотов накопившихся с тех времен, как чисто технических, так и геймдизайнерских. Никто сейчас не будет играть в "как старкрафт 1", оно просто скучное современному игроку.


      1. opckSheff
        08.12.2021 11:14

        Серьёзно? "Как старкрафт 1" скучно современному игроку? А тупые автобатлеры, инкрементальные игры и кликеры, в которых ты не делаешь абсолютно ничего, кроме просмотра рекламы раз в пару минут - не скучно современному игроку?

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


        1. Vivicpony Автор
          08.12.2021 11:36

          Ох отхвачу щас минусов... Но да ладно.

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

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

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

          Вообще, связка "творчество vs коммерция" довольно интересная тема)

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

          p.s а что плохого в современном гейминге?)) Недавно вышла "pathfinder wrath of the righteous" - у меня на нее слюнки текут)


          1. opckSheff
            08.12.2021 13:15

            Ещё не играл во второй Pathfinder, но уверен, что он великолепен. Но в этом и проблема - сколько денег принесёт Pathfinder и сколько AFK Arena? А сколько труда вложено в два этих проекта?

            Подобные игры не выглядят просто, они и есть простые. Более того - они примитивные, это буквально бездумное тыканье в экран, чтобы делать циферки больше и больше. А они в любом случае будут больше у того, кто посмотрел больше рекламы или купил больше сундуков, а не у того, кто более внимательно и вдумчиво играет.


            1. Vivicpony Автор
              08.12.2021 13:35

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

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

              Но при этом оформлен он в достаточно простую форму по восприятию. Ну а так да - побеждает обладатель самого толстого кошелька


  1. Vivicpony Автор
    05.12.2021 16:38
    -7

    Уии, рейтинг первой части стремился к минус бесконечности, но эта сделала эпичный камбек, подхватив с собой заодно и первую часть [празднующий смайл]


  1. ri1wing
    06.12.2021 14:01

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

    А зачем вам вообще работать с гугл-таблицами? Можно же просто базу данных использовать.


    1. Vivicpony Автор
      06.12.2021 14:24

      Нууу, в моем понимании, база данных - просто способ представления информации ???? типа json, xml и так далее - просто формат данных

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