Все Гайды Мой Кабинет

Создаём магазин скинов на Юнити

Автор: Admin 13 дня назад

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

Подготовительная часть

И первым делом предлагаю подготовить нашу сцену для работы. Для этого с помощью окна Hierarchy создадим объект UI - Canvas. А уже внутри него создадим несколько UI элементов.

  • Создаём объект UI - Text - TextMeshPro, и назовём его Money. В этом текстовом поле будут отображаться количество наших монет.
  • Создаём объект UI - Button - TextMeshPro, и назовём его Start. Эта кнопка будет запускать нашу сцену с игровым персонажем. Можете написать текст на кнопке "Начать Игру".
  • Создаём объект UI - Image, и назовём его Scin1. В него загружаем спрайт скина первого персонажа. Внутри данного объекта создаём ещё 2 объекта типа UI - Button - TextMeshPro, с названиями Buy и Select. Эти кнопки отвечают за Покупку данного скина, и выбор(активацию). Поэтому можете вписать соответствующий текст на кнопках: "Купить" и "Применить".

Далее скопируйте объект Scin1, и продублируйте его столько раз, сколько у вас имеется скинов. У меня их три. И не забудьте изменить названия новых объектов на Scin2 и Scin3.

В итоге на игровой сцене и в окне Hierarchy у вас должно получится примерно так.

Если у вас получилось примерно так, то можно спокойно переходить к написанию скриптов.

Написание скриптов

Первым делом создадим c# скрипт для нашего магазина, в котором будет хранится вся главная информация по магазину. Назовём его ScinShop, и заранее присвойте его к объекту, например Canvas. Пока временно его отложим в сторону, так как код в данный скрипт напишем позже.

Так же нам необходимо создать скрипт для трёх наших скинов. Он нужен для того, чтобы хранить всю информацию по каждому скину: id скина, стоимость скина, куплен ли он, активирован ли он, и так далее. Поэтому создадим c# скрипт с названием Scin, и заранее присвоим его всем нашим скинам(объектам Scin1, Scin2 и Scin3).

Впишем в данный скрипт следующее содержимое:

using UnityEngine;
using UnityEngine.UI;

public class Scin : MonoBehaviour
{
    public int cost; // стоимость скина
    public int scinID; // id скинакуплен ли скин?
    public bool isBuy; // куплен ли скин?
    public bool isSelected; // активирован ли скин?

    public Button buttonBuy; // ссылка на кнопку "купить"
    public Button buttonSelect; // ссылка на кнопку "применить"
    public ScinShop scinShop; // ссылка на скрипт ScinShop магазина, который находится на объекте Canvas

    public void Buy()
    {
        if (scinShop.money >= cost)
        {
            scinShop.money -= cost;
            scinShop.textMoney.text = "Монет: " + scinShop.money.ToString();
            isBuy = true;
            buttonBuy.gameObject.SetActive(false);
            buttonSelect.gameObject.SetActive(true);
            PlayerPrefs.SetInt("money", scinShop.money);
            PlayerPrefs.SetInt("buy"+ scinID, 1);
            PlayerPrefs.Save();
        }
    }

    public void Select()
    {
        scinShop.scins[scinShop.activeScinID].buttonSelect.gameObject.SetActive(true);
        scinShop.scins[scinShop.activeScinID].isSelected = false;
        scinShop.activeScinID = scinID;
        isSelected = true;
        buttonSelect.gameObject.SetActive(false);
        PlayerPrefs.SetInt("scinsID", scinID);
        PlayerPrefs.Save();
    }
}

Описание всех переменных описаны в самом скрипте, и поэтому разбирать их сейчас не будем, а лишь настроим все наши скины(Scin1, Scin2 и Scin3) в окне Inspector следующим образом:

  • В поле Cost указываем цену для каждого скина
  • В поле Scin ID для каждого скина указываем уникальный номер, начиная с 0. То-есть, если для Scin1 указан 0, то для Scin2 должно быть значение 1, а для Scin3 - значение 2
  • Поля Is Buy и Is Selected не трогаем. Они ВСЕ должны быть без галочек.
  • В последние 3 поля перетащите из окна Hierarchy объекты Buy, Select и Canvas.

Теперь давайте вкратце разберём выше написанный код, и начнём мы с метода Buy(), который находится в строках #15-28:

  • Сначала мы конечно же проверяем, хватает ли наших денег для покупки данного скина. Если да, то обновляем наши деньги.
  • В переменную isBuy указываем, что скин куплен, и с помощью метода SetActive() мы отключаем кнопку "Купить", и включаем кнопку "Применить".
  • Далее с помощью методов PlayerPrefs.SetInt() сохраняем данные о монетах, и купленном скине, и для страховки принудительно сохраняем данные с помощью PlayerPrefs.Save(), хотя это не обязательно.

Разбирать метод Select() мы не будем, поскольку здесь на 90% происходит всё тоже самое что и в методе Buy(), то-есть, нужные кнопки активируются, а не нужные - деактивируются, а так же сохраняются данные о скинах.

Отлично, скрипт Scin готов и настроен для каждого скина! Но обратите внимание на то, что в нём есть функции Buy() и Select(), которые необходимо добавить на событие наших кнопок "Купить" и "Применить". Сделаем это прямо сейчас.

Выбираем объект Buy, который находится внутри объекта Scin1, и в окне Inspector в поле On Click() перетаскиваем объект Scin1. После чего выбираем скрипт Scin и метод Buy.

Аналогичные действия проводит и с объектом Select, и для всех остальных объектов Buy и Select, находящихся в объектах Scin2 и Scin3.

