В гейм-дизайнеры с нуля. Часть 2

Программирование и отладка игры. Теория и полезные ссылки.
7 минут16781

Это вторая часть перевода статьи From Zero to Game Designer: how to start building video games even if you don’t have any experience. Автор оригинала — Angela He. Первая часть была посвящена разработке концепции игры и работе с графикой.

Программирование

Теория

Debug.Log('О боже! Пришло время кода!! ^_^');

С чего начать? Выберите игровой движок и среду разработки, в которой будете писать код (Integrated Development Environment  —  IDE). Список движков и IDE, которые я рекомендую, вы найдете ниже.

Что дальше? Пишите код. Не умеете? Не волнуйтесь, этому можно научиться.

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

На каком языке вы собираетесь программировать? C++? JavaScript? C#? У каждого свои особенности и назначение.

API (Application Programming Interface — программный интерфейс). Когда разберетесь с основами, вам потребуется изучить конкретный API вашего игрового движка. Программные интерфейсы — это арсенал мощных инструментов, обернутых в простые классы и функции, которыми вы можете пользоваться. API заметно упрощают жизнь.

Посмотрите на примеры проектов, сделанных на выбранном движке. У Unreal и Unity есть множество бесплатных примеров. Это позволит вам понять, как все может выглядеть на практике. К тому же это может натолкнуть на идею собственной игры. Моя первая игра родилась из знакомства с возможностями Corgi Engine.

if (you.getThisFar()==true) {

veryProud=true;

you.didIt(); //НАСТРОЕНИЕ: ОФИГЕННОЕ

}

Короткое воодушевляющее напутствие. Я знаю, что поначалу программирование пугает. Ничего не понятно, в попытке найти выход постоянно налетаешь на «стены», после очередных ошибок и неудач хочется все бросить. Это не значит, что у вас плохо с программированием. Писать код — всегда сложно. Неудивительно, если в начале пути вы теряетесь.

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

Важные принципы разработки игр

Ориентированность на объект. Когда код выстроен вокруг объектов, он легче воспринимается человеком.

Принципы именования. Называйте переменные, классы и все остальное так, чтобы сразу было ясно их назначение. Например, функцию ближнего боя (melee attack) лучше назвать meleeAttack(), а не mA() и не protectbutalsoattac(). Вам и всем, кто будет читать код, должно быть сразу ясно, о чем речь.

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

Шаблон проектирования Singleton («Одиночка»). Позволяет хранить все данные класса в одном месте.

Избегать статических переменных. Вне singleton’ов я бы не рекомендовала создавать статические переменные — они существуют на протяжении всей игры, медленно работают и могут вести к непредвиденным событиям.

Шаблон проектирования Observer («Наблюдатель»). Позволяет создать штуки, которые в своей работе зависят от других объектов — чтобы компьютеру не надо было проверять, что там с другим объектом происходит.

Важные особенности Unity

Сопрограммы (Coroutines). Интерфейс IEnumerator и сопрограммы позволяют начать делать что-то и продолжать определенное время, а затем остановиться. Я часто этим пользуюсь, чтобы создать визуальный эффект взрыва, задать движение с помощью функции Lerp или дождаться загрузки сцены, прежде чем работать с ее объектами.

«Скриптуемые объекты» (ScriptableObject). Содержат данные с меньшими накладными расходами, чем при наследовании скриптов от класса MonoBehaviour.

Ресурсы

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

Игровые движки

Самописные. Надо знать C/C++ и низкоуровневое программирование. Очень-очень низкоуровневое.

Unity (*). 2D/3D. Кроссплатформенный. Требует знания JavaScript/C# на среднем уровне.

Unreal Engine. 2D/3D. Надо знать C++ на среднем уровне. Обратите внимание: поддержка 2D у этого движка так себе.

Pixi.js (*). 2D. Надо знать JavaScript на среднем уровне. Web.

GameMaker Studio. 2D/3D. Кроссплатформенный. Надо знать GML. Подходит для новичков.

Corona. 2D. Кроссплатформенный. Надо знать Lua. Для начинающих.

Среды разработки (IDE)

Visual Studio Code (*). Для MacOS. Не лагает и может похвастаться всякими фишечками  — всплывающими подсказками и быстрой навигацией (⌘T).

Visual Studio (*). Для Windows.

MonoDevelop. Распространяется вместе с Unity. Часто лагает.

Бесплатные ресурсы для Unity

Море бесплатных дополнений и ресурсов для Unity вы найдете в официальном магазине Unity Asset Store, на сайтах GitHub, bitbucket и других. Материалы с GitHub и bitbucket я использую в каждом своем проекте.

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

TextMeshPro (*)

LeanTween (*)

Fungus

Corgi Engine

