Как я делал свою первую игру

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

Почему 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.

Как я делал свою первую игру

Вот подробное видео.

Для грида использую следующие настройки:

Как я делал свою первую игру

Прыжок

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

[SerializeField] private int jumpx; [SerializeField] private int jumpy; [SerializeField] public float fallingGravityScale; [SerializeField] private float gravityScale; if (Input.GetKeyDown(KeyCode.Space) { rb.velocity = new Vector2(jumpx, jumpy); if (rb.velocity.y >= 0) { rb.gravityScale = gravityScale; } else if (rb.velocity.y < 0) { rb.gravityScale = fallingGravityScale; }

Звуки

Звуки для игры я брал с сайта, остальное по ключевым словам.

Постпроцессинг

Для игры я использовал постпроцессинг. Его добавлять довольно просто, нужно добавить два компонента и создать профайл.

Для Post-proccess Layer нужно создать новый слой.

Как я делал свою первую игру

Канвас

В проекте у меня несколько канвасов. Для создания функции OnClick нужно перемещать сам конвас на кнопку, чтобы появились методы, которые вы накодили.

Как я делал свою первую игру

Промежуточный Итог

В итогу у меня появился вот такой вот уровень.

Как я делал свою первую игру

«Паралакс» сделал с учетом позиции камеры и скоростью игрока.

public class position : MonoBehaviour { private Transform cameraTransform; public float speed; // Start is called before the first frame update void Start() { cameraTransform = Camera.main.transform; } // Update is called once per frame void Update() { if (cameraTransform.position.x >= 0) { transform.Translate(Vector2.right * speed * Time.deltaTime); } if (player.speed == 0) { speed = 0; } }

Камера

В игре используется плагин Cinemachine, поэтому нужно указать метод обновления камеры. В моем случае Last Update.

Как я делал свою первую игру

Сборка

Когда три уровня было готово, я начал собирать проект. Здесь я столкнулся с одной проблемой — у меня лагала игра. Я не мог понять в чем проблема, но потом выяснил, что в Project SettingsPhysics 2D стоит Fixed Update, а у меня все вызовы перемещения через Update, поэтому игра лагала, но не только.

Как я делал свою первую игру

Еще был включен VSync, хотя после переключения в Physics 2D игра стала работать нормально, но я все равно его отключил.

Как я делал свою первую игру

Очень важно при сборке установить минимальное разрешение и режим работы приложения — В Окне. Иначе игра будет запускаться на полный экран т это неудобно. Минимальное разрешение в котором запускался проект — это 1280х720

Как я делал свою первую игру

Иконка

Иконку я делал в midjourney. Потребовалось около 20 генераций, а дальше картинки стали криповыми. Далее отфотошопил, чтобы более подходило по цвету, а так же убрал фон.

Как я делал свою первую игру
Как я делал свою первую игру

Сборка под Linux

Всегда хотел делать игры для линукс, поэтому собрал сборку без труда. Затем установил Ubuntu 22.10 на виртуальную машину (Virtual Box).

Как я делал свою первую игру

В настройках задал общую папку.

Как я делал свою первую игру

Для открытия папки без root потребуется вести команду, потом перезагрузи систему:

sudo adduser game vboxsf

Для запуска игры открой папку через терминал и запустите (файл должен быть исполняемым.)

chmod +x ./файл-игры — делает файл исполняемым.

./файл-игры — запуск игры.

Как я делал свою первую игру

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

Игра

Rumle - это платформер раннер, состоящий из 5 гонок. Прыгай и собирай монетки. Игра полностью бесплатна.

Как я делал свою первую игру
226226
45 комментариев

Молодец! Тут главное начать и не лениться, познавать азы и дальше изучать более углублённо.

Я конечно хреновый программист и разработчик, но вставлю свои пять копеек насчёт лагов. Открывайте форточку, начинаю душнить. В такой игре должно быть порядка 500 фпс, по сути не должно быть никаких лагов. Помню когда начинал изучать юнити, первое чему научили: никогда не нужно считать физику в апдейте. Для этого есть FixedUpdate. И сама физика должна считаться в FixedUpdate, он для этого и существует. Иначе вся физика будет завязана на фпс. Фпс просел - всё в игре замедлилось, фпс вырос в два раза - всё в игре ускорилось в 2 раза. Считывай нажатия клавиш в Update, а физику считай в FixedUpdate. Если под лагами имеешь ввиду что изображение не плавное, то поставь во всех объектах с rigidbody, collision detection - continuous, interpolate - interpolate. Тогда всё должно стать более плавным.

Ну и первым делом изучи разницу апдейта и фикседапдейта. Вкратце так: апдейт выполняется максимальное количество раз, сколько сможет, столько и выполнится за секунду. Грубо говоря, это твой фпс. А фикседапдейт выполняется каждые 0.02 секунды фиксировано и независимо от фпс (в настройках юнити можно как увеличить, так и уменьшить это значение). При значении по умолчанию 0.02, фикседапдейт выполнится 50 раз за секунду. Тут можно много чего написать, но лучше тебе самому это всё почитать или послушать, так как я хреновый учитель, сам уже толком ничего не помню.

P.S. время 5 утра, я двое суток не спал, так что мог что-то напутать

18
Ответить

Считывай нажатия клавиш в Update, а физику считай в FixedUpdate.Да, я знаю.) Лаги были из-за vsync.

Ответить

А вот ето пздц уважаемо! Команду не собирал, игру мечты на энтузиазме разрабатывать, а сам разобрался и сделал! КРАСАВА! Такие всегда и везде нужны.

14
Ответить

Ничего в этом не понимаю. Но зефирка милая

7
Ответить

Комментарий недоступен

5
Ответить

Красавчик! Очень круто всё описал и привел полезные ресурсы, спасибо!

Я так же как и ты преодолеваю все эти трудности в одиночку 😂очень ищу комьюнити чтобы обсуждать в телеграме и обмениваться опытом. Сейчас обучаюсь unity и c# по платному англоязычному большому курсу на udemy, в рамках него напишу 5 игр разного жанра (3 уже написал), а потом буду реализовывать игру моей мечты

2
Ответить