Как я сделал первую игру и загрузил на Яндекс.Игры. Часть 4 (Новые уровни, новые механики, смена скинов)

Дисклеймер

В этой серии записей расскажу как делал первую игру от идеи до загрузки в Яндекс.Игры. Это не пошаговый туториал, но и не поверхностный рассказ. Буду рассказывать о этапах разработки, интересных решениях и небольших особенностях. Буду писать кратко или вообще не буду об очевидных вещах. Результат ниже по ссылке, а пока приступим.

Новые уровни

Создал 4 огненных уровня, 3 цирковых и 3 зимних. В них отличались объекты из которых делалась трасса, они были подобраны тематически в соответствии с уровнем. Также начала изменяться геометрия уровня, в начале уровни были линейные и ровно шли по прямой, сейчас появляются ответвления и уровни становятся более сложными.

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

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

Новые механики

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

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

Зимние уровни получили заморозку и летящие с неба снежки. Также с помощью корутин ставим на определенное время вектор движение 0,0, картинку заморозки(потом заменил на нормальную) и игрок замирает. Данные выводим в инспектор и регулируем до приемлимой игры.

Магазин скинов

Скины сделаны по такому же принципу как уровни в меню. Есть ScriptableObject в котором хранятся данные о скине: название, спрайт, цена и цвет партиклов от грифеля.

Скрипт SkinDisplay получает в инспекторе соответствующий ScriptableObject и подгружает данные через него. Также в инспекторе указываем UI элементы, которые нужно поменять и массив с именами всех скинов.

Как я сделал первую игру и загрузил на Яндекс.Игры. Часть 4 (Новые уровни, новые механики, смена скинов)

Такой скрипт получился, данные о покупке и использовании скинов заносится в PlyerPrefs с ключами 0 - закрыт, 1 - куплен, 2 - надет.

public class SkinDisplay : MonoBehaviour { [SerializeField] private Skin _skin; [SerializeField] private Image _skinImage; [SerializeField] private Button _buyButton; [SerializeField] private Image _buyOrUse; [SerializeField] private Image _locker; [SerializeField] private Text _price; [SerializeField] private Sprite _equiped; [SerializeField] private Sprite _notEquiped; [SerializeField] private string[] _allSkins; private Color _openColor; private int _state; void Start() { CheckAndCreateKeys(); CheckEquip(); _skinImage.sprite = _skin.SkinSprite; _price.text = _skin.Price.ToString(); _openColor = new Color(0, 0, 0, 0); } public void FixedUpdate() { _state = PlayerPrefs.GetInt(_skin.SkinName); if (_state == 1) { SetBought(); } } public void CheckAndCreateKeys() { if(!PlayerPrefs.HasKey(_skin.SkinName)) { PlayerPrefs.SetInt(_skin.SkinName, 0); } foreach (var name in _allSkins) { if (PlayerPrefs.GetInt(name) == 2) { return; } } PlayerPrefs.SetInt("Default", 2); } public void CheckEquip() { if (PlayerPrefs.GetInt(_skin.SkinName) == 1) { SetBought(); } if (PlayerPrefs.GetInt(_skin.SkinName) == 2) { SetBought(); Equip(); } } public void Equip() { foreach (var name in _allSkins) { if (PlayerPrefs.GetInt(name)==2) { PlayerPrefs.SetInt(name, 1); } } PlayerPrefs.SetInt(_skin.SkinName, 2); _buyOrUse.sprite = _equiped; } public void Buy() { if (ShowStars._stars >= _skin.Price) { ShowStars._stars -= _skin.Price; PlayerPrefs.SetInt("stars", ShowStars._stars); SetBought(); } } public void SetBought() { PlayerPrefs.SetInt(_skin.SkinName, 1); _locker.color = _openColor; _buyButton.gameObject.SetActive(false); _buyOrUse.gameObject.SetActive(true); _buyOrUse.sprite = _notEquiped; } }

Ниже на видео внизу скинов отображаются ключи. На старте загрузки сцены скрипт игрока проверяет весь массив скинов и устанавливает скин у которого ключ 2.

Также перерисовал в иллюстраторе карандаш на более подходящий по стилю игры.

Пятая часть тут

22
Начать дискуссию