Unity в действии. Мультиплатформенная разработка на C# - Джозеф Хокинг - E-Book

Unity в действии. Мультиплатформенная разработка на C# E-Book

Джозеф Хокинг

0,0

Beschreibung

Создание игр — увлекательное дело, а Unity делает его простым и доступным! Unity возьмет на себя всю тяжелую работу, и вы можете сосредоточиться на игре, графике и взаимодействии с пользователем. Поддержка C# и огромная экосистема готовых компонентов позволят даже начинающим разработчикам быстро перейти от идеи к реализации. Осваивать и получать практический опыт работы с инструментами Unity и высокотехнологичным механизмом визуализации вы будете на примерах игр в двумерной, трехмерной и виртуальной/дополненной реальности. Эту книгу можно смело назвать введением в Unity для профессиональных программистов. Джозеф Хокинг дает людям, имеющим опыт разработки, всю необходимую информацию, которая поможет быстро освоить новый инструмент и приступить к реальной работе. А учиться лучше всего на конкретных проектах и практических заданиях. Третье издание знаменитого бестселлера было полностью переработано. И самое главное — теперь в книге пойдет речь о дополненной и виртуальной реальности. Осваивайте Unity и быстрее приступайте к созданию собственных игр!

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 462

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Джозеф Хокинг
Unity в действии. Мультиплатформенная разработка на C#. 3-е межд. издание
2023

Переводчик С. Черников

Джозеф Хокинг

Unity в действии. Мультиплатформенная разработка на C#. 3-е межд. издание. — СПб.: Питер, 2023.

ISBN 978-5-4461-2266-0

© ООО Издательство "Питер", 2023

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

Предисловие

Созданием игр я начал заниматься в 1982 году. Это было непросто. Интернета в то время не было. Доступные ресурсы ограничивались небольшим количеством в основном ужасных книг и журналов с интересными, но запутанными фрагментами кода, а игровых движков попросту не существовало! Написание кода для игр было гонкой с огромным количеством препятствий.

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

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

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

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

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

Джесси Шелл (Jesse Schell), руководитель Schell Games, автор книги Art of Game Design

Введение

Программированием игр я занимаюсь уже много лет, но с Unity познакомился относительно недавно. Разработку игр я осваивал во времена, когда такого движка попросту не существовало; первая версия была выпущена только в 2005 году. С самого начала это был многообещающий инструмент разработки, но всеобщее признание он получил лишь после выхода нескольких версий. В частности, такие платформы, как iOS и Android (называемые мобильными), появились не так давно, и именно они повлияли на рост популярности Unity.

Изначально я рассматривал Unity как диковинный инструмент разработки, за развитием которого было интересно понаблюдать, но не использовать. В то время я писал игры для настольных компьютеров и сайтов, выполняя проекты для широкого круга клиентов. Я пользовался такими инструментами, как Blitz3D и Adobe Flash, удобными для программирования, но ограниченными в ряде других аспектов. Но по мере их устаревания я стал искать более совершенные средства разработки игр.

Я начал экспериментировать с Unity версии 3 и затем полностью переключился на этот инструмент, будучи разработчиком в компании Synapse Games. Изначально в Synapse мы занимались разработкой браузерных игр, но в итоге решили сосредоточиться на более перспективной платформе мобильных устройств. А затем все вернулось на круги своя, так как инструмент Unity позволял выполнять развертывание одного и того же исходного кода как на мобильных устройствах, так и в интернете!

Я всегда понимал важность передачи знаний, поэтому последние годы занялся преподаванием разработки игр. Во многом это обусловлено примерами, которые подавали мои наставники и преподаватели (возможно, об одном из моих учителей вы слышали — Рэнди Пауш (Randy Pausch) — незадолго до своей кончины в 2008 году он прочитал свою «Последнюю лекцию»). Я преподавал в нескольких школах и всегда хотел написать книгу о разработке игр.

Эта книга — отражение того, о чем я мечтал во времена моего изучения Unity. Одним из многочисленных достоинств Unity является огромное количество обучающих ресурсов, но, как правило, они представляют собой наборы отдельных фрагментов (ссылки на сценарии или не связанные друг с другом уроки), которые затрудняют поиск нужного материала. Мне же всегда хотелось получить книгу, объединяющую все необходимые знания, представленные в четкой и логически связанной манере, поэтому я написал такую книгу для вас. Моя целевая аудитория — это люди, уже имеющие навыки программирования, но не обладающие опытом работы с Unity и, возможно, никогда не занимавшиеся разработкой игр. Выбор проектов отражает мой опыт наработки навыков и уверенности в себе, который я в свое время получил, выполняя различные заказы в достаточно быстром темпе.

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

Благодарности

Я хотел бы поблагодарить издательство Manning Publications за предоставленную мне возможность написать данную книгу. В этом мне помогли редакторы, с которыми я работал, в том числе Робин де Йон (Robin de Jongh) и особенно Дэн Махари (Dan Maharry). Именно взаимодействие с ними сделало книгу намного лучше. Бекки Уитни (Becky Whitney) взяла на себя обязанности главного редактора третьего издания, в то время как Кэндис Уэст (Candace West) выполняла эту роль во втором издании. Мои искренние благодарности и многим другим людям, сотрудничавшим со мной в процессе написания и издания: Дейрдре Хиаму (Deirdre Hiam) — редактору проекта; Шэрон Уилки (Sharon Wilkey) — выпускающему редактору; Джейсону Эверетту (Jason Everett) — корректору и Михаэле Батинич (Mihaela Batinić) — ответственному редактору.

Книга только выиграла от пристального внимания рецензентов. Спасибо Аарону Шарим Рани (Aharon Sharim Rani), Алену Куньо (Alain Couniot), Алену Ломпо (Alain Lompo), Альберто Симоэсу (Alberto Simões), Брэдли Ирби (Bradley Irby), Бренту Бойлану (Brent Boylan), Крису Лундбергу (Chris Lundberg), Кристиану Антониоли (Cristian Antonioli), Дэвиду Московицу (David Moskowitz), Эрику Ханссону (Erik Hansson), Франческо Аргезе (Francesco Argese), Хильде ван Гизель (Hilde van Gysel), Джеймсу Мэтлоку (James Matlock), Яну Крокену (Jan Kroken), Джону Экли (John Ackley), Джону Гатри (John Guthrie), Хосе Сан Леандро (Jose San Leandro), Джозефу У. Уайту (Joseph W. White), Джастину Калледжа (Justin Calleja), Кенту Р. Спилнеру (Kent R. Spillner), Кришне Чайтанья Анипинди (Krishna Chaitanya Anipindi), Мартину Тидману (Martin Tidman), Максу Вайнбрауну (Max Weinbrown), Ненко Иванову Табакову (Nenko Ivanov Tabakov), Нику Кирсу (Nick Keers), Овайну Уильямсу (Owain Williams), Роберту Уолшу (Robert Walsh), Сатей Кумар Саху (Satej Kumar Sahu), Скотту Чоссе (Scott Chaussée) и Уолтеру Стоунбернеру (Walter Stoneburner). Отдельная благодарность техническому редактору Скотту Шоси (Scott Chaussee) и техническому корректору Кристоферу Хаупту (Christopher Haupt). Рене ван ден Берг (René van den Berg) и Шайло Моррис (Shiloh Morris) сыграли свою роль в выходе второго издания книги, а затем Рене был техническим корректором третьего издания, в то время как Робин Дьюсон занимался техническим редактированием. Хотелось бы также поблагодарить Джесси Шелл (Jesse Schell) за предисловие к книге.

