Как я делал свою первую игру
Это будет нетипичный лонг по созданию игры, я начну с самого начала. Первое что нужно знать, что я никогда не разрабатывал игры.
Почему Unity?
Ну, начнем с того, что YouTube просто забит уроками, как на русском, так и на английском. Поэтому изучение программы на начальном этапе довольно простое.
Вы можете спросить меня: "А как же C#?" А он разве сложный? Весь код, который будет использоваться на начальном этапе есть в интернете. Тут главное понимать, что он делает.
"Но есть же Unreal" — может возразить юный хейтер, но где ты видел инди разработчика, который в одиночку создает игры? И не нужно приводить в пример корейца, который заканчивает очередную игру, пока ты спишь.
Как по мне, Unity будет намного проще на начальном этапе, так как с самого начала на нем учат делать 2D-игры.
Мотивация
Конечно же Деньги! Я зашел на Head Hanter и посмотрел вакансии. А чем я хуже? Вообще хорошей мотивацией могут стать различные ролики по Game Jam. Их на ютюбе навалом, можно смотреть не переставая.
Обучение
Итак, ролики я посмотрел. Что дальше? А дальше — просмотр обучающий роликов! Подойдут любого качества, главное чтобы тебе было понятно, правда от местного кода может стать плохо.
Я начал с курса от loftblog. Мало того, что в коде не было нормальной читаемой структуры, так он еще оператор if-else не перенес на следующую строчку!
Меня хватило на пять уроков, поэтому я решил создать новый проект и сделать все по нормальному.
Концепция
У меня нет опыта в Unity, поэтому нужно сделать игру, которая будет простая, но с одной интересной механикой. Поразмыслив, я решил, что у меня будет персонаж, который движется вперед и прыгает через препятствия. Но затем, я сменил препятствия на специальные «шарики», при поедании которых персонаж увеличивается и уменьшается.
Выглядит довольно просто, теперь осталось нарисовать графику, анимации, меню и прочее. Звучит довольно просто.
Графика
Для рисования пиксель арта я использовал Aseprite. Программа несложная, правда я хотел использовать фотошоп. К сожалению, программа лагает при включении пиксельной сетки.
Далее в поисковике и смотрим картинки, у меня был слайм (слизь). Конечно, ничего оригинального здесь особо не придумаешь, поэтому я решил добавить немного милоты.
В итоге у меня получился вот такой набор:
Настройки для пиксельных картинок. Учите, что Pixels Per Unit — это размер вашей картинки. У меня 16х16.
Префабы
В Unity есть возможность рисовать префабами через Grid. Я перекинул объекты в Prefab и создал там палитру в новом гриде. Теперь открываем новую палитру в редакторе и перекидываем спрайты с префаба в редактор. Чтобы ровно расположить объекты нужно использовать Box Collider 2D. Затем для рисования используйте GameObjectBrush.
Вот подробное видео.
Для грида использую следующие настройки:
Прыжок
Прыжок реадизован довольно просто, но с учетом гравитации. Более подробно можно прочитать здесь.
Звуки
Звуки для игры я брал с сайта, остальное по ключевым словам.
Постпроцессинг
Для игры я использовал постпроцессинг. Его добавлять довольно просто, нужно добавить два компонента и создать профайл.
Для Post-proccess Layer нужно создать новый слой.
Канвас
В проекте у меня несколько канвасов. Для создания функции OnClick нужно перемещать сам конвас на кнопку, чтобы появились методы, которые вы накодили.
Промежуточный Итог
В итогу у меня появился вот такой вот уровень.
«Паралакс» сделал с учетом позиции камеры и скоростью игрока.
Камера
В игре используется плагин Cinemachine, поэтому нужно указать метод обновления камеры. В моем случае Last Update.
Сборка
Когда три уровня было готово, я начал собирать проект. Здесь я столкнулся с одной проблемой — у меня лагала игра. Я не мог понять в чем проблема, но потом выяснил, что в Project Settings — Physics 2D стоит Fixed Update, а у меня все вызовы перемещения через Update, поэтому игра лагала, но не только.
Еще был включен VSync, хотя после переключения в Physics 2D игра стала работать нормально, но я все равно его отключил.
Очень важно при сборке установить минимальное разрешение и режим работы приложения — В Окне. Иначе игра будет запускаться на полный экран т это неудобно. Минимальное разрешение в котором запускался проект — это 1280х720
Иконка
Иконку я делал в midjourney. Потребовалось около 20 генераций, а дальше картинки стали криповыми. Далее отфотошопил, чтобы более подходило по цвету, а так же убрал фон.
Сборка под Linux
Всегда хотел делать игры для линукс, поэтому собрал сборку без труда. Затем установил Ubuntu 22.10 на виртуальную машину (Virtual Box).
В настройках задал общую папку.
Для открытия папки без root потребуется вести команду, потом перезагрузи систему:
Для запуска игры открой папку через терминал и запустите (файл должен быть исполняемым.)
chmod +x ./файл-игры — делает файл исполняемым.
./файл-игры — запуск игры.
Производительность так себе, учитывая объем памяти, но запуск проверить можно.
Игра
Rumle - это платформер раннер, состоящий из 5 гонок. Прыгай и собирай монетки. Игра полностью бесплатна.
Молодец! Тут главное начать и не лениться, познавать азы и дальше изучать более углублённо.
Я конечно хреновый программист и разработчик, но вставлю свои пять копеек насчёт лагов. Открывайте форточку, начинаю душнить. В такой игре должно быть порядка 500 фпс, по сути не должно быть никаких лагов. Помню когда начинал изучать юнити, первое чему научили: никогда не нужно считать физику в апдейте. Для этого есть FixedUpdate. И сама физика должна считаться в FixedUpdate, он для этого и существует. Иначе вся физика будет завязана на фпс. Фпс просел - всё в игре замедлилось, фпс вырос в два раза - всё в игре ускорилось в 2 раза. Считывай нажатия клавиш в Update, а физику считай в FixedUpdate. Если под лагами имеешь ввиду что изображение не плавное, то поставь во всех объектах с rigidbody, collision detection - continuous, interpolate - interpolate. Тогда всё должно стать более плавным.
Ну и первым делом изучи разницу апдейта и фикседапдейта. Вкратце так: апдейт выполняется максимальное количество раз, сколько сможет, столько и выполнится за секунду. Грубо говоря, это твой фпс. А фикседапдейт выполняется каждые 0.02 секунды фиксировано и независимо от фпс (в настройках юнити можно как увеличить, так и уменьшить это значение). При значении по умолчанию 0.02, фикседапдейт выполнится 50 раз за секунду. Тут можно много чего написать, но лучше тебе самому это всё почитать или послушать, так как я хреновый учитель, сам уже толком ничего не помню.
P.S. время 5 утра, я двое суток не спал, так что мог что-то напутать
Считывай нажатия клавиш в Update, а физику считай в FixedUpdate.Да, я знаю.) Лаги были из-за vsync.
А вот ето пздц уважаемо! Команду не собирал, игру мечты на энтузиазме разрабатывать, а сам разобрался и сделал! КРАСАВА! Такие всегда и везде нужны.
Ничего в этом не понимаю. Но зефирка милая
Комментарий недоступен
Красавчик! Очень круто всё описал и привел полезные ресурсы, спасибо!
Я так же как и ты преодолеваю все эти трудности в одиночку 😂очень ищу комьюнити чтобы обсуждать в телеграме и обмениваться опытом. Сейчас обучаюсь unity и c# по платному англоязычному большому курсу на udemy, в рамках него напишу 5 игр разного жанра (3 уже написал), а потом буду реализовывать игру моей мечты
В телеге можешь спрашивать: https://t.me/unity3d_ru
Это телега сайта unity3d.ru