Как сделать игру через юнити

Как без мата создать игру на Unity3D

Пролог

В начале 2015 года я решил написать свою первую игру. В качестве движка я, не долго думая, выбрал Unity3D, так как у меня был опыт в C# и JavaScript, и знакомые, которые могли помочь. Я вспомнил одну мини-игру, в которую я играл в детстве, и решил сделать нечто похожее. Установил себе Unity и поставил себе цель сделать рабочий прототип за пару недель, параллельно изучая движок.

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

И так, с какими проблемами я столкнулся при создании своей первой игры на Unity3D?

Дизайнеры

Первая серьёзная проблема, с которой я столкнулся, было отсутствие дизайнера. И если на начальных этапах, когда я просто создавал прототип игры, это было еще не так важно, то чем ближе к завершению работы, тем большие неудобства я испытывал. Я начал искать дизайнера в июне, и мои поиски довольно быстро увенчались успехом. Я нашёл девушку, которая была не против помочь с рисунками. Мы встретились, оговорили, что необходимо сделать, и она пропала. Потом снова появилась, пообещала всё сделать, и снова пропала. Так прошел где-то месяц, прежде чем я понял, что свои рисунки я не получу. В итоге, весь UI игры мне пришлось рисовать самому, и у меня на это ушло не мало времени. Вскоре я договорился с одним своим хорошим знакомым, он согласился помочь, сказал, что недели за две справится. Я ему поверил — а что мне оставалось делать? К концу второй недели он мне радостно сообщил, что почти всё закончил, и дал посмотреть на свои рисунки. Там была половина от того, что мне нужно было, при чем часть надо было переделывать. На это у него ушло ещё две недели (в сумме там было десяток простеньких спрайтов). И то, пару спрайтов он так и не доделал и мне пришлось самому выкручиваться, вооружившись фотошопом.

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

Плагины

Уже когда игра показалась мне завершенной, я решил заняться подключением сторонних плагинов. Сейчас в ней три плагина:

Google Play Game Services

Плагин от Google был выбран для добавления в игру достижений и таблиц лидеров, так как из всех вариантов, которые я нашел, он был бесплатным, простым в использовании и поддерживал как Android, так и iOS. На момент его добавления, для меня он казался идеальным решением. После добавления плагина в проекте появилась новая проблема, которая будет подробнее описана ниже, а именно аккаунт разработчика Google Play. Без него у вас не будет ID достижений и таблиц результатов, и вы не сможете тестировать эти функции вашей игры. Но, когда у вас появляется доступ к ним, проблем с их настройкой возникнуть не должно. В интернете можно найти большое количество информации на эту тему.

К сожалению, у меня так и не получилось настроить работу GPGS плагина на iOS, все мои попытки приводили к ошибкам при сборке, и в итоге мне пришлось полностью выкинуть GPGS из билда на iOS. Но, в принципе, я ничего не потерял, так как Game Center прекрасно справляется с реализацией достижений и таблиц результатов, и для него не надо добавлять никаких сторонних плагинов — достаточно использовать класс Social, встроенный в Unity.

Soomla

Плагин от Soomla состоит из трёх отдельных библиотек:

Soomla Profile

Мне необходимо было добавить возможность делиться рекордами в соц. сетях, с чем плагин, после настройки в проекте, успешно справляется. Но для того, чтобы его настроить, придется попотеть. Для работы с твиттером достаточно создать связанное приложение, зайдя через свой аккаунт, и вбить в настройках Soomla в Unity полученные Consumer Key и Secret. Библиотека Twitter встроена в плагин. А вот с фейсбуком дела обстоят немного иначе. Необходимо создать связанное приложение в консоли разработчика Facebook, для него необходимо добавить информацию для каждой платформы, где собирается использоваться приложение. Добавить плагин Facebook в проект и в его настройках прописать полученный от фейсбука ID приложения. Также для андроида вам понадобится пакет OpenSSL для получения development and release key hashes. У меня были проблемы с получением ключей в Unity, но на странице настройки приложения описано как их получить через консоль.

Если вы всё сделаете правильно, то у вас все должно заработать. Soomla предоставляет большое количество event handler’ов, которыми я советую вам во всю пользоваться.

Soomla Store