Затем я хотел бы выразить свою признательность людям, помощь которых сделала мой опыт работы с Unity крайне плодотворным. Разумеется, этот список начинается с компании Unity Technologies, создавшей игровой движок Unity. Я также глубоко признателен и сообществу на сайте по разработке игр на Stack Exchange (https://gamedev.stackexchange.com). Данный сайт контроля качества я посещал практически ежедневно в период написания первого издания этой книги, учась у других и отвечая на чужие вопросы. Но сильнее всех к работе с Unity меня подтолкнул мой руководитель в фирме Synapse Games — Алекс Рива (Alex Reeve). Коллеги показали мне множество приемов и методов, которые я постоянно применяю при написании кода как в этой, так и во всех других работах, которыми я занимался с тех пор.

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

О книге

Кому стоит прочитать эту книгу

Третье издание книги «Unity в действии» посвящено программированию игр с помощью Unity. Это руководство можно считать введением в Unity для опытных программистов. Цель его крайне проста: научить людей, имеющих опыт программирования, но ни разу не сталкивавшихся с Unity, разрабатывать игры с помощью этого инструмента.

Учить разработке лучше всего на примерах проектов, заставляя обучающихся выполнять практические задания, и именно такой подход используется в данном случае. Темы представлены как этапы создания отдельных игр, и я настоятельно рекомендую вам в процессе чтения книги заняться разработкой этих игр при помощи Unity. Мы рассмотрим ряд проектов, каждому из которых посвящено несколько глав. Бывают книги, целиком посвященные одному крупному проекту, но такой подход исключает возможность чтения с середины, если информация в первых главах покажется вам неинтересной.

В этой книге более подробно изложены материалы, касающиеся программирования, чем в большинстве других изданий по Unity (особенно предназначенных для начинающих). Зачастую Unity представляют как набор функций, не требующих особых навыков программирования, что в корне неверно, так как без них невозможно производство коммерчески успешных продуктов. Если вы пока не имеете соответствующего опыта, советую обратиться к одному из множества различных сайтов с «бесплатными интерактивными уроками кодирования» (например, https://learnprogramming.online) и после изучения основ вернуться к чтению этой книги.

Выбор языка программирования не имеет особого значения; все примеры в книге написаны на C#, но они легко переводятся на другие языки. Часть I посвящена знакомству с новыми понятиями, и материал намеренно изложен со всей возможной скрупулезностью. Темы из части II книги более динамичны: вы можете сразу выполнять проекты в различных игровых жанрах. В книге также описывается развертывание игр на различных платформах, в том числе в интернете и на мобильных устройствах, но в целом мы не будем заострять на этом внимание, так как Unity не зависит от платформы.

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

Структура издания

Глава 1 знакомит с Unity — кросс-платформенной средой разработки игр. Вы узнаете о фундаментальной системе компонентов, лежащих в основе Unity, а также научитесь писать и выполнять базовые сценарии.

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

В главе 3 мы превратим демонстрационную программу в шутер от первого лица, применив метод «бросания луча» (от англ. raycasting) и основы искусственного интеллекта. Бросание луча, или рейкастинг (проведение в сцене линии и наблюдение за тем, что она пересекает), — полезная операция во всех вариантах игр.

Глава 4 посвящена импорту и созданию игровых ресурсов (ассетов, assets). Это единственная глава в книге, в которой код не играет центральной роли, так как каждому проекту требуются (базовые) модели и текстуры.

Глава 5 расскажет вам, как создать в Unity двумерную игру-головоломку. Хотя изначально этот инструмент предназначался исключительно для создания 3D-графики, сейчас в нем прекрасно поддерживается и 2D-графика.

В главе 6 продолжается объяснение принципов создания двумерных игр на примере платформера. В частности, мы реализуем элементы управления, имитацию законов физики и анимацию персонажа.

Глава 7 познакомит вас с новейшей GUI-функциональностью в Unity. Пользовательский интерфейс требуется для всех игр, а последние версии Unity могут похвастаться улучшенной системой создания пользовательского интерфейса.

Глава 8 покажет, как создать еще одну демонстрационную программу движения в трехмерном пространстве, однако на этот раз с точки зрения стороннего наблюдателя. Реализация элементов управления от третьего лица даст вам представление о ключевых математических операциях при работе с 3D-графикой, кроме того, вы научитесь работать с анимированными персонажами.

Глава 9 покажет способы реализации интерактивных устройств и элементов в игре. У игрока будет несколько способов управления этими устройствами, в том числе прямым касанием, прикосновением к пусковым устройствам внутри игры или нажатием кнопки контроллера.

Глава 10 учит взаимодействию с интернетом. Вы узнаете, как отправлять и получать данные с помощью стандартных технологий, таких как HTTP-запросы на получение с сервера данных XML и JSON.

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

В главе 12 мы объединим фрагменты из различных глав, чтобы получить в итоге полноценную игру. Кроме того, вы научитесь программировать элементы управления «укажи и щелкни», а также сохранять игру.

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

Затем идут четыре приложения, которые содержат дополнительную информацию о навигации по сцене, внешних инструментах, пакете Blender и учебных ресурсах.

О коде

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

Единственная программа, которая вам потребуется, — Unity; в книге используется версия Unity 2020.3.12, которая является текущей на момент написания этого текста. В некоторых главах иногда обсуждается другое ПО, но оно не оказывает решающего влияния на изучение основного материала и рассматривается для ознакомления.

ВНИМАНИЕ В Unity-проектах сохраняется информация о том, в какой версии программы они были созданы, и при попытке открыть их в другой версии выводится предупреждение. Если, открыв относящиеся к этой книге материалы, скачанные из интернета, вы увидите такое предупреждение, просто нажмите кнопку Continue.

Встречающиеся в книге листинги кода обычно демонстрируют, что нужно добавить или изменить в существующих файлах. Если это не первое появление файла с кодом, не следует заменять его полностью соответствующими листингами. Достаточно скачать рабочий проект целиком, но обучение будет намного более эффективным, если вы будете набирать все листинги вручную, используя примеры из проекта исключительно для ознакомления. Весь код доступен для скачивания на сайте издателя (https://manning.com/books/unity-in-action-third-edition), а также на сайте GitHub (https://github.com/jhocking/uia-3e).

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

Об авторе

Джо Хокинг (Joe Hocking) — инженер-программист, специализирующийся на разработке программного обеспечения (ПО) для интерактивных медиа. В настоящее время является сотрудником Qualcomm. Первое издание этой книги Джо написал, работая в Synapse Games, а большую часть книги, которую вы сейчас держите в руках, — уже будучи сотрудником BUNDLAR. Кроме того, он вел занятия в Университете Иллинойса в Чикаго, школе Института искусств Чикаго и Колумбийском колледже Чикаго. Джо живет в пригороде Чикаго с женой и двумя детьми. Его сайт: http://newarteest.com.

Иллюстрация на обложке

Книгу украшает иллюстрация, подписанная как «Облачение церемониймейстера Великого господина». Великим господином называли султана Османской империи. Иллюстрация взята из книги «Коллекция костюмов разных народов — античных и современных» Томаса Джеффериса, опубликованной в Лондоне между 1757 и 1772 годами. На титульном листе указано, что это раскрашенные вручную гравюры на меди, обработанные гуммиарабиком. Джефферис (1719–1771) носил звание «географ короля Георга III». Этот английский картограф был ведущим поставщиком карт того времени. Он гравировал и печатал их для нужд правительства и других официальных органов. Выпустил он и множество коммерческих карт и атласов, особенно Северной Америки. Он интересовался и национальной одеждой народов, населяющих исследуемые им земли, и собрал блестящую коллекцию различных нарядов, описав ее в четырех томах.

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

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

Часть I. Первые шаги

Настало время знакомства с Unity. Ничего страшного, если вы не имеете представления о том, что это такое! Я подробно опишу Unity и научу основам программирования игр с его помощью. Затем мы рассмотрим руководство по разработке простой игры в Unity. Первый проект познакомит вас с различными техниками, давая представление о том, как выглядит рабочий процесс. Итак, приступим к главе 1!

1. Знакомство с Unity

В этой главе

• Почему следует выбрать Unity.

• Как работает редактор Unity.

• Что представляет собой программирование в Unity.

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

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

Раз вы читаете эту книгу, значит, интересуетесь компьютерными технологиями и либо разрабатывали игры с помощью других инструментов, либо создавали программное обеспечение других типов, например приложения или веб-сайты. Создание видеоигр в своей основе не отличается от написания любого другого ПО; просто это другой уровень. К примеру, игра намного интерактивнее большинства веб-сайтов, а значит, потребуется код иного типа. Но в обоих случаях потребуются схожие навыки и процессы.

Тем, кто преодолел первое препятствие на пути к карьере разработчика игр, то есть изучил основы создания ПО, нужно сделать следующий шаг: перенести имеющийся опыт в игровую сферу и выбрать инструмент. И Unity — то, что вам нужно.

предупреждение по поводу терминологии

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

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

Первым делом зайдите на сайт https://unity.com, чтобы больше узнать об используемом программном обеспечении. Изначально предназначение Unity заключалось в создании трехмерных игр, однако сегодня Unity прекрасно работает и с двумерной графикой. Действительно, даже при демонстрации в 3D-проекте многие темы (сохранение данных, воспроизведение звука и т.д.) применимы к обоим стилям. В разделе 1.2 вы узнаете, как новичку установить Unity, но для начала давайте обсудим, почему стоит выбрать именно этот инструмент.

1.1. Достоинства Unity

Внимательно рассмотрим данное в начале главы определение: Unity — это профессиональный игровой движок, позволяющий создавать видеоигры для различных платформ. Это довольно простой ответ на вопрос: «Что такое Unity?». Но что конкретно он означает? И чем примечателен инструмент Unity?

1.1.1. Сильные стороны и преимущества Unity

Любой игровой движок предоставляет множество полезных функций. Реализованная на конкретном движке игра получает все его особенности, к которым добавляются пользовательские ассеты и код геймплея. В Unity есть моделирование физических сред, карты нормалей, преграждение окружающего света в экранном пространстве (Screen Space Ambient Occlusion, SSAO), динамические тени и т.д. Список можно продолжать бесконечно. Подобные наборы функциональных возможностей встречаются во многих игровых движках, однако у Unity есть два неоспоримых преимущества. Во-первых, это крайне производительный визуальный рабочий процесс, а во-вторых, сильная кросс-платформенная поддержка.

Визуальный рабочий процесс — достаточно уникальная вещь, выделяющая Unity из большинства сред разработки игр. Альтернативные инструменты разработки зачастую представляют собой набор разрозненных фрагментов, требующих контроля, а в некоторых случаях библиотеку, для работы с которой нужно настраивать собственную интегрированную среду разработки (Integrated Development Environment, IDE), цепочку сборки и т.д. В Unity же рабочий процесс привязан к тщательно продуманному визуальному редактору.

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

ПРИМЕЧАНИЕ В других инструментах, оснащенных центральным визуальным редактором, возможность написания сценариев зачастую поддерживается ограниченно и недостаточно гибко. Все, что создается для Unity, в конечном счете проходит через визуальный редактор, но основной интерфейс при этом может быть использован для связи проектов с запускаемым в игровом движке пользовательским кодом. Опытным программистам не стоит пренебрегать Unity, ошибочно считая это приложение чисто визуальным инструментом создания игр с ограниченной возможностью программирования!

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

Дополнением к высокой производительности, которую обеспечивает редактор, служит сильная кросс-платформенная поддержка набора инструментов Unity. Это означает, что игру можно не только развернуть на различных платформах (на персональном компьютере, в интернете, на мобильном устройстве или на консоли), но и использовать при этом инструменты разработки, работающие под управлением как Microsoft Windows, так и Apple macOS. Эта независимость от платформы во многом объясняется тем, что изначально приложение Unity предназначалось исключительно для компьютеров на macOS, а затем было перенесено на Windows. Первая версия появилась в 2005 году и поначалу поддерживала только Mac, но уже через несколько месяцев вышло обновление, позволяющее работать и с Windows.

В последующих версиях добавлялись новые платформы развертывания, например кросс-платформенный веб-плеер в 2006 году, iPhone в 2008-м, Android в 2010-м и даже такие игровые консоли, как Xbox и PlayStation. Позднее в Unity добавилась возможность развертки в WebGL — новом фреймворке для графики в веб-браузерах и даже появилась поддержка расширенной реальности (XR) — как виртуальной (VR), так и дополненной (AR) — таких платформ, как Oculus и VIVE. Немногие игровые движки поддерживают такое количество целевых платформ развертывания, как Unity, и ни в одном из них развертывание на разных платформах не осуществляется настолько просто.

Дополнением к этим основным достоинствам идет и третье, менее бросающееся в глаза преимущество в виде модульной системы компонентов, которая используется для конструирования игровых объектов. «Компоненты» в такой системе представляют собой комбинируемые пакеты функциональных элементов, поэтому объекты создаются как наборы компонентов, а не как жесткая иерархия классов. В результате получается альтернативный (и обычно более гибкий) подход к объектно-ориентированному программированию, в котором игровые объекты создаются путем объединения, а не наследования. Оба подхода схематично показаны на рис. 1.1.

 

Рис. 1.1. Сравнение наследования с композицией

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

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

1.1.2. Недостатки, о которых нужно знать

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

Также стоит отметить, что опытных программистов может обескуражить и сложность подключения внешних библиотек. Старые версии Unity вообще не поддерживали внешние библиотеки, поэтому их приходилось вручную копировать в каждый проект. Теперь Unity поставляется вместе с менеджером пакетов, а библиотеки (или пакеты) предоставляются из центрального общего хранилища. Эти пакеты отлично подходят для дополнительных функций, которые предоставляет Unity (Unity не включает автоматически функциональность, которая вам не нужна в каждом отдельном проекте), и в будущих главах вам иногда придется устанавливать пакеты для таких вещей, как расширенная обработка шрифтов. Однако создание собственных пакетов может быть непростым делом, что затрудняет совместное использование кода в нескольких проектах. Возможно, вам будет проще вручную копировать код между проектами и устранять любые несоответствия версий в дальнейшем, но это не является идеальным компромиссом.

ПРИМЕЧАНИЕ Раньше существенным недостатком была сложность работы с системами контроля версий (такими, как Git или Subversion), но в более поздних версиях Unity все прекрасно работает. В Сети можно наткнуться на устаревшие сведения, в которых утверждается, что Unity не работает с системами контроля версий, но на более новых ресурсах есть указания, какие папки и файлы проекта следует поместить в репозиторий. Для начала ознакомьтесь с документацией (http://mng.bz/BbhD) или обратите внимание на файл .gitignore, поддерживаемый GitHub (http://mng.bz/g7nl).

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

Например, в главе 7 объясняется, как разрабатывать пользовательский интерфейс (UI) для игр на Unity. На самом деле в Unity есть три системы пользовательского интерфейса (которые сравниваются на сайте http://mng.bz/r60X) из-за последовательно разработанных систем, улучшающих своих предшественников. В этом учебнике рассматривается вторая система пользовательского интерфейса (Unity UI, или uGUI), потому что она все еще предпочтительнее незавершенной третьей (UI Toolkit), но я не удивлюсь, если через несколько лет UI Toolkit дорастет до уровня, пригодного для эксплуатации. Тем временем новичкам может быть трудно определиться с выбором подхода к пользовательскому интерфейсу.

1.1.3. Примеры игр, созданных в Unity

Итак, вы познакомились с сильными и слабыми сторонами Unity, но, возможно, вы до конца не уверены в том, что этот инструмент позволяет получить первоклассные результаты. Зайдите в галерею Unity на странице https://unity.com/case-study и полюбуйтесь постоянно обновляемым списком игр и симуляторов, созданных этим инструментом. Я, в свою очередь, приведу небольшой список игр, демонстрирующих разные жанры и платформы развертывания. Все названия игр являются торговыми марками соответствующих игровых компаний, а авторские права на скриншоты принадлежат этим компаниям, все права защищены.

Настольные (Windows, Mac, Linux) и консольные (PlayStation, Xbox, Switch) игры

Поскольку редактор Unity работает на одной платформе с приложением, зачастую проще всего развернуть игру на Windows или Mac. Между тем консольные игры, разработанные в Unity, часто выпускаются и на ПК благодаря тому, что Unity является кросс-платформенной средой разработки. Примеры настольных и консольных игр в различных жанрах:

• Fall Guys (рис. 1.2) — хаотическая 3D экшен-игра, разработанная компанией Mediatonic (торговые марки Mediatonic Limited);

 

Рис. 1.2. Fall Guys

• Cuphead (рис. 1.3) — 2D-платформер, разработанный студией MDHR.

 

Рис. 1.3. Cuphead

Игры для мобильных устройств (iOS, Android)

Приложение Unity также позволяет развертывать игры на мобильных платформах, таких как iOS (смартфонах iPhone и планшетах iPad) и Android (смартфонах и планшетах). Примеры мобильных игр в различных жанрах:

• Monument Valley 2 (рис. 1.4) — игра-головоломка, разработанная компанией ustwo;

• Guns of Boom (рис. 1.5) — шутер от первого лица, разработанный компанией Game Insight;

• Animation Throwdown (рис. 1.6) — коллекционная карточная игра, созданная студией Kongregate.

 

Рис. 1.4. Monument Valley 2

 

Рис. 1.5. Guns of Boom

 

Рис. 1.6. Animation Throwdown

Виртуальная реальность (Oculus, VIVE, PlayStation VR)

С помощью Unity можно разворачивать XR-платформы, включая гарнитуры виртуальной реальности. Далее приведены примеры таких VR игр в различных жанрах.

• Beat Saber (рис. 1.7) — музыкальная игра, разработанная студией Beat Games;

• I Expect You to Die (рис. 1.8) — игра-головоломка с побегом, разработанная компанией Schell Games.

 

Рис. 1.7. Beat Saber

 

Рис. 1.8. I Expect You to Die

Как видно из этих примеров, Unity позволяет создавать хорошие коммерческие проекты. Но, несмотря на значительные преимущества Unity над другими инструментами, новички могут недооценивать важность программирования.

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

1.2. Работа с Unity

Выше уже много было сказано о преимуществах встроенного в Unity визуального редактора с точки зрения производительности. Пришло время познакомиться с его интерфейсом и узнать, как он работает. Если на вашем компьютере еще нет приложения, скачайте его с сайта https://unity.com и нажмите кнопку GetStarted. После этого вы увидите детализацию по различным предлагаемым планам подпис­ки. Все, что описано в книге, работает в бесплатной версии, поэтому выберите вкладку Individual и нажмите кнопку под бесплатной версией Personal. Платные версии Unity отличаются в основном условиями коммерческого лицензирования, а не базовой функциональностью.

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

На самом деле вы загрузите облегченный менеджер установки, а не основное приложение Unity. Это приложение-менеджер, называемое Unity Hub, предназначено для упрощения установки и одновременного использования нескольких версий Unity. Как показано на рис. 1.9, установка редактора будет первым, что  произойдет, когда вы запустите Unity Hub. Установите любую из рекомендуемых по умолчанию версий; в издании используется Unity 2020.3.12 (текущая версия по умолчанию на момент написания этой книги). Если позже вам потребуются дополнительные версии Unity (доступны более новые версии, чем по умолчанию), нажмите Installs в боковом меню Unity Hub.

 

Рис. 1.9. Unity Hub при первом запуске по сравнению с последующим

СОВЕТ К тому времени, когда вы будете читать эту книгу, скорее всего, будут выпущены новые версии Unity. Расширенные возможности изменятся, и возможно, даже внешний вид интерфейса будет другим, но фундаментальные концепции останутся актуальными. Объяснения, приведенные в этом издании, в целом будут применимы к любой версии Unity.

ВНИМАНИЕ Приложение знает, в какой версии Unity были созданы проекты, и выдаст предупреждение, если вы попытаетесь открыть их в другой версии. Иногда это не имеет значения (в частности, при открытии примеров из этой книги), а в отдельных случаях вам потребуется открыть проект в нужной вам версии.

Продолжая установку редактора, перейдите на вкладку Learn, чтобы загрузить первый проект. Выберите любой проект для ознакомления (вы все равно не будете много с ним работать), но обратите внимание, что на рис. 1.10 показан Karting. Unity загрузит и запустит выбранный проект. Может высветиться преду­преждение об импорте файлов для настройки нового проекта; имейте в виду, что импортирование займет несколько минут.

Как только новый проект будет окончательно загружен, выберите Load Scene, чтобы убрать начальное всплывающее окно, или перейдите в раздел Assets/Karting/Scenes/ в менеджере файлов в нижней части редактора и дважды щелк­ните MainScene (файлы сцен имеют значок куба Unity). Вы должны увидеть окно, похожее на изображенное на рис. 1.10.

 

Рис. 1.10. Элементы интерфейса в Unity

Интерфейс Unity состоит из следующих частей: вкладка Scene, вкладка Game, панель инструментов, вкладка Hierarchy, панель Inspector, вкладки Project и Console. Каждая часть имеет собственное предназначение, но все они играют важную роль в цикле создания игры.

• Просмотр файлов выполняется на вкладке Project.

• Вы можете расположить объекты в текущей сцене с помощью вкладки Scene.

• Панель инструментов предоставляет элементы управления сценой.

• На вкладке Hierarchy путем перетаскивания можно менять связь между объектами.

• Панель Inspector отображает сведения о выделенных объектах и показывает связанный с ними код.

• Тестирование результатов осуществляется на вкладке Game, а сообщения об ошибках появляются на вкладке Console.

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

1.2.1. Вкладка Scene, вкладка Game и панель инструментов

Наиболее заметная часть интерфейса — расположенная в центре вкладка Scene. Именно здесь мы можем увидеть, как выглядит мир игры, и перемещать объекты по сцене. Сеточные объекты в сцене, как им и положено, представлены в виде сеток. Можно наблюдать и другие объекты, представленные различными значками и цветными линиями: камеры, источники света, источники звука, области столкновений и т.п. Разумеется, эта картинка отличается от того, что будет демонстрироваться в процессе игры, — рассматривать сцену можно, не ограничиваясь игровым представлением.

ОПРЕДЕЛЕНИЕСеточным объектом (mesh object) называется объект, видимый в пространстве. Визуальные эффекты в трехмерной графике создаются из множества соединенных друг с другом линий и фигур, формирующих сетку.

Предпросмотр игры отображается на вкладке Game, расположенной рядом с вкладкой Scene (переход с вкладки на вкладку осуществляется в верхнем левом углу области отображения). Интерфейс содержит и другие элементы, сконструированные подобным образом; для изменения отображаемого ими содержимого достаточно перейти на другую вкладку. После запуска игры в этом окне отображается «игровой вид». При этом переходить на вкладку Game не нужно, переключение выполняется автоматически.

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

Для запуска игры достаточно нажать кнопку Play над вкладкой Scene. Вся верхняя часть интерфейса занята так называемой панелью инструментов (Toolbar), и кнопка Play находится как раз в центре этой панели. На рис. 1.11 из всего интерфейса редактора для наглядности оставлена только панель инструментов с расположенными под ней вкладками Scene/Game.

 

Рис. 1.11. Усеченный вариант редактора, демонстрирующий только панель инструментов и вкладки Scene и Game

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

Правую сторону панели инструментов занимают выпадающие меню с перечнем макетов (layouts) и слоев (layers). Я уже упоминал о гибкости и возможностях настройки интерфейса Unity. Поэтому в нем и существует меню Layouts, позволяющее переходить от одного варианта компоновки к другому. Меню Layers относится к расширенным функциональным возможностям, которые мы пока не будем рассматривать (о слоях идет речь в следующих главах).

1.2.2. Мышь и клавиатура

Навигация по сцене осуществляется с помощью мыши и набора клавиш-модификаторов, влияющих на результат манипуляций с мышью. Главные операции — это движение (move), вращение (orbit) и масштабирование (zoom). Действия, необходимые для совершения каждой из этих операций, зависят от типа мыши и описаны в приложении A. Эти три движения включают нажатие и перетаскивание при удержании нажатыми клавиш Alt и Ctrl (или Option и Command на компьютерах Mac соответственно). Потренируйтесь в манипуляции объектами сцены, чтобы понять, как выполняются перемещение, вращение и масштабирование.

СОВЕТ Хотя работать в Unity можно и с двухкнопочной мышью, рекомендую приобрести мышь с тремя кнопками (не сомневайтесь, в Mac она тоже работает).

Преобразование объектов также осуществляется посредством трех вышеупомянутых операций. Более того, каждому типу навигации соответствует собственное преобразование: перенос (translate), поворот (rotate) и изменение размеров (scale). Рисунок 1.12 демонстрирует эти преобразования на примере куба.

 

Рис. 1.12. Три варианта преобразования: перенос, поворот и изменение размеров (более светлые линии обозначают исходное состояние объекта)

Выделенный объект сцены можно двигать (или, если брать более точный термин, перемещать), поворачивать и указывать его размер. Возвращаясь к маневрам навигации по сцене, движение (move) будет соответствовать переносу (translate) камеры, вращение (orbit) — повороту (rotate), а масштабирование (zoom) — изменению размеров (scale). Смена этих операций осуществляется не только кнопками панели инструментов, но и нажатием клавиш W, E и R. При входе в режим преобразования у выделенного объекта появляются цветные стрелки или окружности. Это габаритный контейнер преобразования (transform gizmo), перетаскивание которого меняет вид объекта.

Рядом с кнопками преобразований находится четвертая кнопка — инструмент Rect, позволяющий перейти к работе с двумерной графикой и объединяющий в себе операции движения, поворота и изменения размеров. Аналогично пятая кнопка предназначена для инструмента, соединяющего в себе те же операции, но для 3D-объектов. Лично я предпочитаю работать с тремя преобразованиями по отдельности, но для вас комбинированные инструменты могут оказаться более удобными.

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

А теперь посмотрим на остальные фрагменты интерфейса.

1.2.3. Вкладка Hierarchy и панель Inspector

На левой стороне экрана расположилась вкладка Hierarchy, а на правой — панель Inspector (рис. 1.13). Вкладка Hierarchy содержит список всех объектов сцены в виде древовидной структуры, ветки которой вложены друг в друга в соответствии с иерархическими связями между этими объектами. По сути, эта вкладка позволяет выбирать объекты по именам, избавляя от необходимости искать в сцене нужный объект вручную. Иерархические связи объединяют объекты групп, визуально оформляя их в виде папок, и дают возможность за одну операцию переместить целую группу объектов.

 

Рис. 1.13. Вкладка Hierarchy и панель Inspector

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

1.2.4. Вкладки Project и Console

Нижнюю часть экрана занимают вкладки Project и Console (рис. 1.14). В данном случае мы видим пример такой же организации элементов интерфейса, как и у вкладок Scene и Game, что легко позволяет переходить от одного представления к другому.

 

Рис. 1.14. Вкладки Project и Console

На вкладке Project отображаются все ресурсы проекта (графические фрагменты, код и т.п.). В левой части этой вкладки находится список папок проекта; при выделении папки справа отображаются находящиеся в ней файлы. По сути, это такой же список, как и на вкладке Hierarchy, но если эта вкладка показывает перечень объектов сцены, то на вкладке Project представлены файлы, которые могут быть не включены ни в одну конкретную сцену (в том числе и сами файлы сцен — сохраненная сцена появляется на вкладке Project!).

СОВЕТ Вкладка Project дублирует содержимое папки Assets на диске. Не рекомендуется удалять или перемещать файлы непосредственно в этой папке в проводнике вашей ОС. Выполняйте эти операции на вкладке Project, а о синхронизации с папкой Assets позаботится Unity.

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

1.3. Подготовка к программированию в Unity

Теперь рассмотрим, как в Unity выглядит процесс программирования. Компоновка игровых ресурсов происходит в визуальном редакторе, но для обеспечения интерактивности игры требуется управляющий ассетами код. Сложное программирование в Unity осуществляется с использованием C#.

Запустите Unity и создайте новый проект: выберите New в Unity Hub или, если приложение Unity уже запущено, нажмите FileNewProject. Задайте имя будущей программе, оставьте 3D-шаблон по умолчанию (в последующих главах речь пойдет о 2D) и укажите место, куда вы хотели бы ее сохранить. Проект Unity представляет собой обычный каталог с файлами различных ресурсов и настроек, поэтому вы можете сохранять его в любом месте на своем компьютере. Нажмите кнопку CreateProject, и Unity ненадолго исчезнет, чтобы создать необходимую папку.

В качестве альтернативы вы можете открыть образец из главы 1. Я настоятельно рекомендую вам попробовать следовать предстоящим инструкциям в новом проекте, а на готовый пример посмотреть только потом, чтобы проверить свою работу, но это остается на ваше усмотрение. Выберите Add в Unity Hub, чтобы добавить папку загруженного проекта в список, а затем щелкните на проекте в списке.

ВНИМАНИЕ Если вы открываете пример проекта из книги, а не создаете новый проект, Unity может выдать следующее сообщение: Rebuilding Library because the asset database could not be found! Оно связано с папкой Library открываемого проекта; этот каталог содержит файлы, генерируемые Unity и используемые в процессе работы, но редактор не считает нужным загружать их по умолчанию.

Когда Unity появится снова, вы увидите пустую сцену. Давайте посмотрим, как в Unity происходит запуск программ.

1.3.1. Запуск кода в Unity: компоненты сценария

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

ПРИМЕЧАНИЕ В терминологии Unity файлы с кодом принято называть сценария­ми, или скриптами. Значение этого определения взято из JavaScript, так как код выполняется внутри игрового движка Unity, а не превращается после компиляции в самостоятельный исполняемый файл. Но здесь легко запутаться, так как многие определяют данный термин по-другому. К примеру, скриптами иногда называют автономные служебные программы (утилиты). В Unity же они больше напоминают индивидуальные классы ООП, а скрипты, присоединенные к объектам в сцене, — экземпляры объектов.

По этому описанию вы, наверное, уже догадались, что сценарии в Unity представляют собой компоненты. Но следует отметить, что в эту группу попадают не все сценарии, а только наследующие от класса MonoBehaviour — базового класса скриптов-компонентов. Он определяет способ присоединения компонентов к игровым объектам, и наследование от него дает пару автоматически запускаемых методов (показанных в листинге 1.1), которые вы можете переопределить. Это метод Start(), вызываемый единожды при активации объекта (обычно так происходит сразу после загрузки сцены с этим объектом), и вызываемый в каждом кадре метод Update(). Соответственно, код будет запущен, если вставить его в эти предопределенные методы.

ОПРЕДЕЛЕНИЕКадром (frame) называется одна итерация зацикленного игрового кода. Практически все видеоигры (не только в Unity, но и вообще) строятся вокруг основного игрового цикла. То есть его код выполняется до тех пор, пока запущена игра. На каждой итерации цикла происходит прорисовка экрана — откуда, собственно, и возник термин кадр (по аналогии с набором статичных кадров в фильме).

Листинг 1.1. Шаблон кода для базового компонента сценария

 

Именно так выглядит файл в момент создания нового сценария на языке C#: минимальный шаблонный код, определяющий корректный компонент Unity. Существует шаблон сценария, скрытый в недрах Unity. При создании нового сценария приложение копирует этот шаблон и переименовывает класс в соответствии с именем файла (в моем случае это HelloWorld.cs). В Unity также добавлены и пустые оболочки методов Start() и Update(), так как именно из этих методов чаще всего вызывается пользовательский код.

Чтобы создать скрипт, откройте меню Assets, наведите указатель мыши на строчку Create и выберите на открывшейся дополнительной панели команду C# Script. Обратите внимание, что в меню Assets и GameObjects есть пункты Create, но это разные команды. Альтернативным способом доступа к нужному нам меню является щелчок правой кнопкой мыши в произвольной точке вкладки Project. Введите имя нового сценария, например HelloWorld. Чуть позже, на рис. 1.16, вы увидите, что можно перетащить файл сценария мышью на произвольный объект сцены. Дважды щелкните на значке сценария, и он автоматически откроется в другой программе, о которой мы поговорим далее.

1.3.2. Использование редактора Visual Studio, входящего в комплект IDE

Программирование осуществляется не внутри Unity, код существует в виде отдельных файлов, местоположение которых вы указываете. Файлы сценариев могут создаваться в Unity, но изначально они будут пустыми. Поэтому потребуется текстовый редактор или IDE, чтобы написать в них код. В комплекте с Unity поставляется Microsoft Visual Studio, интегрированная среда разработки (IDE) для языка C# (рис. 1.15). Более подробную информацию об этом ПО можно получить на сайте https://visualstudio.microsoft.com.

 

Рис. 1.15. Фрагменты интерфейса Visual Studio

ПРИМЕЧАНИЕ Если Unity открывает не Visual Studio, а другую IDE, вам может понадобиться переключить настройки внешних инструментов. Перейдите в Preferences External ToolsExternal Script Editor, чтобы выбрать IDE.

ПРИМЕЧАНИЕ Visual Studio объединяет файлы в группы, называемые решениями (solution). Приложение Unity автоматически генерирует решение, содержащее все файлы сценариев, поэтому, как правило, об этом можно не беспокоиться.

Существуют различные варианты Visual Studio (многие программисты предпочитают Visual Studio Code), однако вы вправе использовать иную IDE, например JetBrains Rider. Переключиться на другую IDE так же просто, как перейти к внешним инструментам в настройках Unity. Я обычно использую Visual Studio для Mac. Но если вы захотите воспользоваться сторонней IDE, у вас не возникнет проблем с изучением материала данной книги. Далее я больше не буду упоминать об IDE.

Всегда помните, что в Visual Studio код только пишется, но не запускается; IDE — это всего лишь хорошо оснащенный текстовый редактор, а воспроизводить код следует нажатием кнопки Play в программе Unity.

1.3.3. Вывод на консоль: Hello World!

Итак, в нашем проекте появился пустой сценарий, но пока отсутствует объект, к которому этот скрипт можно было бы присоединить. Вспомните рис. 1.1, демонстрирующий работу системы компонентов; любой сценарий — это тоже компонент, поэтому его нужно добавить к какому-то объекту.

Выберите в меню GameObject команду CreateEmpty, и на вкладке Hierarchy появится пустой объект с именем GameObject. Перетащите значок скрипта с вкладки Project на вкладку Hierarchy, а именно на строчку GameObject. Как показано на рис. 1.16, если присоединение сценария является допустимой операцией, компонент подсвечивается. В нашем случае сценарий будет связан с объектом GameObject.

Чтобы убедиться в успешном исходе операции, выделите GameObject и посмотрите на панель Inspector. Там должны отобразиться два компонента: Transform — базовый компонент положения/ориентации/масштаба, присутствующий у всех объектов, который невозможно удалить, а сразу под ним — ваш сценарий.

ПРИМЕЧАНИЕ В конце концов вы привыкнете перетаскивать объекты друг на друга. Этим способом в Unity создается огромное количество связей, а не только привязка сценариев к объектам.

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

 

Рис. 1.16. Связывание сценария с объектом GameObject

 

Рис. 1.17. Связанный сценарий на панели Inspector

Дважды щелкните на сценарии, чтобы открыть его и вернуться к листингу 1.1. Знакомство с новой средой программирования всегда начинается с вывода на экран текста HelloWorld!, поэтому добавьте в метод Start() строчку, показанную в листинге 1.2.

Листинг 1.2. Сообщение для вывода на консоль

 

Команда Debug.Log() выводит сообщение на вкладку Console. Строка с этой командой входит в метод Start(), потому что данный метод однократно вызывается после активации объекта. Другими словами, после нажатия кнопки Play в редакторе метод Start() будет вызван всего один раз. Когда вы добавите команду регистрации, обязательно сохраните скрипт и нажмите кнопку Play в программе Unity. Откройте вкладку Console. Там появится сообщение HelloWorld!. Поздравляю, вы написали свой первый сценарий для Unity! В следующих главах код будет намного сложнее, но сейчас вы сделали важный первый шаг.

ВНИМАНИЕ Всегда помните о необходимости сохранения файла после внесения изменений в сценарий! Довольно распространенной ошибкой является корректировка кода, а затем немедленное нажатие кнопки Play без сохранения, в результате чего игра продолжает использовать код, который был до того, как вы его скорректировали.

этапы написания сценария Hello World!

Кратко перечислим действия, выполнявшиеся при чтении последних страниц.

1. Создание нового проекта.

2. Создание нового скрипта на языке C#.

3. Создание пустого объекта GameObject.

4. Перетаскивание сценария на этот объект.

5. Добавление к сценарию команды регистрации.

6. Нажатие кнопки Play.

Теперь сцену можно сохранить; появится файл с расширением .unity и с иконкой Unity. Этот файл представляет собой снимок всего, что есть в игре в данный момент, что позволяет в дальнейшем легко загрузить сцену в программу. Сохранение этой сцены может показаться бессмысленным, потому что она слишком простая (у нас всего один пустой объект GameObject), но если вы не сохраните ее и захотите вернуться к ней в будущем, она окажется пустой.

Ошибки в сценарии

Чтобы посмотреть, каким образом Unity указывает на ошибки, специально сделайте опечатку в сценарии HelloWorld. Даже лишняя скобка приведет к появлению на вкладке Console сообщения об ошибке:

 

Ошибка сценария, отображаемая на вкладке Console

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

Краткие итоги главы

• Unity — это мультиплатформенный инструмент разработки.

• Визуальный редактор Unity состоит из нескольких разделов, работающих в связке друг с другом.

• Сценарии присоединяются к объектам как компоненты.

• Код для скриптов пишется в Visual Studio.

2. Создание демонстрационного 3D-проекта

В этой главе

• Знакомство с трехмерным координатным пространством.

• Размещение в сцене игрока.

• Создание сценария перемещения объектов.

• Реализация элементов управления персонажем в игре от первого лица.

Глава 1 завершилась описанием традиционного способа знакомства с новыми средствами программирования — написанием программы «Hello World!». Пришло время погрузиться в более сложный Unity-проект с элементами интерактивности и графикой. Вы поместите в сцену объекты и напишете код, позволяющий игроку перемещаться по ней. По сути, это будет аналог игры Doom без монстров (примерно как на рис. 2.1). Визуальный редактор Unity позволяет новым пользователям сразу приступить к сборке трехмерного прототипа без предварительного написания шаблонного кода (для таких вещей, как инициализация 3D-вида или установка цикла рендеринга).

Хотя на данном этапе высок соблазн немедленно заняться созданием сцены, особенно с учетом крайней простоты проекта, имеет смысл немного притормозить и продумать порядок своих действий, так как вы новичок.

Рис. 2.1. Снимок экрана трехмерной демоверсии (по сути, это Doom без монстров)

ПРИМЕЧАНИЕ Помните, что проект для каждой главы можно скачать с сайта книги http://mng.bz/VBY5. Сначала откройте проект в Unity, а затем главную сцену (часто называемую просто Сценой, или Scene) для запуска и проверки. Пока вы учитесь, я рекомендую вам самостоятельно набирать весь код и использовать загруженный пример исключительно для справки.

2.1. Подготовка

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

2.1.1. Планирование проекта

Перед тем как приступить к программированию, всегда нужно остановиться и спросить себя: «Что я собираюсь создать?». Проектирование игр — весьма обширная тема, которой посвящено множество книг. К счастью, для наших целей достаточно мысленно представлять структуру будущей сцены. Первые проекты будут несложными, чтобы лишние детали не мешали вам изучать принципы программирования, а задумываться о разработке более высокоуровневого проекта можно (и нужно!) только после того, как вы освоите основы разработки игр.

Вашим первым проектом станет создание сцены из типичного шутера от первого лица (First-person Shooter, FPS). Мы создадим комнату, по которой можно перемещаться, при этом игроки будут наблюдать окружающий мир с точки зрения их игрового персонажа и будут управлять этим персонажем посредством мыши и клавиатуры. Все интересные, но сложные элементы готовой игры мы пока отбросим, чтобы сконцентрироваться на основной задаче — перемещениях в трехмерном пространстве. Рисунок 2.2 иллюстрирует план проекта — перечень действий, придуманный мной.

1. Разработка комнаты: создание пола, внешних и внутренних стен.

2. Размещение источников света и камеры.

3. Создание игрока как объекта (в том числе и фиксация камеры к его «голове»).

4. Написание скриптов движения: повороты при помощи мыши и перемещение при помощи клавиатуры.

Рис. 2.2. Сценарий трехмерного демонстрационного ролика

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

Мы начинаем с игры от первого лица, чтобы снизить требования к художественному оформлению, — в играх от первого лица «себя» игрок не видит, поэтому вполне допустимо придать персонажу форму цилиндра, на верхнем основании которого закреплена камера! Теперь осталось понять, как функционируют трехмерные координаты, чтобы вы смогли легко вставлять объекты в сцены в визуальном редакторе.

2.1.2. Трехмерная система координат

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

Все сводится к числам, указывающим положение точки в пространстве. Сопоставление этих чисел с пространством происходит через оси системы координат. На школьных уроках математики вы наверняка видели и использовали оси X и Y (рис. 2.3) для присваивания координат различным точкам на листе бумаги. Это так называемая декартова система координат.

Две оси дают вам двумерные координаты, все точки которой лежат в одной плоскости. Трехмерное пространство задается уже тремя координатными осями. Так как ось X располагается на странице горизонтально, а ось Y — вертикально, третья ось должна как бы «протыкать» страницу, располагаясь перпендикулярно осям X и Y. Рисунок 2.4 демонстрирует оси X, Y и Z для трехмерного координатного пространства. У всех элементов, расположенных в сцене (игрок, стена и т.п.), будут координаты X, Y и Z.

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

Рис. 2.3. Координаты по осям X и Y определяют положение точки в двумерном пространстве

Рис. 2.4. Координаты по осям X, Y и Z определяют точку в трехмерном пространстве

ПРАВАЯ И ЛЕВАЯ СИСТЕМЫ КООРДИНАТ

Положительное и отрицательное направления каждой оси выбираются произвольным образом, в обоих случаях система координат прекрасно работает. Главное, используя инструмент для обработки 3D-графики (инструменты анимации, разработки и т.п.), всегда выбирать одну и ту же систему координат.

Впрочем, практически всегда ось X указывает вправо, а ось Y — вверх; разница между инструментами в основном состоит в том, что где-то ось Z «выходит» из страницы, а где-то «входит» в нее. Эти два варианта называют «правой» и «левой» системами координат. Как показано на рисунке, если большой палец расположить вдоль оси X, а указательный — вдоль оси Y, средний палец задаст направление оси Z.

У левой и правой рук ось Z ориентирована в разных направлениях

В Unity, как и во многих других приложениях для работы с компьютерной графикой, используется левосторонняя система координат. Однако существует множество инструментов, в которых применяется и правосторонняя (например, OpenGL). Помните об этом, чтобы не растеряться, столкнувшись с другими направлениями координатных осей.

Теперь, когда у вас есть не только план действий, но и представление о том, как с помощью координат задать положение объекта в трехмерном пространстве, приступим к работе над сценой.

2.2. Начало проекта: размещение объектов

Итак, начнем с создания объектов и размещения их в сцене. Первыми будут статичные декорации — пол и стены. Затем выберем место для источников света и камеры. Последним создадим игрока — это будет объект, к которому вы добавите скрипты, перемещающие его по сцене. Рисунок 2.5 демонстрирует вид редактора после завершения работы.

Давайте создадим наш новый проект (мы рассматривали этот процесс в главе 1). Выберите New в Unity Hub (или FileNew Project в редакторе) и затем в появившемся окне введите имя проекта. Заполнение сцены мы начнем с создания наиболее очевидных объектов.

Рис. 2.5. Сцена в редакторе с полом, стенами, источниками света, камерой и игроком

2.2.1. Декорации: пол, внешние и внутренние стены

В расположенном в верхней части экрана меню GameObject наведите указатель мыши на строчку 3DObject, чтобы открыть выпадающее меню. Выберите в нем вариант Cube (позднее вы поработаете и с другими фигурами, такими как Sphere и Capsule). Отредактируйте имя, положение и масштаб появившегося в сцене куба таким образом, чтобы получить пол; значения, которые следует присвоить параметрам этого объекта на панели Inspector, показаны на рис. 2.6 (для превращения куба в пол его нужно растянуть).

ПРИМЕЧАНИЕ Единицы измерения положения могут выбираться произвольным образом, главное, чтобы они были одинаковы для всех элементов сцены. Чаще всего в качестве единицы измерения фигурирует метр, и я обычно использую именно его, но бывают случаи, когда я выбираю футы. Мне даже доводилось видеть людей, которые считали, что размеры в сцене измеряются в дюймах!

Повторите описанную последовательность для создания внешних стен комнаты. Можно каждый раз задействовать новый куб или копировать существующий объект, используя стандартные сочетания клавиш. Двигайте, поворачивайте и изменяйте размеры стен, чтобы получить показанный на рис. 2.5 периметр. Экспериментируйте с различными значениями (например, 1, 4, 50 для полей Scale) или воспользуйтесь инструментами преобразований, с которыми вы познакомились в разделе 1.2.2 (напоминаю, что перемещения и повороты в трехмерном пространстве называют преобразованиями).

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

Рис. 2.6. Панель Inspector для пола

Когда внешние стены будут установлены, создайте внутренние (располагайте их как угодно) для перемещения между ними; идея состоит в том, чтобы создать коридоры и препятствия для обхода, как только вы напишете код для передвижения. Точные значения Transform будут зависеть от того, как вы повернете и отмасштабируете кубы, а также от того, как объекты связаны между собой во вкладке Hierarchy. Если вам нужен пример, из которого можно скопировать рабочие значения, загрузите образец проекта и посмотрите на стены в нем.

СОВЕТ