Dialogue System

Post Processing Stack

Keijiro Takahashi. Работает над Unity. Делает потрясающие свободные (open source) проекты с визуальными эффектами для Unity!

И последнее по порядку, но не по важности — мое средство № 1 для преодоления непоняток с кодом — Google!

Доводим проект до ума: отладка и оптимизация

Теория

О! Дочитали досюда?! Это просто замечательно  — вы молодец. Я серьезно. Если вы проделали такой большой путь, я бы хотела услышать о вашей игре. Напишите мне о ней!

Думаете, теперь все готово? Как вам сказать… С вероятностью 99,99999 % в игре есть баги. Так что самое время заняться тестированием.

Поиск ошибок и отладка (debugging)

Заставьте кого-нибудь (но не себя!) поиграть в вашу игру. Желательно в вашем присутствии: если человек столкнется с ошибкой, он может ее не заметить или затрудниться с описанием.

Попробуйте пройти игру на всех целевых платформах. Бывает, все работает в редакторе, но дает сбои на реальных устройствах. В Linux и особенно разных версиях Android все может пойти не так, как вы задумывали.

Ладно. Нашли баг — что дальше?

Посмотрите в консоль: нет ли там исключений. Уже видите? Отлично! Теперь найдите имя файла и номер строки, где исключение было выброшено. Если вы впервые слышите об исключениях, расспросите Google. А дальше сосредоточьтесь на том, что же пошло не так в уже известной строке.

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

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

Ну как, исправили баг? Давайте, спите уже! Утром все само починится, ведь это лишь дурной сон, правда?

Распространенные ошибки

Исключение NullReferenceException

var.doThing(); //выбрасывает NullReferenceException: Object reference not set to an instance of an object

В чем проблема: Вы пытаетесь что-то сделать с null-значением (несуществующей) переменной.

if(var != null)
{
var.doThing(); // безопасно выполняем необходимое!
}

SyntaxErrorException

Проблема: в коде синтаксические ошибки.

Как быстро исправить: в сообщении об исключении будет написано, какой символ дает ошибку. Исправьте этот символ.

Обратите внимание: если символ — двойная кавычка, убедитесь, что используете прямые кавычки, а не загнутые, которые доставляют много хлопот:

" //прямая
 //загнутая

Розовый или черный экран

Возможная проблема: какой-то шейдер не рендерится.

Возможная причина: вы используете 3D-шейдер в 2D-игре. Или какая-то из функций шейдера не поддерживается в нужной вам операционной системе. Всегда используйте в мобильных играх только мобильные шейдеры.

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

Общие советы по оптимизации

  • Установите желаемую частоту кадров в секунду. Для визуальной новеллы годится FPS на уровне 20, а шутеру от первого лица больше подойдут 60 кадров в секунду. Чем ниже частота кадров по умолчанию, тем меньше времени игра тратит на их отрисовку.
  • Анимация / частицы / отброс загороженной геометрии. Функция Occlusion Culling в Unity отвечает за рендеринг тех объектов, которые заслонены от камеры другими. Чего не видит камера, то не рисуют. Анимация персонажей, обновление частиц, отрисовка 3D-моделей — все это должно выполняться только в поле зрения камеры!

  • Сжимайте текстуры и звук. Для сжатия текстур используйте библиотеку Crunch. Воспроизводите потоковую музыку и декодируйте звук при загрузке.

  • Снижайте качество звука. Обратите внимание, что при сжатии звука потеря качества не всегда заметна человеческому уху.

Объединение объектов. Лучше не создавать и не уничтожать множество объектов одновременно — это ведет к пиковым нагрузкам на систему. Собирайте объекты в списки, очереди или другие структуры данных.

Такие вещи, как пули, обязательно надо собирать в пул, а не обрабатывать по одной.

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

Если хотите задачу потруднее:

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

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

В Unity используйте наборы контента (Asset Bundles) вместо папок с названием Resources. Наборы сэкономят память за счет подгрузки файлов из онлайн-хранилища (например, Dropbox) или с жесткого диска. Пока я мало этим пользовалась из-за недостаточно подробной документации.

Ресурсы

Все это создавалось для Unity, но можно использовать и с другими движками.

Скрипты

Оптимизация скриптов в Unity-играх (*).

Графика

Руководство по оптимизации UI в Unity (*).

Лучшие практики работы с графикой (*).

Память

Уменьшаем размер файлов для билда (*).

Память.

Оптимизация под платформы

Практическое руководство по мобильной оптимизации (*).

Соображения о производительности WebGL (*).

Размышления о работе с памятью в WebGL (*).

7 этапов оптимизации мобильных VR-игр от Olly.

Читать третью часть.

переводразработка игрgamedev
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!