Мне необходимо было добавить всего одну покупку в свою игру — отмену рекламы, так что я не смог по достоинству оценить все те возможности, что предоставляет эта библиотека, но она включает в себя всё, что может понадобиться при создании магазина внутриигровых покупок. Тут я лишь могу посоветовать не забывать проверять ваши встроенные покупки прежде, чем вы выложите свою игру в магазине. Android предоставляет возможность покупки тестового продукта, который имеет уникальный ID, в то время как Apple позволяет зайти в игру с помощью тестового аккаунта Sandbox и сделать тестовую покупку непосредственно вашего продукта. Не обошлось и без подводных камней. Так, моя первая попытка выложить игру в App Store провалилась. Как оказалось, для андроида плагин Soomla автоматически восстанавливает Non-Consumable покупку, если вы стёрли приложение, а потом снова его установили, тогда как Apple требует, чтобы внутри игры была кнопка восстановления покупки, и никак иначе. Сейчас игра висит на повторной проверке, и мне остается лишь надеяться, что всё пройдет успешно.

Appodeal

Изначально я собирался использовать плагин Chartboost внутри своей игры, встроил его в проект, и он работал как надо. Но, вскоре, я узнал о существовании плагина от Appodeal, в который было встроено множество рекламных сетей, в том числе и Chartboost. И я решил попробовать его. Мне “повезло” — именно тогда был период его обновления, так что две недели я не мог проверить его работу, потому что не мог связать его со своей игрой. Но когда плагин обновился, не составило никакого труда настроить его под свои нужды и использовать его в проекте.

Единственное неудобство, вызванное обновлением, было в том, что мне пришлось создать аккаунт AdMob и привязать его к Appodeal, так как эти рекламные площадки работают в тесной связке. А для создания аккаунта AdMob необходимо создать аккаунты AdWords и AdSense, и привязать их к AdMob. Будьте готовы потратить на это какое-то время, так как придётся разобраться с регистрацией в этих сервисах.

Поиск неисправностей

Довольно частой проблемой при использовании нескольких плагинов являются дубликаты библиотек. Так как некоторые плагины требуют обязательного наличия определенной библиотеки, может стать так, что у вас с двух плагинов в проект добавится одна и та же библиотека. Это вызывает ошибку Unable to convert classes to dex format. Для исправления этой ошибки вам придётся перерыть весь проект в поисках дубликатов. Советую изначально смотреть, что именно вы добавляете в проект при импорте плагина. Это поможет избежать нежелательных дубликатов.

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

Для меня так же очень докучающей стала проблема обновления плагинов. Например, после обновления плагина GPGS у меня перестала запускаться игра, что бы я с ней ни делал — вылетала при запуске, так как в этот момент идет инициализация плагина. Я потратил день на безуспешную борьбу с проблемой, а когда решил вернуть старую версию плагина, у меня стало выкидывать при закрытии окна таблиц рекордов. И, хоть я нашёл людей, столкнувшихся с той же проблемой, ни один из предложенных способов решения не помог мне. Пришлось откатываться до старой версии билда, благо, горькие ошибки в прошлом заставили меня научиться делать бекап перед каждым таким опасным изменением в проекте. Попытки обновить Soomla так же вышли мне боком — повыскакивали проблемы, которых до этого не было. Опять-таки, пришлось откатываться и использовать старые версии плагина. С обновлением Appodeal тоже было не все гладко — они добавили новые библиотеки и появилась ошибка Dex 65536.

В общем, совет вам: если плагин работает, вас устраивает его функционал и это не обязательное обновление, связанное с изменением API — не обновляйте его. Вы получите больше проблем, чем пользы. У меня сейчас в игре всё прекрасно работает со старыми плагинами GPGS и Soomla.

Что действительно необходимо обновлять постоянно, так это Android SDK. Вот тут я могу лишь посоветовать как можно чаще открывать SDK Manager и проверять на наличие новых обновлений. Без этого многое может перестать работать, а так как при работе с Unity не происходит автоматический поиск обновлений, как если бы вы работали с Android Studio, это надо делать вручную. За время, что я делал игру, у меня два раза игра ломалась из-за того, что были устаревшие версии библиотек, таких как Google Play Services. И каждый раз требовалось время на выявление причины ошибки.

А вообще, в поиске решения проблем мне всегда помогал Google. Так как с большинством проблем, с которыми вы можете столкнуться, уже кто-то сталкивался до вас. Главное набраться терпения и искать правильный ответ. Не опускайте руки и всё у вас получится. А кто говорил, что всё будет просто?

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

Google Play

Создание связанного приложения для GPGS не должно вызвать затруднений — тут всё интуитивно и понятно. Создаете достижение/таблицу рекордов, настраиваете, получаете ID и используете его в своём проекте. После успешной реализации можно протестировать работу достижений/таблиц рекордов, используя при входе свой тестовый аккаунт, при этом не забыв добавить этот самый аккаунт в список тестовых аккаунтов в консоли разработчика Google Play.

Но не смотря на мороку при создании аккаунта, работать с Google Play мне доставило куда больше удовольствия, чем с App Store. Игра на Google Play выкладывается в течении часа-двух, можно быстро и эффективно вносить изменения в игру. Про App Store я расскажу ниже.

App Store

После мороки с Google Play, с созданием аккаунта разработчика Apple уже было меньше проблем. Проблемы пошли потом. Первой, и самой очевидной, была невозможность создать бинарный файл, не имея макбука. С этим я справился, благо, есть доступ к рабочему маку.
Второе: имея собранный в Unity проект, его необходимо открывать на маке в XCode и там уже настраивать и создавать бинарный файл. Я изначально работал под виндой, и когда пришло время переписывать игру под iOS, я просто собрал проект и скинул его на макбук, чтобы создать бинарник. После долгого процесса избавления от мелких ошибок и разбора, как всё устроенно в макинтоше, я столкнулся с проблемой при создании бинарника. Порывшись в интернете я узнал, что стоит собирать проект для iOS в Unity непосредственно на маке. Мне пришлось заново собирать проект, настраивать его в XCode и, о чудо, ошибка пропала.

Если вы всё же решили собирать Unity проект на винде, то не забудьте проверить, чтобы у вас был установлен на компьютере Python, iTunes и прописаны необходимые пути в переменной PATH.

Отдельным пунктом хочется выделить создание Сертификатов и Профайла. Без них у вас не получится выложить приложение в App Store. Также, для того, чтобы протестировать работу Game Center и внутриигровых покупок, вам придётся создать отдельный профайл, и специальный тестовый Apple ID для Sandbox. Я не до конца разобрался в работе тестовых аккаунтов, что стоило мне двух списанных со счета долларов. Мелочь, а не приятно. Как оказалось, необходимо выйти из своего аккаунта на тестируемом устройстве, зайти в игру и там уже зайти в тестовый аккаунт, предварительно добавленный в Sandbox, тогда можно будет протестировать работу вышеперечисленных сервисов.

Создание бинарного файла игры для iOS влечет за собой куда большие затраты времени и требует больших усилий, чем создание apk для андроида, но так вы можете получить доступ к обширной аудитории пользователей продукции Apple. Если вы готовы потратить своё время и нервы на это, то вам стоит попробовать. Главное — идите до конца, не останавливайтесь на полпути, не пугайтесь трудностей и ошибок, ведь они бывают у всех, и зачастую их можно разрешить, приложив небольшие усилия.

Источник

Разработка вашей первой игры с помощью Unity и C#

В статье рассматриваются:

Как архитектор ПО я создал много систем, занимался обратным инжинирингом вредоносного программного кода и, в целом, мог бы достаточно легко разобраться почти в любом коде. Однако, когда дело дошло до создания игр, я слегка растерялся, даже не зная, с чего начать. На заре эпохи Windows я немного программировал графику в неуправляемом коде — не могу сказать, что это доставило мне удовольствие. Я тогда начинал разработку на DirectX, но осознал, что, хотя он обладает колоссальными возможностями, мне пришлось бы писать слишком много кода для того, что я хотел сделать.

И вот однажды я решил поэкспериментировать с Unity — инфраструктурой, способной на удивительные вещи. Это первая из четырех статей, в которой я расскажу об основах и архитектуре Unity. Я покажу, как создавать двух- и трехмерные игры и, наконец, как вести разработку с ее применением на платформах Windows.

Что такое Unity

В Unity проделана потрясающая работа, благодаря которой обеспечивается кросс-платформенная поддержка.

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

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 1. Платформы, поддерживаемые Unity

Вероятно, самая мощная часть Unity — это Unity Asset Store; пожалуй, лучшая электронная площадка для приобретения игровых ресурсов. Здесь вы найдете все необходимые компоненты для своих игр, такие как художественные решения, трехмерные модели, файлы анимаций для трехмерных моделей (см. контент Mixamo в магазине для более чем 10 000 движений), звуковые эффекты и полные треки, плагины (в том числе, инструментальный набор MultiPlatform, помогающий поддерживать несколько платформ), визуальные скриптовые системы вроде PlayMaker и Behave, продвинутые шейдеры, текстуры, эффекты на основе частиц и др. Интерфейс Unity полностью управляем скриптами и поддерживает интеграцию сторонних плагинов прямо в Unity GUI. Большинство профессиональных разработчиков игр (если не все) использует ряд пакетов из этого магазина ресурсов, и, если вы можете предложить нечто приличное, публикуйте его там.

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

И чем Unity не является

Я сомневаюсь, что нужно описывать все, чем Unity не является. Однако Unity по умолчанию не является системой, в которой проектируют двухмерные ресурсы и трехмерные модели (кроме террейнов). Вы можете вставить группу зомби в сцену и управлять ими, но создать самих зомби с помощью инструментария Unity, предлагаемого по умолчанию, нельзя. В этом смысле Unity не является инструментом создания ресурсов, подобным Autodesk Maya, 3DSMax, Blender или даже Adobe Photoshop. Однако существует минимум один сторонний плагин (ProBuilder) для моделирования трехмерных компонентов прямо в среде Unity; также имеются плагины для построения двухмерных миров, например 2D Terrain Editor, позволяющий создавать двухмерные тайловые среды (2D tiled environments). И еще вы можете проектировать террейны в Unity, используя его Terrain Tools, чтобы создавать потрясающие ландшафты с деревьями, травой, горами и т. д. Поэтому я вновь в сомнении: стоит ли очерчивать границы возможностей Unity.

Какова роль Microsoft? Microsoft и Unity тесно сотрудничают, чтобы обеспечить полную поддержку для всего стека платформ Microsoft. Unity поддерживает автономные исполняемые Windows-файлы, приложения Windows Phone, Windows Store, Xbox 360 и Xbox One.

Приступаем к работе

Скачайте самую новую версию Unity и приобретите себе двухкнопочную мышь с нажимаемым колесиком прокрутки. Бесплатная и профессиональная версия скачиваются как единый пакет, который потом лицензируется соответствующим образом. Изучить различия между этими версиями можно на странице unity3d.com/unity/licenses. Editor, который является основным интерфейсом Unity, выполняется в Windows (включая Surface Pro), Linux и OS X.

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

Архитектура и компиляция

Вы редактируете свой код в Unity, дважды щелкнув файл кода в представлении проекта. Это действие по умолчанию открывает кросс-платформенный редактор Mono­Develop. При желании можно сконфигурировать в качестве редактора Visual Studio.

Отладка осуществляется с помощью MonoDevelop или с использованием стороннего плагина для Visual Studio — UnityVS. Использовать Visual Studio в качестве отладчика без UnityVS нельзя, потому что при отладке игры вы отлаживаете не Unity.exe, а виртуальную среду в Unity, применяя программный отладчик, который выдает команды и выполняет операции.

Для отладки запустите MonoDevelop из Unity. В MonoDevelop есть плагин, который открывает обратное соединение с отладчиком Unity и выдает ему команды после того, как вы выбираете Debug | Attach to Process in MonoDevelop. С помощью UnityVS вы устанавливаете обратное соединение с отладчиком Visual Studio вместо Unity.

При первом открытии Unity вы увидите диалог проекта, показанный на рис. 2.

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 2. Project Wizard в Unity

Продолжая рассматривать интерфейс, я щелкну Create в диалоге с рис. 2, чтобы создать новый проект. Разметка окна Unity по умолчанию приведена на рис. 3.

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 3. Окно Unity по умолчанию

Важно упомянуть о вкладке Game рядом с вкладкой Scene. Она становится активной, когда вы щелкаете Play и ваша игра начинает выполняться в этом окне. Это называется режимом игры (play mode) и создает вам игровую площадку для тестирования вашей игры; можно даже «на лету» вносить изменения в игру, переключаясь обратно на вкладку Scene. Но будьте осторожны. Пока подсвечивается кнопка Play, вы находитесь в режиме игры, и, если вы покидаете его, любые изменения, внесенные в режиме игры, будут потеряны. Я, как и почти все разработчики на Unity, с кем мне доводилось разговаривать, именно так теряли проделанную работу, поэтому советую сменить цвет Editor на такой, по которому было бы очевидно, когда вы находитесь в режиме игры. Это можно сделать через Edit | Preferences | Colors | Playmode tint.

Все, что выполняется в вашей игре, существует в сцене.

О сценах

Все, что выполняется в вашей игре, существует в сцене. Когда вы упаковываете игру для какой-то платформы, конечный продукт представляет собой одну или более сцен плюс любой добавленный вами код, специфичный для конкретной платформы. Количество сцен в проекте не ограниченно. Сцену можно рассматривать как уровень в игре, хотя в одном файле сцены может быть несколько уровней — достаточно перемещать игрока (камеру) в другие позиции сцены. Скачивая сторонние пакеты или даже примеры игр из магазина ресурсов, вы обычно должны найти файлы сцен, чтобы открыть их в своем проекте. Файл сцены содержит всевозможные метаданные о ресурсах, используемых в проекте для текущей сцены и ее свойств. Важно почаще сохранять сцену при разработке нажатием клавиш Ctrl+S, как и в любом другом инструментарии.

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

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 4. Фильтрация сцен в проекте

В сцене вы ничего не увидите без камеры и ничего не услышите без компонента Audio Listener, подключенного к какому-либо GameObject. Но заметьте, что в любой новой сцене Unity всегда создает камеру с подключенным к ней компонентом Audio Listener.

Структура проекта и импорт ресурсов

Проекты Unity не похожи на проекты Visual Studio. Вы не открываете файл проекта или даже решения, потому что таких файлов нет. Вы указываете Unity структуру папок и открываете папку как проект. Проекты содержат папки Assets, Library, ProjectSettings и Temp, но в интерфейсе появляется только папка Assets, что можно было заметить на рис. 4.

Папка Assets содержит все ваши ресурсы: художественную графику, код, звуки; любой отдельный файл, добавляемый в проект, попадает именно в эту папку. Она всегда является папкой верхнего уровня в Unity Editor. Учтите, что изменения следует вносить только через интерфейс Unity, — никогда не пытайтесь делать это через файловую систему.

Папка Library — это локальный кеш для импортированных ресурсов; она содержит все метаданные для ресурсов. В папке ProjectSettings хранятся настройки, заданные вами в Edit | Project Settings. Папка Temp используется для временных файлов, создаваемых Mono и Unity в процессе сборки проекта.

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

Крайне важный GameObject

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 5. Класс GameObject в Unity

LightsИсточники освещения
3D Models3D-модели
SpritesСпрайты
HUDsИгровые интерфейсы
Particle SystemsСистемы частиц
GameObjectGameObject

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

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 6. Простой GameObject

GameObject имеет свойства Name, Tag (аналог тега text, присваиваемого через FrameworkElement.Tag в XAML или тегу в Windows Forms), Layer и Transform (пожалуй, это свойство самое важное).

Свойство Transform определяет позицию, поворот и масштаб любого GameObject. Unity использует левостороннюю систему координат, в которой координаты на экране компьютера рассматриваются как X (по горизонтали), Y (по вертикали) и Z (глубина, т. е. входящие или исходящие из экрана).

В разработке игр весьма распространено использование векторов, о которых я подробнее расскажу в следующих статьях. А пока достаточно сказать, что Transform.Position и Transform.Scale являются объектами Vector3. Vector3 — это трехмерный вектор; иначе говоря, в нем не более трех точек: только X, Y и Z. Манипулируя этими тремя простыми значениями, вы можете задавать местонахождение объекта и даже перемещать его в направлении вектора.

Свойство Transform определяет позицию, поворот и масштаб любого GameObject.

Компоненты

Вы добавляете функциональность к объектам GameObject добавлением компонентов (объектов Component). Все, что вы добавляете, — это Component, и все они показываются в окне Inspector. Существуют компоненты MeshRender и SpriteRender, компоненты для звука и функционала камеры, компоненты, относящиеся к физике (коллайдеры [colliders] и твердые тела [rigidbodies]), системы частиц, системы поиска пути, сторонние пользовательские компоненты и др. Чтобы назначить код какому-то объекту вы используете скриптовый Component. Компоненты — это как раз то, что оживляет ваши GameObject добавлением функциональности подобно шаблону Decorator в разработке ПО, только их возможности гораздо интереснее.

