Hyper Casual игра на Unity с нуля. #2 Первый уровень
Первая часть: Hyper Casual игра на Unity с нуля. #1 Начало
Репозиторий: github.com/sergeychemodanov/roller-splat
Уровень будет состоять из ячеек - пустых (пол, который нужно закрасить) и стен. Первым делом создадим enum с этими типами.
_/Scripts/Dynamic/CellType.cs:
Затем создадим класс Level, в котором будет информация об ячейках и стартовой позиции шара.
_/Scripts/Dynamic/Level.cs:
Далее создадим класс, который будет хранить все динамические данные игры (пока что только информацию об уровнях), но сделаем его через интерфейс. Это позволит в дальнейшем легко подменить класс и, например, загружать данные с сервера.
_/Scripts/Dynamic/DataProviders/IDynamicDataProvider.cs:
Создадим тестового провайдера. Добавим в него один уровень 5x5 со стартовой позицией шара снизу слева.
_/Scripts/Dynamic/DataProviders/DebugDynamicDataProvider.cs:
Также необходимо создать класс для ячеек, которые будут находиться на сцене. Добавим в него метод Initialize, который принимает индекс ячейки и устанавливает позицию объекта в соответствии с индексом.
_/Scripts/Gameplay/Cell.cs:
Теперь создадим префабы пола, стены и шара и поместим их в папку _/Resources/Gameplay.
При создании удаляем с объектов коллайдеры, потому что мы не будем использовать физику и они нам ни к чему.
Создаем класс LevelFactory, который будет отвечать за создание объектов. В нем два метода: создать шар и создать ячейку.
_/Scripts/Gameplay/LevelFactory.cs:
Далее создаем класс GameController, который будет управлять игрой. Пока что в нем один метод Play, в который передается необходимый уровень. Контроллер берет данные уровня и создает необходимое количество ячеек и шар с помощью LevelFactory.
_/Scripts/Gameplay/GameController.cs:
Добавляем ссылки на GameController и DynamicDataProvider в класс App. Теперь он имеет вид:
Добавляем кнопку в класс MainMenuWindow, подписываемся на ее событие "Click". При нажатии берем первый уровень из списка уровней, передаем его GameController и закрываем окно.
Аттрибут [SerializeField] позволяет редактировать приватные переменные из редактора.
Далее нужно эту кнопку добавить в префаб окна. Я скачал SVG иконку кнопки play (256х256) с flaticon.com, закинул ее в figma.com, изменил цвет заливки на белый и сделал экспорт в PNG.
PNG картинку кладем в папку _/Sprites и меняем у нее в окне Inspector тип на Sprite (2D and UI), чтобы ее можно было добавить в интерфейс.
Открываем префаб MainMenuWindow, создаем кнопку, удаляем из нее дочерний объект Text, перетаскиваем иконку в компонент Image. Ставим галочку Preserve Aspect (для сохранения пропорций изображения) и кликаем Set Native Size чтобы установить размер кнопки равный размеру изображения. Перетаскиваем кнопку в поле PlayButton у объекта MainMenuWindow.
Перемещаем временно вручную камеру в нужное положение, примерно так:
Нажимаем Play и видим созданный уровень и шар. На сегодня это все. Еще раз ссылка на репозиторий, он будет обновляться вместе с выходом статей.
Вероятно, в компании думали, что из-за этой уникальной системы геймеры не захотят перепродавать свои диски с экшеном.
Её можно протестировать в бесплатной демоверсии.
Вот честно, иногда кажется, что игровой индустрии нечем удивить. Очередной Assassin’s Creed, ещё один открытый мир и опять нейросети пишут квесты. Стоп! А как насчёт реально крутых и неожиданных игр, которые сейчас никто не обсуждает, но которые заслуживают внимания не меньше, а порой даже больше чем хвалёные ААА? Сегодня о них и поговорим.
Он просит коллег меньше копировать.
Нихуя не понял, но в закладки добавил.
всё очень прикольно, но тебе с таким на хабр.
здесь не оч любят такой формат
Почему это? Лично я давно ждал нормальной ждвижухи на dtf.
А лучше на ютуб.
Все круто, жду продолжения!
Для иконок могу посоветовать https://game-icons.net/ там сразу можно и цвета и форму подложки настроить
Большое спасибо автору за материал.
Согласен с большинством. Код избыточен и перегружен для казуальной игры. И уж тем более для первоначального знакомства с Unity.
Код пишется или с большой закладкой на будущее. Или с попыткой показать больше возможности языка и Unity.
Но имея опыт работы с Unity и С# мне материал нравится и понятен. А некоторые идеи взял себе на заметку. Думаю автору стоит продолжать в том же духе. И не менять сложность и стиль изложения.
Хотел дополнить по окнам, я с ними работаю иначе. По модели MVP. Правда я Model и Presenter объединяю в один класс. И интерфейс делаю событийно-ориентированный. Я вообще часто использую event.
Вообще не всосал причин определенных решений.
Сначала вы зачем-то впиливаете интерфейс с единственной реализацией, что есть плохо (я понимаю, что вы, видимо, в следующей статье сделаете еще реализацию, но сейчас её нет - и это плохо для тутора и путает).
Затем, что особенно поджигает, вы даете этому интерфейсу и его реализациям абсолютно непонятное слишком абстрактное название, не отражающее почти ничего, что опять путает и плохо особенно для тутора.
Потом вы берете и делаете фабрику уровня тупо статиком, что увеличивает связность и заставляет вас использовать ресурсы просто чтобы получить префабы (Что делать не надо. Я потом уже посмотрел - вы вообще не гнушаетесь использовать ресурсы).
Потом вы добиваете это все тем, что делаете "корень композиции" синглтоном. Зачем? К нему никто не обращается, а если кто будет - надо бить его по рукам.
Я не вижу здесь никакой системы и зачем столько бесполезного шума в коде туторного проекта.