Unity в действии. Мультиплатформенная разработка на C#. 2-е межд. издание
Қосымшада ыңғайлырақҚосымшаны жүктеуге арналған QRRuStore · Samsung Galaxy Store
Huawei AppGallery · Xiaomi GetApps

автордың кітабын онлайн тегін оқу  Unity в действии. Мультиплатформенная разработка на C#. 2-е межд. издание

 

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

Переводчики А. Гребеньков, И. Рузмайкина

Технический редактор А. Руденко

Литературный редактор А. Бульченко

Художники Л. Егорова, С. Маликова

Корректоры Н. Викторова, И. Тимофеева

Верстка Л. Егорова

 

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

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

 

ISBN 978-5-4461-0816-9

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

 

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

 

Предисловие

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

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

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

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

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

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

Из первого издания

Джесси Шелл (Jesse Schell),

руководитель фирмы Schell Games,

автор книги Art of Game Design

www.amazon.com/Art-Game-Design-Lenses-Second/dp/1466598646/

Введение

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

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

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

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

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

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

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

Я хотел бы поблагодарить издательство Manning Publications, предоставившее мне возможность написать эту книгу. В этом мне помогли редакторы, с которыми я работал, в том числе Робин де Йон (Robin de Jongh) и особенно Дэн Махари (Dan Maharry). Именно взаимодействие с ними сделало книгу намного лучше. Мои искренние благодарности и многим другим людям, сотрудничавшим со мной в процессе написания и издания.

От пристального внимания рецензентов на всем протяжении работы над книгой она только выиграла. Спасибо Алексу Лукасу (Alex Lucas), Крейгу Хоффману (Craig Hoffman), Дэну Кэйсенджару (Dan Kacenjar), Джошуа Фредерику (Joshua Frederick), Люке Кампобассо (Luca Campobasso), Марку Элстону (Mark Elston), Филиппу Таффету (Philip Taffet), Рене ван ден Бергу (René van den Berg), Серджио Арбео Родригесу (Sergio Arbeo Rodríguez), Шайло Моррису (Shiloh Morris), Виктору М. Пересу (Victor M. Perez), Кристоферу Хаупту (Christopher Haupt), Клаудио Казейро (Claudio Caseiro), Давиду Торрибиа Иниго (David Torribia Iñigo), Дину Цальтасу (Dean Tsaltas), Эрику Вильямсу (Eric Williams), Ники Бакнеру (Nickie Buckner), Робину Дьюсону ( Robin Dewson), Сергею Евсикову и Тане Вильке (Tanya Wilke). Отдельная благодарность техническому редактору Скотту Шоси (Scott Chaussee) и техническому корректору Кристоферу Хаупту (Christopher Haupt), а также Рене ван ден Бергу (René van den Berg) и Шайло Моррису (Shiloh Morris), сыгравшим свою роль в выходе второй редакции книги. Также хотелось бы поблагодарить Джесси Шелл (Jesse Schell) за предисловие к книге.

Затем я хотел бы выразить свою признательность людям, помощь которых сделала мой опыт работы с Unity крайне плодотворным. Разумеется, этот список начинается с создавшей Unity (игровой движок) компании Unity Technologies. Чувство глубокой благодарности я испытываю и к сообществу gamedev.stackexchange.com. Этот сайт конт­роля качества я посещал практически ежедневно, учась у других и отвечая на чужие вопросы. Самый же сильный толчок к работе с Unity я получил от своего руководителя в фирме Synapse Games Алекса Рива (Alex Reeve). Мои коллеги показали мне множество приемов и методов, которые я постоянно применяю при написании кода.

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

 

О книге

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

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

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

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

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

Структура книги

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Условные обозначения, требования и доступные для скачивания данные

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

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

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

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

Форум для обсуждения книги

На странице https://forums.manning.com/forums/unity-in-action-second-edition вы найдете информацию о том, как попасть на форум после регистрации, на какую помощь вы можете рассчитывать, а также о правилах поведения на форуме.

Издательство Manning взяло на себя обязательство по предоставлению места, где читатели могут конструктивно пообщаться как друг с другом, так и с автором книги. Но оно не может гарантировать присутствия на форуме автора, участие которого в обсуждениях является добровольным (и неоплачиваемым). Мы надеемся, что вы будете задавать автору по-настоящему трудные вопросы, чтобы его интерес к общению не угас! Как форум, так и архивы предшествующих обсуждений будут доступны на сайте издательства до тех пор, пока книга находится в продаже.