Я присвою кое-какой код новому GameObject, в данном случае простому кубу, который можно создать через GameObject | Create Other | Cube. Я переименовал куб в Enemy, а затем создал еще один куб. Как видно на рис. 7, я сместил один куб на –15 единиц от другого, что можно сделать с помощью инструмента Move на панели инструментов или нажатием клавиши W после выделения объекта.

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 7. Текущий проект с двумя кубами

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

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

Первым делом я щелкаю правой кнопкой мыши в окне Project, чтобы создать новый скрипт на C# с именем EnemyAI. Для назначения этого скрипта объекту я просто перетаскиваю файл скрипта из представления проекта на объект в представлении Scene или Hierarchy, и этот код связывается с объектом. Остальное берет на себя Unity. Вот так просто.

На рис. 8 показан куб Enemy с назначенным ему скриптом.

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 8. Enemy со связанным скриптом

Взгляните на код на рис. 9 и обратите внимание на открытую переменную. Если вы смотрите на код в Editor, то заметите, что моя открытая переменная появляется с параметром для переопределения значений по умолчанию в период выполнения. Это очень удобно. Вы можете менять значения по умолчанию в GUI для элементарных типов, а также можете предоставлять открытые переменные (но не свойства) многих других объектных типов. Если я перетаскиваю этот код на другой GameObject, создается совершенно отдельный экземпляр этого компонента кода. Это базовый пример, и его можно расширить, добавив, скажем, компонент RigidBody к этому объекту, но я не стану усложнять пример.

Рис. 9. Скрипт EnemyAI

В коде я могу получить ссылку на любой компонент, предоставляемый в редакторе. Кроме того, можно назначать скрипты для GameObject, каждый со своими методами Start и Update (и многими другими методами). Предполагая, что компоненту скрипта, содержащему этот код, требуется ссылка на класс EnemyAI (компонент), я могу просто запросить этот компонент:

После изменения кода в MonoDevelop или в своем любимом редакторе кода и последующего возврата в Unity вы обычно наблюдаете небольшую задержку. Это связано с тем, что Unity выполняет фоновую компиляцию вашего кода. Редактор кода (но не отладчик) можно сменить через Edit | Preferences | External Tools | External Script Editor. Любые проблемы при компиляции в самой нижней строке состояния на экране Unity Editor, так что посматривайте туда. Если вы попытаетесь запустить игру с ошибками в коде, Unity этого не позволит.

Написание кода

В предыдущем примере кода два метода: Start и Update; класс EnemyHealth наследует от базового класса MonoBehavior, что позволяет просто назначить этот класс объекту GameObject. В этом базовом классе богатая функциональность, и, как правило, вы чаще всего будете использовать несколько методов и свойств. Основными методами являются те, которые Unity будет вызывать, если они присутствуют в вашем классе. Таких методов немало — подробности см. по ссылке bit.ly/1jeA3UM. Несмотря на множество методов вы, как правило, используете лишь некоторые из них. Ниже перечислены наиболее распространенные методы, подлежащие реализации в ваших классах, производных от MonoBehavior.

Awake Этот метод вызывается один раз для каждого объекта при его первой инициализации. Другие компоненты могут быть еще не инициализированы, поэтому этот метод обычно используется для инициализации текущего GameObject. Для инициализации производного от MonoBehavior класса следует всегда использовать этот метод, а не его конструктор. И не пытайтесь запрашивать здесь другие объекты сцены, так как они могут быть еще не инициализированы.

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

Update Этот метод вызывается в каждом кадре. И насколько же это часто, спросите вы? Ну, это полностью зависит от скорости вычислений. Поскольку нагрузка на вашу систему постоянно меняется при рендеринге разных вещей, каждую секунду частота кадров варьируется. Вы можете щелкнуть кнопку Stats на вкладке Game при переключении в игровой режим, чтобы видеть текущую частоту кадров (рис. 10).

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 10. Получение статистики