Мы почти завершили работу магазина скинов, осталось совсем чуть чуть. Вернёмся к скрипту ScinShop, который мы создали ранее, и в который мы ничего не написали. Исправим это недоразумение. Впишем в данный скрипт следующий код:

using UnityEngine;
using TMPro;

public class ScinShop : MonoBehaviour
{
    public int money = 500; // количество ваших денег при старте игры
    public TextMeshProUGUI textMoney; // ссылка на текст на игровой сцене, в котором отображено количество денег.
    public Scin[] scins; // ссылки на все ваши скины (объекты Scin1, Scin2, Scin3)
    public int activeScinID = 0; // номер скина, который куплен и активирован изначально

    private void Start()
    {
        //PlayerPrefs.DeleteAll();

        if (PlayerPrefs.HasKey("money"))
        {
            money = PlayerPrefs.GetInt("money");
        }

        if (PlayerPrefs.HasKey("scinsID"))
        {
            activeScinID = PlayerPrefs.GetInt("scinsID");
        }
        scins[activeScinID].isBuy = true;
        scins[activeScinID].isSelected = true;
        PlayerPrefs.SetInt("buy" + activeScinID, 1);
        PlayerPrefs.SetInt("scinsID", activeScinID);

        textMoney.text = "Монет: " + money.ToString();
        
        for (int j = 0; j < scins.Length; j++)
        {

            if (PlayerPrefs.GetInt("buy" + j) == 1) {
                scins[j].isBuy = true;
            }

            if (scins[j].isBuy == true)
            {
                scins[j].buttonBuy.gameObject.SetActive(false);
            }

            if (scins[j].isSelected == true || scins[j].isBuy == false)
            {
                scins[j].buttonSelect.gameObject.SetActive(false);
            }
        }
    }
}

Объяснять созданные переменные мы не будем, так как они описаны в самом скрипте. Давайте лишь все эти переменные настроим в окне Inspector для объекта Canvas, перетащив в поля соответствующие объекты:

Ну а теперь вкратце разберём выше написанный код, который находится в методе Start():

  • В строке #15 с помощью метода PlayerPrefs.HasKey() мы проверяем, есть ли в PlayerPrefs сохранённая переменная с названием money. Если да, то это означает, что данные о монетах уже сохранялись, и значения о количестве монет необходимо брать из PlayerPrefs. А если такой переменной нет, то данные о количестве монет необходимо брать из переменной money, объявленной в строке #6. Аналогичная проверка с номером активного скина происходит и в строке #20.
  • Следующие 4 строчки обновляют данные о купленных и активированном скине.
  • В строке #31 мы создали цикл, который будет выполняться 3 раза, чтобы сделать обход по всем нашим скинам. В этом цикле мы создаём проверку для наших кнопок покупки и кнопок выбора скина. То-есть, данный код не отображает кнопку "Купить", если скин куплен. А так же не отображаем кнопку "Применить", если скин ещё не куплен, либо если он уже применён, и является в данный момент активным.

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

ВАЖНО: Для очистки данных из PlayerPrefs, необходимо раскомментировать строчку кода из строки #13.

Завершение

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

Кнопка начать игру уже готова на игровой сцене. Давайте создадим для неё c# скрипт с названием StartGame, и сразу же присвоим её объекту Start. Впишем в него следующий код:

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartGame : MonoBehaviour
{
    public void Game()
    {
        SceneManager.LoadScene("Game");
    }
}

Единственное что есть в данном скрипте, это метод Game(), который с помощью метода SceneManager.LoadScene() запускает сцену с названием Game. Этот метод необходимо присвоить кнопке Start, с помощью окна Inspector, через поле On Click(), как мы делали это ранее.

Теперь создадим сцену с названием Game, и с помощью окна Hierarchy создадим в нём любой 2д объект, который будет являться нашим персонажем, назовём данный объект Player. И создадим для него скрипт, с названием ScinPlayer. Впишем в него следующий код:

using UnityEngine;

public class ScinPlayer : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;
    public Sprite[] scins;

    private void Start()
    {
        int scinsID = PlayerPrefs.GetInt("scinsID");

        spriteRenderer = GetComponent<SpriteRenderer>();
        spriteRenderer.sprite = scins[scinsID];
    }
}

В строке #6 мы храним ссылки на наши спрайты скинов, поэтому предлагаю сразу с помощью окна Inspector перетащить из окна Project все наши спрайты скинов.

Вернёмся к разбору кода: в методе Start() мы присваиваем тот спрайт нашему персонажу, который мы сохраняли в переменную scinsID.

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

Вы можете отблагодарить автора донатом. Донат

Комментарии

7
RunningIndis 13 дня назад

Вопрос, такой будут ли сохранятся купленные скины при выходе из игры, и заходе в игру?

Admin 13 дня назад

RunningIndis, Нет не будут. Впринципе если очень нужно, могу переписать гайд чтоб сохранялись.

RunningIndis 13 дня назад

Admin, для этого ведь необходимо будет создавать автоматический сейв для игры? И для этого нужно будет создавать PlayerPrefs. Save()?

Admin 13 дня назад

RunningIndis, Думаю да, не помешает после каждого изменения данных в PlayerPrefs вызывать PlayerPrefs.Save().

RunningIndis 12 дня назад

Admin, А не могли бы показать, куда и как правильно вносить PlayerPrefs.Save()?

Admin 12 дня назад

RunningIndis, статья обновлена вместе с объяснениями. Теперь данные о купленных скинах и выбранном скине сохраняются.

RunningIndis 11 день назад

Admin, Спасибо вам большое!!!

Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь