06 января, 2018

Пилим игру на Unity (Clicker, Idle, Incremental), часть 2

В этой части я добавлю апгрейды для увеличения силы клика.

Получится примерно вот это:



GoldPerClickDisplay

Для начала добавим еще одно текстовое поле для отображения силы клика. Я просто дублирую GoldDisplay:
Передвигаем его под первый дисплей и делаем шрифт обычным вместо жирного, потому что эта метрика несколько менее важная чем количество золота.
Теперь открываем GameManager скрипт.
Добавляем новую переменную для нашего дисплея.
     public UnityEngine.UI.Text GoldPerClickDisplay;
В функцию Update прописываем обновление нашего нового дисплея, аналогично уже сделанному:
        GoldPerClickDisplay.text = "GPC: " + goldPerClick;

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

Upgrade Button

Добавил новую кнопку. Назвал GPCUpgradeButton. Заодно переименовал старую в ClickMeButton.
Воткнул кнопку в правый верхний угол. Сделал размеры 200х100. Шрифт увеличил до 20. Если не будет влезать - подправим.

GPCUpgrade скрипт

Создаем новый скрипт GPCUpgrade и открываем его.
Он будет отвечать за вид кнопки апгрейда и за функцию покупки при нажатии на эту кнопку.

Переменные

Подключаем наш гейм менеджер, потому что там хранится количество денег и сила клика.
    public GameManager gm;
Подключаем текст написанный на кнопке, потому что именно туда мы будем выводить название, цену и мощность апгрейда.
    public UnityEngine.UI.Text upgradeInfo;
Задаем базовую стоимость и текущую стоимость апгрейда. Текущую делаем приватной переменной, чтобы не маячила в юнити.
    public float baseCost;
    private float currentCost;
Задаем название апгрейда, его количество и силу.
     public string upgradeName;
    public float count;
    public int clickPower;

Start & Update

При старте игры нам нужно установить текущую цену на апгрейд равную базовой. У нас еще пока нет апгрейдов, поэтому цена должна с чего-то начинаться. Для этого как раз подойдет функция Start()
        currentCost = baseCost;

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

Делается это все одной командой. \n - переход с одной строки на другую.
        upgradeInfo.text = upgradeName + "\nCost: " + currentCost + "\nPower: +" + clickPower;
Два плюса после power - это так и задумано. Тот что внутри кавычек будет отображаться на кнопке.

GPCUpgradePurchased

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

А происходит вот что. Для начала мы проверяем, достаточно ли у нас вообще денег? Если нет - ничего не происходит.
        if (gm.gold >= currentCost)
Если денег достаточно, то мы вычитаем текущую цену апгрейда из наших денег:
            gm.gold -= currentCost;
Теперь мы увеличиваем количество апгрейдов на единицу:
            count += 1;
Теперь мы увеличиваем мощность нашего клика на величину clickPower
            gm.goldPerClick += clickPower;
А теперь нам нужно придумать новую цену для апгрейда. На самом деле все уже придумано за нас и неплохо работает. А именно формула из Adventure Capitalist, да и в Kittens Game изначально используется такая. Мы берем магическое число 1.15 и возводим его в степень количества апгрейдов.
Если в wolfram alpha бахнуть вот это:
Plot[10 1.15^x, {x, 1, 20}]
То получим вот такой график, который показывает как меняется цена на первые 20 апгрейдов:

Но это так, для общего представления.
В общем формула норм, но она дает на выходе дробные значения, поэтому округлим ее до ближайшего целого. В итоге получается вот такая штука:
             currentCost = Mathf.Round(baseCost * Mathf.Pow(1.15f, count));
Mathf.Round как раз округляет все что в скобках.
Mathf.Pow возводит первый аргумент - 1.15f, в степень второго аргумента - count. Буква f после 1.15 указывает что это число типа float.

В итоге получается вот такая функция:

Возвращаемся в юнити

Подключаем к нашей кнопке GPCUpgradeButton компонент GPCUpgrade скрипт.
В нем указываем что Gm - это наш объект GameManager, UpgradeInfo - это объект Text внутри кнопки.
Также указываем Базовую стоимость апгрейда - 10, его название - First Upgrade и мощность - 1. Количество апгрейдов оставляем на нуле. Получилось как-то так:
Теперь осталось для кнопки выбрать функцию, которая будет вызываться при нажатии события. Она у нас находится в скрипте GPCUpgrade, которая в свою очередь привязана к кнопке GPCUpgradeButton. А сам скрипт, как мы помним, называется GPCUpgradePurchased. В итоге выглядит это как-то так:

Тестируем

Вроде все работает :)

Нам нужно больше апгрейдов?

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

Комментариев нет:

Отправить комментарий