FixedUpdate Этот метод вызывается фиксированное число раз в секунду независимо от частоты кадров. Поскольку Update вызывается варьируемое число раз в секунду и не синхронизируется с движком физики, обычно лучше всего использовать FixedUpdate, когда к объекту нужно приложить силу или какие-то другие действия, относящиеся к физике. По умолчанию FixedUpdate вызывается каждые 0,02 секунды, а значит, Unity выполняет вычисления физики каждые 0,02 секунды (этот интервал называется Fixed Timestep и может регулироваться разработчиком) — опять же независимо от частоты кадров.

Проекты кода, генерируемые Unity

Как только в вашем проекте появляется код, Unity создает один или более файлов проектов в вашей корневой папке (которая невидима в интерфейсе Unity). Это не двоичные файлы движка Unity, а проекты для Visual Studio или MonoDevelop, в которых вы будете редактировать и компилировать свой код. Unity может создавать очень много отдельных проектов, как показано на рис. 11, но каждый из них выполняет важную роль.

Как сделать игру через юнити. Смотреть фото Как сделать игру через юнити. Смотреть картинку Как сделать игру через юнити. Картинка про Как сделать игру через юнити. Фото Как сделать игру через юнити
Рис. 11. Проекты, создаваемые Unity

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

Для каждого из этих проектов имеется проект-дубликат, созданный с добавлением «-vs» в его имя, например Assembly-CSharp-vs.csproj. Эти проекты используются, если вашим редактором кода является Visual Studio, и их можно добавлять в ваш проект, экспортированный из Unity, для отладки на специфической платформе в решении Visual Studio.

Прочие проекты служат той же цели, но «CSharp» заменяется «UnityScript». Это просто JavaScript-версии проектов (UnityScript), которые будут присутствовать, если вы используете JavaScript в своей Unity-игре и если у вас есть скрипты в папках, которые инициируют создание этих проектов.

Теперь, когда вы увидели, какие проекты создаются, я исследую папки, инициирующие создание этих проектов, и покажу, каково их предназначение. Путь к каждой папке относителен корневой папке /Assets в представлении вашего проекта. Assets всегда является корневой папкой и содержит все файлы ресурсов. Например, Standard Assets — это на самом деле /Assets/Standard Assets. Процесс компиляции ваших скриптов выполняется в четыре этапа и генерирует сборки (assemblies). Объекты, скомпилированные на этапе 1, не видят объекты, компилируемые на этапе 2, так как на этот момент они еще не скомпилированы. Это важно понимать, когда вы смешиваете UnityScript и C# в одном проекте. Если вам нужно ссылаться на C#-класс из UnityScript, вы должны убедиться, что он компилируется на более раннем этапе.

Этап 1 охватывает скрипты периода выполнения в папках Standard Assets, Pro Standard Assets и Plug-ins, которые находятся в папке /Assets. На этом этапе создается проект Assembly-CSharp-firstpass.csproj.

Скрипты этапа 2 находятся в папках Standard Assets/Editor, Pro Standard Assets/Editor и Plug-ins/Editor. Последняя папка предназначена для скриптов, которые взаимодействуют с Unity Editor API для использования функциональности этапа разработки (считайте это аналогом плагина Visual Studio, расширяющего ее GUI, только выполняемого в Unity Editor). На этом этапе создается проект Assembly-CSharp-Editor-firstpass.csproj.

Этап 3 охватывает прочие скрипты вне папки Editor. На этом этапе создается проект Assembly-CSharp-Editor.csproj.

Этап 4 охватывает все остальные скрипты (находящиеся внутри любой другой папки Editor, например /Assets/Editor или /Assets/Foo/Editor). На этом этапе создается проект Assembly-CSharp.csproj.

Табл. 1. Компиляторы

Разработка игры в Unity — процесс довольно прямолинейный.

Заключение

Адам Тьюлипер (Adam Tuliper) — старший идеолог по технологиям в Microsoft; живет в солнечной Южной Калифорнии. Разработчик инди-игр, один из администраторов Orange County Unity Meetup и автор на pluralsight.com. Скоро в его семье появится третий ребенок, так что связывайтесь с ним, пока у него еще есть свободные минуты, по адресу adamt@microsoft.com или через twitter.com/AdamTuliper.

Выражаю благодарность за рецензирование статьи экспертам Мэтту Ньюмену (Matt Newman) из Subscience Studios, Хайме Родригесу (Jaime Rodriguez) из Microsoft и Тоутвидасу Цилису (Tautvydas Žilys) из Unity.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *