Визуал за очки в игре (Unity #2)

Elleyer

I never seen a white person before.
Регистрация
30 Май 2018
Сообщения
36
Реакции
54
Всем здарова. Продолжаем, собственно.
Для начала нужны сами скины. Благо, я сделал 1 сам (для теста) , и остальные сделал друг в Иллюстаторе.
Все файлы должны быть в PNG (это, врпинципе, понятно)
Далее запускаем юнити. У меня в игре была кнопка "Стайлинг" - на неё и вцепим выбор скинов.
Сейчас нам нужно сделать так, что-бы при открытии этого пункта вылахила панель со скинами, верно? Начнём.
У нас в игре есть скрипт под названием buttons (по аналогии "Старт" и так далее. Просто скрипт, где паблик воиды для настройки клика на кнопку), так вот, нужно его отредачить :
C#:
public void Styling() //Это для того, что-бы мы потом юзали то в самой юньке
    {
        Rate.SetActive(false); // Окно рейтинга и так далее. Это те кнопки , которые скрываем
        Onlinefunc.SetActive(false);
        setpan.SetActive(false);
        welcome.SetActive(false);
        start.SetActive(false);
        scores.SetActive(false);
        connected.SetActive(false);
        stylingBTN.SetActive(false);
        styling.SetActive(true);
    }
Настраиваем этот клик на саму кнопку :
1542827828001.png
Теперь на кнопку будет появлятся панельна (пустая). Делайте визуал под себя. Теперь приступим к скриптам скинов :
Создаём пустой игровой обьект под названием "skins", а в нём еще один обьект из категории UI - Scroll view (для свайпов)
1542825051326.png
Там где контент, создаём полу-прозрачные картинки (фон для каждого скина), туда вставляем и саму картинку - будет 3 обьекта на каждый скин :
1542825133670.png
1) Имя скина, по которому будем искать его в бд
2) Цена каждого скина (скрипт у нас 1, но его цепляем на каждый скин, что-бы не писать всем фиксированную цену)
3) Сам спрайт скина (я юзаю 128x128)
Теперь смотрим как выглядит скрипт для обработки этого процесса :
C#:
public class Skins : MonoBehaviour
{
    [SerializeField] private Text SkinName, SkinPrice;
    public int price; //Обьявляем цены через юнити
    private bool IsAvailable; // Проверка на доступность (у нас же есть скины за кол очков > нашего количесва)
    public GameObject Error_Log; //Вывести ошибку (нужна настройка префаба)

    public void Start()
    {
        // Условие, если общее количество очков в бд меньше за цену скрипта - то IsAvailable принимает значение false, и текст с именем меняет на тот, что впишем (всё в колонке SkinPrice.text)
        if (PlayerPrefs.GetFloat("TotalScore") < price)
        {
            IsAvailable = (false);
            SkinPrice.text = "you need " + (price - PlayerPrefs.GetFloat("TotalScore")) + " points more";
        }
        //Если 1 не выполнилось - скин доступен, а текст меняем на "Select skin"
        else
        {
            IsAvailable = (true);
            SkinPrice.text = "select skin";
        }
    }

    public void SetUpSkin()
    {
        //Настройка на клик, как с кнопкой "стайлинг". Если IsAvailable(true) - То создаём в бд строку с именем скина, который мы выбрали
        if (IsAvailable)
        {
            PlayerPrefs.SetString("CurrentlySkin", SkinName.text);
            Debug.Log(PlayerPrefs.GetString("CurrentlySkin"));
        }
        //Если нет - спавним префаб ошибки
        else
        {
            GameObject Clone = Instantiate(Error_Log);
            Clone.transform.parent = GameObject.FindGameObjectWithTag("SkinsParent").transform;
            Clone.transform.localScale = new Vector3(1, 1, 1);
            var z = Clone.transform.position.z;
            z = -55;
            Destroy(Clone,8f);
        }

    }
    //Постоянная проверка текущего скина, если название в дб соотвествует с тем, на какой мы кликнули - цвет его текста и сам текст мы меняем
    void Update()
    {
        if (PlayerPrefs.GetString("CurrentlySkin") == SkinName.text)
        {
            SkinPrice.text = "selected";
            SkinPrice.color = Color.green;
        }
        //Если мы сменили скин, то убираем с того, что уже зелёного цвета на тот, что обычного белого и с текстом "select"
        if (PlayerPrefs.GetString("CurrentlySkin") != SkinName.text)
        {
            SkinPrice.color = Color.white;
            SkinPrice.text = "select";
        }
        // Тут, если Очки в бд меньше чем цена, то вместо имени (Тот же SkinPrice.text) будет кол очков, которое нам не хватает (Отнимаем от цены наше количество)
        if ((PlayerPrefs.GetFloat("TotalScore") < price))
            SkinPrice.text = "you need " + (price - PlayerPrefs.GetFloat("TotalScore")) + " points more";
    }
}
Теперь отдельно делаем каждый скин , например MaterialShip :
Цепляем туда этот скрипт
1542825872694.png
В прайс - вписываем цену
В скинНейм - вставляем колонку с именем :
1542825919076.png
SkinPrice - Select/price;
ErrorLog - наш префаб.
И так добавляем каждый скин. У него должно быть 3 дочерних элемента (см. выше)
Пора писать скрипт на проверку. И так, переключаем сцены. Заходим на сцену с самой игрой, и выбираем Игровой обьект нашего игрока :
1542826908195.png
Теперь смотрим в правое меню, и видим обьект Sprite Render :
1542827006340.png
Как видим, сейчас у нас стоит спрайт с именем "Spaceship". Мы хотим, что-бы наш выбор работал из стайлинга. И так, загружаем свои скины в одну папку, пусть "Skins"
1542827170187.png
Теперь создадим скрипт под названием "SkinsChecker" или как вам угодно. Приступим к редактированию :
C#:
public class SkinsChecker : MonoBehaviour
{
    //Обьявляем все спрайты, и загружаем их в инспекторе(редакторе, как на скриншоте выше)
    private SpriteRenderer spriteRenderer ;
    [SerializeField] private Sprite _default;
    [SerializeField] private Sprite _materialship;
    [SerializeField] private Sprite _bloodydarkness;
    [SerializeField] private Sprite _void;
    //Что-бы не подгружало, сделаем Awake - стартует до начала загрузки скрипта
    void Awake()
    {   //Тут пошли условия. Если в базе данных строка соотвествует названию какого-нибудь скина, то оно в компонент "Sprite" вставит тот скин, и так и созранит в базе данных до следующей смены. После перезагрузки тоже будет работать
        spriteRenderer = GetComponent<SpriteRenderer>();
        if (PlayerPrefs.GetString("CurrentlySkin") == "default")
            spriteRenderer.sprite = _default;
        if (PlayerPrefs.GetString("CurrentlySkin") == "materialship")
            spriteRenderer.sprite = _materialship;
        if (PlayerPrefs.GetString("CurrentlySkin") == "darkness")
            spriteRenderer.sprite = _bloodydarkness;
        if (PlayerPrefs.GetString("CurrentlySkin") == "void")
            spriteRenderer.sprite = _void;
        Debug.Log(PlayerPrefs.GetString("CurrentlySkin"));       

    }
}
И что теперь? Работает ли оно? -----Да!)
1542827608547.png
Как видим, сейчас выбран МатериалШип. Теперь заходим в саму игру, и смотрим :
1542827694154.png
Всё работает! Спасибо за прочтение! Всем удачи в разработках!
 
Сверху Снизу