Об авторе

Джозеф Хокинг живет в Чикаго и занимается разработкой программного обеспечения для интерактивных сред. Он работает в фирме InContext Solutions. Первое издание данной книги было написано в период его работы в компании Synapse Games. Кроме того, он преподавал разработку игр в Университете Иллинойса, в Чикагском институте искусств и в колледже Колумбия. Его сайт www.newarteest.com.

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

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

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

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

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

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

Итак, начнем!

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

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

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

Как выглядит программирование в Unity.

В чем разница языков C# и JavaScript.

 

 

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

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

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

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

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

Первым делом зайдите на сайт www.unity3d.com и скачайте среду разработки. Я пользовался версией Unity 2017.1, то есть наиболее новой на момент написания книги. Адрес сайта подчеркивает, что изначально приложение Unity предназначалось для создания трехмерных игр. Их поддержка по-прежнему остается приоритетной, но теперь в Unity замечательно разрабатываются и двумерные игры. В платной версии программы доступны расширенные функциональные возможности, но базовая версия распространяется бесплатно. Все приведенные в книге примеры прекрасно работают в бесплатной версии, так что покупать Unity Pro не потребуется. Платная версия отличается от бесплатной уже упоминавшимися расширенными функциональными возможностями (рассмотрение которых выходит за рамки данной книги) и коммерческими условиями лицензирования.

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, в конечном счете проходит через визуальный редактор, но основной интерфейс при этом включает в себя множество связанных проектов с запускаемым в игровом движке пользовательским кодом. Это своего рода аналог связывания классов в настройках проекта для таких интегрированных сред разработки, как Visual Studio или Eclipse. Поэтому опытным программистам не стоит пренебрегать Unity, считая это приложение чисто визуальным инструментом создания игр с ограниченной возможностью программирования!

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

Дополнением к производительности, которую обеспечивает редактор, служит сильная межплатформенная поддержка набора инструментов Unity. В данном случае это словосочетание подразумевает не только места развертывания (игру можно развернуть на персональном компьютере, в интернете, на мобильном устройстве или на консоли), но и инструменты разработки (игры создаются на машинах, работающих под управлением как Windows, так и Mac OS). Эта независимость от платформы явилась результатом того, что изначально приложение Unity предназначалось исключительно для компьютеров Mac, а позднее было перенесено на машины с операционными системами семейства Windows. Первая версия появилась в 2005 году, а к настоящему моменту вышли уже пять основных версий (с множеством небольших, но частых обновлений). Изначально разработка и развертка поддерживались только для машин Mac, но через несколько месяцев вышло обновление, позволяющее работать и на машинах с Windows. В следующих версиях добавлялись все новые платформы развертывания, например межплатформенный веб-плеер в 2006-м, iPhone в 2008-м, Android в 2010-м и даже такие игровые консоли, как Xbox и PlayStation. Позднее появилась возможность развертки в WebGL — новом фреймворке для трехмерной графики в веб-браузерах. Немногие игровые движки поддерживают такое количество целевых платформ развертывания, и ни в одном из них развертка на разных платформах не осуществляется настолько просто.

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

 

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

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

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

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

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

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

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

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

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

Итак, вы познакомились с сильными и слабыми сторонами Unity, но, возможно, пока до конца не уверены в том, что этот инструмент позволяет получать первоклассные результаты. Зайдите в галерею Unity на странице http://unity3d.com/ru/showcase/gallery и полюбуйтесь постоянно обновляемым списком сотен игр и симуляций, созданных этим инструментом. Я, в свою очередь, приведу небольшой список игр, демонстрирующих разные жанры и платформы развертывания.

Игры для рабочего стола (WINDOWS, MAC, LINUX)

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

• Guns of Icarus Online (рис. 1.2) — игра от первого лица в жанре многопользовательского симулятора боевого дирижабля, созданная независимым разработчиком Muse Games.

• Gone Home (рис. 1.3) — квест от первого лица, разработанный независимой студией Fullbright Company.

      
 

Рис. 1.2. Guns of Icarus Online Рис. 1.3. Gone Home

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

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

• Lara Croft GO (рис. 1.4) — трехмерная головоломка, разработанная компанией Square Enix.

• INKS (рис. 1.5) — двумерная головоломка от студии State of Play.

       
 

Рис. 1.4. Lara Croft GO   Рис. 1.5. INKS

• Tyrant Unleashed (рис. 1.6) — коллекционная карточная игра, созданная студией Synapse Games.

 

Рис. 1.6. Tyrant Unleashed

Игры для консолей (PlayStation, Xbox, Switch)

С помощью Unity можно разворачивать игры на игровых консолях, хотя для этого требуется лицензия от Sony, Microsoft или Nintendo. Межплатформенная развертка позволяет избежать лицензионных ограничений, поэтому консольные игры часто доступны и на обычных компьютерах. Примеры таких игр в различных жанрах:

• Yooka-Laylee (рис. 1.7) — трехмерная игра в жанре платформер от британской студии Playtonic Games.

• Shadow Tactics (рис. 1.8) — симулятор военной тактики в режиме реального времени, созданный немецкой студией Mimimi Productions.

     
 

Рис. 1.7. Yooka-Laylee    Рис. 1.8. Shadow Tactics

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

1.2. Работа с Unity

Выше уже много было сказано о том, как выгоден встроенный в Unity визуальный редактор с точки зрения производительности, пришло время познакомиться с его интерфейсом и узнать, как он работает. Если на вашем компьютере еще нет приложения, скачайте его со страницы http://unity3d.com/ru/get-unity и установите (обязательно установите флажок Example Project, если установщик его сбросит). После этого запустите Unity, и мы приступим к изучению интерфейса.

Для наглядности откройте входящий в комплект поставки проект; при установке новой копии этот проект должен предлагаться автоматически, но можно выбрать в меню File команду Open Project и открыть его вручную. Он находится в пользовательской папке общего доступа, адрес которой в операционных системах семейства Windows выглядит примерно так: C:\Users\Public\Documents\Unity Projects\, а в Mac OS — примерно так: Users/Shared/Unity/. Если заодно потребуется открыть пример сцены, дважды щелкните на файле Car (на рис. 1.9 видно, что такие файлы в Unity обозначаются символом куба). В диспетчере файлов, расположенном в нижней части редактора, значок этого файла будет находиться по адресу SampleScenes/Scenes/. Вы должны получить экран, показанный на рис. 1.9.

 

Рис. 1.9. Части интерфейса 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.10 из всего интерфейса редактора для наглядности оставлена только панель инструментов с расположенными под ней вкладками Scene/Game.

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

 

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

1.2.2. Работа с мышью и клавиатурой

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

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

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

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

 

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

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

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

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

 

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

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

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

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

 

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

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

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

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

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

почему C#, а не JavaScript?

Весь код в книге написан на языке C#, так как он имеет ряд преимуществ над языком JavaScript и куда меньше недостатков, особенно с точки зрения профессионального разработчика (именно этим языком я пользуюсь для работы).

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

Это всего лишь один пример того, чем отличается язык JavaScript в Unity. Во многом он напоминает JavaScript в веб-браузерах, но в его функционировании есть ряд зависящих от контекста отличий. Многие разработчики называют версию для Unity именем UnityScript, которое указывает на сходство, но одновременно и на отличие от JavaScript. Именно это состояние «аналогичный, но отличающийся» становится проблемой как при попытках применить общие знания языка JavaScript в контексте Unity, так и при попытках применять на стороне знания, полученные в процессе работы в Unity.

По этой причине в Unity понемногу прекращается поддержка JavaScript/UnityScript. Вот перевод соответствующей статьи из блога: https://devtribe.ru/p/unity/unityscripts-is-depricating. Оригинал статьи находится по адресу http://mng.bz/B9au.

Попробуем написать и запустить код. Откройте Unity и щелкните на ссылке New в стандартном окне. Или выберите в меню File команду New Project, если приложение Unity уже запущено. Откроется окно диалога New Project, предназначенное для создания нового проекта. Укажите имя проекта и место, куда бы вы хотели его сохранить. Проект Unity представляет собой обычную папку с файлами различных ресурсов и настроек, поэтому его можно сохранять где угодно. Щелкните на кнопке Create Project, и Unity ненадолго исчезнет, чтобы создать папку проекта.

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

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

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

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

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

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

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

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

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

 

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

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

1.3.2. Программа MonoDevelop, межплатформенная IDE

Программирование осуществляется не внутри Unity, код существует в виде отдельных файлов, местоположение которых вы сообщаете приложению. Файлы сценариев могут создаваться в самом приложении, но в любом случае потребуется текстовый редактор или IDE, где для изначально пустых файлов будет писаться код. В комплекте с Unity поставляется приложение MonoDevelop как межплатформенная интегрированная среда разработки (IDE) для языка C# с открытым исходным кодом (оно показано на рис. 1.14). Более подробную информацию можно получить на сайте www.monodevelop.com, но пользоваться при этом следует версией, идущей в комплекте с Unity, а не скачанным с этого сайта приложением, так как в базовую программу был внесен ряд изменений для лучшей интеграции с Unity.

 

Рис. 1.14. Фрагменты интерфейса программы MonoDevelop

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

Так как язык C# изначально разрабатывался компанией Microsoft, возможно, вам интересно, можно ли для программирования в Unity пользоваться Visual Studio. Да, можно. Для этого существуют инструменты, отвечающие за поддержку (в частности, за корректную работу отладки и точек останова). Чтобы убедиться в наличии этих инструментов, проверьте, содержит ли меню Debug команду Attach Unity Debugger. В случае его отсутствия запустите установщик Visual Studio, внесите изменения в установленную версию и найдите модуль разработки игр Unity.

Я, как правило, использую программу MonoDevelop, но если вы уже привыкли программировать в Visual Studio, просто продолжайте работать с этой средой. Вы легко сможете выполнять все практические задания из книги (после вводной главы упоминать о IDE мы больше не будем). Однако привязка рабочего процесса к Windows аннулирует одно из самых важных преимуществ Unity. Язык C# разработан инженерами компании Microsoft, и поэтому изначально применялся только в Windows на платформе .NET Framework, однако он давно превратился в открытый стандарт языка и для него появился важный межплатформенный фреймворк: Mono. В Unity фреймворк Mono используется как основа для программирования, и именно среда MonoDevelop обеспечивает межплатформенные возможности всего процесса разработки.

внимание Интегрированная среда разработки MonoDevelop шла в комплекте с Unity 2017.1, но, согласно статье в блоге Unity http://mng.bz/9HR8, начиная с версии Unity 2018.1, ситуация изменится.

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

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

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

Выберите в меню GameObject команду Create Empty, и на вкладке Hierarchy появится пустой объект с именем GameObject. Перетащите значок сценария с вкладки Project на вкладку Hierarchy и положите на строчку GameObject. Как показано на рис. 1.15, если присоединение сценария является допустимой операцией, компонент подсвечивается. Если вы отпустите кнопку мыши, сценарий будет связан с объектом GameObject. Чтобы удостовериться в успешном исходе операции, выделите объект и посмотрите на панель Inspector. Там должны появиться два компонента: Transform — базовый компонент положения/ориентации/масштаба, присутствующий у всех объектов, который невозможно удалить, а сразу под ним — сценарий.

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

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

 

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

 

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

Откройте сценарий в Visual Studio, чтобы отредактировать листинг 1.1. Знакомство с новой средой программирования всегда начинается с вывода на экран текста «Hello World!». Поэтому добавьте в метод Start() строчку, показанную в следующем лис­тинге.

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

void Start() {

    Debug.Log("Hello World!");

Добавляем команду регистрации.

}

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

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

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

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

• Создание нового сценария на языке C#.

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

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

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

• Нажатие кнопки Play!

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

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

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

 

 

Заключение

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

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

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

• Код сценариев пишется в программе MonoDevelop или Visual Studio.

2. Создание 3D-ролика

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

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

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

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

 

 

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

 

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

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

ПРИМЕЧАНИЕ Проект этого (и всех разделов) можно загрузить с веб-сайта книги. Откройте проект в Unity, затем откройте Scene, чтобы запустить его. Пока вы учитесь, я рекомендую вам самостоятельно набирать весь код и использовать загруженный образец кода для справки. Адрес веб-сайта: www.manning.com/books/unity-in-action-second-edition.

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

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

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

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

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

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

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

3. Создание объекта-игрока (в том числе и присоединение камеры к его верхней ча­сти).

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

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

 

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

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

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

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

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

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

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

 

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

 

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

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

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

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

 

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

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

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

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

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

 

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

В главе 1 демонстрировался способ создания нового проекта в Unity. Именно это мы сейчас и проделаем. Напоминаю, что нужно выбрать в меню File команду New Project и в появившемся окне указать имя проекта. После этого сразу же сохраните пустую сцену, так как изначально файл сцены у нового проекта отсутствует. Начнем мы с создания наиболее очевидных объектов.

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

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

...