О
П
Р
О
С



Создание приложений для Android

Создание приложений для Android – занятие довольно хлопотное. Оно подразумевает хорошее знание языка JAVA (который является нативным для Андроида), умение настраивать среду разработки от Google и неплохое ориентирование в многочисленных классах, написанных для этой среды. Однако, есть и более простой способ – использование специальных игровых движков...

В статье ниже мы рассмотрим пример создания несложного музыкального симулятора средствами одного из таких популярных движков – Unity3D.

Создаем игру на Unity 3D. Руслан Тертышный

Создание приложений для Android Создаем игру на Unity 3D. Руслан Тертышный
Язык:Русский
Формат:
Обновлено:2014-12-11
Автор:





Создаем игру на Unity 3D. Руслан Тертышный

Как быстро и относительно просто создать несложную игру или приложение для Андроида? Об этом читайте в статье ниже, где рассматривается работа с движком Unity3D.

Тыжпрограммист :)Вы играете в компьютерные игры? Если да, то, наверняка, в процессе прохождения очередного игрового блокбастера у Вас иногда возникали мысли типа: "А вот здесь, я бы сделал не так!". А хотите сами побывать в роли разработчика? Тогда, предлагаю Вам небольшое, но весьма занимательное "приключение" ;)

Что такое движок и зачем он нужен?

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

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

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

Однако, за удобство работы приходится платить некоторым увеличением размера проекта (иногда даже в несколько раз!) в сравнении с его аналогом, написанным старым "хардкорным" способом. Именно за это часть разработчиков движки не любит или же старается писать свои, в которых используются только необходимые им компоненты...

Но нам-то с Вами до труЪ-программистов далеко :) Поэтому займемся созданием несложной игры для Android на базе популярного и мощного движка Unity3D.

Начало работы с проектом в Unity3D

Итак, почему мы решили использовать именно Unity3D:

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

Главный козырь Unity3D, естественно, его многогранность и многоплатформенность. Готовую игру (возможно, с небольшими доработками) Вы можете портировать, хоть на ПК (с Windows, Linux или MacOS), хоть на Android, хоть на PlayStation или XBox! Для этого нам потребуется скачать только сам движок, который, кстати, "весит" больше гигабайта и нужные SDK (если планируется разработка под мобильные платформы или консоли). Если Вы хотите сделать игру для Windows, то качать дополнительно ничего не нужно, но поскольку, мы собрались делать игру под Андроид, то нам понадобится скачать еще и Android SDK (Software Development Kit). Советую качать SDK в ZIP-архиве для большего удобства работы с ним.

Когда все будет загружено, можете распаковать в любую удобную для Вас папку Android SDK, а затем приступайте к установке самого Unity3D. Устанавливается он, как и любая обычная программа под Windows, поэтому проблем с установкой быть не должно. После установки движок запустится и нам для начала нужно будет создать новый проект:

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

Для этого нам нужно будет закрыть все приветственные и вступительные окошки, а затем в меню "File" выбрать пункт "New Project". В открывшемся окошке (см. скриншот выше) нам предложат указать папку сохранения проекта (ее название будет совпадать с названием проекта), импортировать некоторые стандартные наборы функций (они нам не нужны) и указать режим работы. В качестве режима выбираем 2D и жмем кнопку "Create". На этом подготовительная часть работ завершена :)

Интерфейс движка и иерархия проекта

После создания проекта он будет загружен в рабочее пространство Unity3D:

Начало работы с Unity3D

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

  1. Окно Hierarchy – отображает иерархическое положение активных и неактивных объектов на сцене. По умолчанию единственный объект, находящийся сразу в списке – Камера (Main Camera).
  2. Окно Scene – отображает всю игровую сцену и объекты на ней (в том числе, камеры, звуки, текстуры и т.п.).
  3. Окно Inspector – отображает все свойства выбранного в иерархии или на сцене объекта и позволяет их править, дополнять или удалять.
  4. Окно Game – отображает игровой мир, который виден в камеру и позволяет выбирать размер виртуального тестового окна игры в пикселях. Также, позволяет активировать разворачивание игрового окна в полный размер (Maximize on Play) и включать/отключать отображение различной информации для разработчика.
  5. Окна Project и Console. Окно Project служит для навигации по ресурсам проекта: загруженным изображениям, звукам, моделям и т.п. Также средствами данного окна (контекстное меню) Вы можете создавать новые пустые игровые объекты разных типов и скрипты. Окно же Console служит для вывода сообщений об ошибках (красным), предупреждений (желтым) и различной, запрошенной Вами отладочной информации (серым).
  6. Окно Assets Label – нижняя часть окна инспектора, в которой отображается превью выбранного в окне Project объекта или файла.

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

Создавать мы будем симулятор музыкального инструмента: индийских народных барабанов под названием "табла", поэтому для начала работы создадим в проекте две пустые папки, в которых будут храниться звуки и картинки. Создать новую папку можно, вызвав контекстное меню в окне навигатора проекта (Project) и выбрав пункт "Folder" в списке "Create".

Здесь стоит сказать пару слов о том, как нужно называть эти папки. Для простой игры, вроде нашего симулятора, в принципе, папки можно "обозвать" как угодно, однако, имеется как минимум два названия, которые лучше не использовать, поскольку они зарезервированы движком. Это названия Resources и Plugins. В больших проектах папку Resources создают сразу и все игровые "запчасти" (картинки, звуки, модели, текстуры и префабы) складируют уже в нее (сортируя по подпапкам). В Plugins же, как следует из названия, сохраняются все дополнительные сторонние наборы функций (так называемые "ассеты" (assets)), которых имеется довольно много на Asset Store – магазине расширений для Unity3D.

Импорт файлов и создание игровых объектов

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

После того, как изображения появятся в нашей папке Images их следует немного настроить:

Настройки изображений

Дело в том, что по умолчанию Unity3D все добавленные в проект картинки сжимает с потерей качества. Если такая потеря нам не нужна (особо актуально для игр с HD-графикой), то нам следует выбрать каждое изображение и в окне Инспектора изменить значение параметра "Format" с "Compressed" на "Truecolor" во вкладке "Default". Также может понадобиться изменить параметр "Max Size", если он меньше реальной ширины картинки (по умолчанию – 1024 пикселя). После всех изменений нужно не забыть нажать кнопку "Apply", чтобы применить их. Аналогичные действия при необходимости совершаем для всех остальных изображений.

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

Создание Game Object

Первым делом мы добавили фоновую картинку, которая должна у нас отображаться во весь экран. Проверить, так ли это, можно выделив в окне иерархии камеру и посмотрев на то, как отображается ее рамка. На скриншоте выше видно, что часть нашего фона остается вне обзора камеры, поэтому, нужно подстроить размер этого обзора при помощи перетаскивания рамки прямо на сцене или правки параметра "Size" в окне Инспектора. В нашем случае пришлось сменить значение по умолчанию (5) на 5.4.

Все, камеру больше не трогаем, а добавляем и настраиваем остальные картинки. При добавлении мы видим, что некоторые из них слишком большие для нашей игры. Уменьшить их можно либо физически в графическом редакторе, либо средствами движка. Попробуем последний способ. Для этого выделяем изображение в окне Иерархии, а в окне Инспектора изменяем значения "Scale" для координаты X и Y с 1 на 0.5 (то есть, уменьшаем вполовину). Там же желательно, во избежание накладок, присвоить всем игровым объектам (кроме фона) ненулевой порядок слоев (Order in Layer):

Регулирование размеров и очереди объектов на сцене

Последним шагом в подготовке игровых объектов из картинок будет "навешивание" на них коллайдеров (collider). В Unity3D коллайдеры используются в качестве детекторов взаимодействия между объектами. То есть, по сути, на нашу картинку надевается виртуальная оболочка, которая может регистрировать прикосновения к ней.

Чтобы добавить коллайдер на объект, выбираем его в окне Иерархии, а затем в окне Инспектора жмем кнопку "Add Component". В появившемся списке компонентов ищем Physics 2D (обычная 3D физика в нашем режиме не сработает) и там из всех вариантов нам больше всего подходит "Circle Collider 2D". Его и выбираем. Вокруг нашего объекта появится зеленая обводка, которая и отображает границы коллайдера. Осталось только отметить галочкой пункт "Is Trigger" чтобы наш коллайдер только регистрировал нажатия и больше никак не взаимодействовал с окружающим игровым пространством:

Добавление коллайдеров

Аналогичные действия повторяем для всех оставшихся объектов. Отличаться от остальных объектов будет только наш фон. Для него мы применим Box Collider 2D и выставим Position Z больше нуля, чтобы задвинуть коллайдер и сам фон на задний план (это нам пригодится чуть позже).

Работа со звуком

Со звуком в Unity 3D на первый взгляд все обстоит несколько запутано. Но, попытаемся разобраться по порядку :)

Первым делом нам нужно перетащить все звуки в папку Sounds и тоже немного их настроить:

Настройка звуков

Если уровень громкости у всех звуков у Вас изначально отрегулирован, то все, что потребуется сделать, это отключить 3D-обработку звуков. В трехмерных играх эта обработка нужна для того, чтобы имитировать приближение источника звука при приближении к нему камеры. Но в 2D нам это ни к чему, поэтому выделяем по очереди каждый звук и снимаем у него галочку "3D Sound".

Теперь можем приступать к добавлению звуков к игровым объектам. Для этого нам нужно выделить по очереди каждую кнопку и добавить ей новый компонент "Audio Source" из раздела "Audio". Когда компонент будет добавлен, выбираем соответствующий кнопке "Audio Clip" и снимаем активную по умолчанию галочку "Play On Awake" (играть при появлении):

Добавление звуков на кнопки

Когда все звуки будут прикреплены к нужным кнопкам, придет время для самого интересного – скриптинга...

Первый скрипт

Перед тем, как начать разбирать наш первый скрипт, наверное, стоит пару слов сказать о самой системе скриптинга в Unity 3D.

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

Теперь о том, где писать код. По умолчанию редактором кода в Unity 3D является IDE MonoDevelop. Преимущество этой среды разработки в том, что в ней имеются подсказки для быстрого ввода стандартных методов, классов и функций, а также система проверки синтаксиса. Однако, для меня минусом стала громоздкость и высокая ресурсоемкость. Благо, в настройках Unity можно установить в качестве текстового редактора, что угодно, поэтому я для себя "подвесил" легкий и функциональный Notepad++ (почти все примеры будут показаны в нем).

И последнее. Естественно, что без справочных материалов в освоении всех премудростей движка Вы далеко не уйдете, поэтому вот список из нескольких толковых Интернет-ресурсов по теме Unity 3D:

Ну и, чтобы долго не тянуть, предлагаю сразу создать первый скрипт. Под скрипты, если их много, лучше выделить отдельную папку, но у нас игра будет простенькая, поэтому мы можем создать скрипт прямо в корневой папке проекта. Для этого вызываем контекстное меню в окошке Project, выбираем список Create и жмем "C# Script". Назовем наш новый скрипт, например, Sounds и откроем его двойным щелчком мыши. Убрав стандартные методы Update и Start, а затем, прописав нужные получим следующий вид скрипта:

Скрипт озвучки нажатий

Если Вы не перенастраивали редактор, то наш скрипт будет открываться в MonoDevelop. Разберем его структуру...

Фактически каждый скрипт на C# состоит из трех основных частей:

  1. В самом верху перечисляются библиотеки, которые нужно подключить для работы скрипта (например, "using Unity.Engine" подключает работу самого движка, а "using System.Collections" – библиотеку, содержащую ряд встроенных классов для работы скрипта под разными системами).
  2. Объявление класса и переменных. В C# нет понятия скрипта, как такового. Вместо него используется понятие "класса", в который входит ряд методов и функций. Хотя, по сути, в контексте Unity 3D это практически одно и то же :) Главное помнить, что имя класса должно совпадать с именем, которое мы дали скрипту. Особенность же переменных в C# в том, что они обязательно (кроме временных, которые объявляются в самом скрипте) должны быть типизированы. На практике это означает, что для переменной должен быть указан уровень доступа (private или public) и тип (int, float, bool или, как у нас в скрипте, AudioClip. При этом имя переменной можно давать любое. А можно ей сразу и значение приписать.
  3. Набор методов и функций. Методом в C# называется практически любая функция, которая выполняет определенные действия. В принципе, в литературе по Unity 3D их и называют функциями, но, если мы говорим о C# как отдельном языке программирования, то это, таки, методы :). Функциями в чистом виде в Юнити являются, например, стандартные функции вывода звука, отрисовки элементов GUI и т.п., которые используются внутри методов.

Зная теперь структуру скрипта, нетрудно понять его смысл, который сводится к следующему... В классе (скрипте) Sounds мы объявляем 9 переменных типа AudioClip с нужными нам для удобства их различения именами. Делаем их обязательно публичными (приватные не будут отображаться в редакторе, а нам на них нужно будет "вешать" звуки именно через редактор). А затем в теле скрипта используем стандартный метод "void OnMouseDown()". Раньше он отвечал только за обработку клика мышью, но в новых версиях интерпретируется и как касание к сенсорному экрану. В нем пишем условия, по которым мы проверяем имена нажатых коллайдеров и, если обнаруживаем нажатие одного из них, выводим соответствующий звук (используем стандартную функцию audio.PlayOneShot();).

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

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

Применение скрипта

Если скрипт был перетащен правильно, то он должен появиться в окне Инспектора у того объекта, на который мы его перетащили. Соответственно, перетаскиваем скрипт на все объекты, которые должны звучать в игре и можем пробовать запускать ее. При нажатии по нашим игровым кнопкам теперь, наконец-то, будет звучать заданный звук!

Введение в GUI

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

Собственно, GUI и есть сокращение от англ. "Graphical User Interface", то есть графический интерфейс пользователя. Традиционно он включает в себя такие компоненты, как:

  • кнопки;
  • окна;
  • текстовые области;
  • чекбоксы и/ил радиокнопки;
  • слайдеры (полосы прокрутки) и т.п.

В Unity 3D Все это (и даже кое что сверх того) присутствует в полной мере. Главное, научиться им пользоваться! Рассмотрим, как средствами GUI в Юнити можно сделать простую надпись-заголовок.

Для этого создадим новый скрипт с именем Interface и изменим его следующим образом:

Скрипт интерфейса

Рассмотрим внимательно скрипт на скриншоте. Здесь мы пишем всего одну публичную переменную нового для нас типа GUIStyle. Этот тип позволяет в визуальном режиме менять оформление элементов, к которым данный стиль приписан. Стили удобно использовать, если имеется много элементов интерфейса одного типа (например, кнопок), но у них должен быть разный вид.

В нашем примере далее мы используем стандартный метод "OnGUI()", который позволяет каждый кадр отрисовывать заданные в нем элементы интерфейса (вне метода они не работают и вызывают ошибку).

Далее мы создаем кнопку ("GUI.Button"), которая имеет следующий синтаксис: условие – 4 координаты (отступ по горизонтали от левого края, отступ по вертикали от верхнего края, ширина, высота) – видимый текст в кавычках и далее, опционально, указание стиля. Внутри условия кнопки прописываются нужные функции. В нашем случае мы прописали переход на сайт разработчиков ("Application.OpenURL("");").

Скрипты с GUI могут работать с любых игровых объектов, но обычно их советуют "вешать" на камеру, что мы и сделаем, перетащив скрипт на объект Main Camera. Теперь, если его выделить в окне Иерархии, то в окне Инспектора мы сможем увидеть публичную переменную нашего стиля, развернув которую, получим полный доступ к настройкам этого стиля!

Мы можем указать цвет текста и текстуру для фона в любых ситуациях (для кнопки нужно прописать три ее варианта (Normal - обычный вид, Hover - при наведении и Active - при нажатии), задать отступы и настроить шрифт. По умолчанию единственным доступным в Unity 3D шрифтом является Arial, однако Вы можете вручную загрузить в проект любой другой и применить его в поле "Font", настроив все сопутствующие параметры.

Что интересно и одновременно не совсем удобно, элементы GUI не отображаются на сцене, пока мы не запустим проект, поэтому подгонка параметров каждого элемента может занять немало времени. Запустим проект и посмотрим, как будет выглядеть наша кнопка, созданная выше:

Игровой экран

Изменение интерфейса по условию и статические переменные

Мы уже сделали многое, но улучшать всегда есть куда :) Поэтому предлагаю в качестве последнего примера создать окошко справки, которым обычно нормальные разработчики снабжают свои игры и приложения. Для этого добавим в папку с изображениями картинку для такой кнопки в виде знака вопроса и сделаем из нее игровой объект. Навесим на него коллайдер и напишем скрипт с именем, например, "Help" следующего содержания:

Создание справки

В данном скрипте у нас есть две переменные. Первая переменная определяет скин, который будет использоваться для всех элементов интерфейса, описанных в данном классе. В отличие от стилей, работу с которыми мы рассмотрели выше, скины позволяют изменять вид не только отдельного элемента, к которому они приписаны, а всех элементов определенного типа сразу. К тому же, в отличие от стилей, скины к элементам не прописываются, а объявляются сразу для всего метода и работают до тех пор, пока не будет объявлен еще один скин. Также следует помнить, что скины существуют не только в виде переменных, но и как отдельные файлы. Поэтому, перед объявлением скина нужно сразу создать его в окне "Project" из контекстного меню: "Create" – "GUI Skin".

Вторая переменная у нас логическая (или по-другому булева). Она может иметь только два значения: "истина" (true) или "ложь" (false). В силу своей бинарной природы такая переменная отлично подойдет для реализации всевозможных переключателей. В нашем случае, она будет отвечать за отображение текста с описанием нашей игры.

Однако, если посмотреть внимательно, то можно заметить, что у последней переменной есть один замечательный параметр – "static". Добавление к переменным такого параметра позволяет сделать их статическими и получать к ним доступ из других скриптов!

Но вернемся к остальному коду. Уже знакомый нам метод "void OnMouseDown()" здесь будет служить переключателем переменной "isVisible" при помощи простенького условия. Однако, после условия есть еще одна функция. Функция эта ("Debug.Log();") служит для вывода "на лету" в Консоль значений нужных нам переменных (их мы вписываем без кавычек в скобках). Как видите, внутри функции можно совмещать как неизменяемый текст (пишется в кавычках), так и переменные (без кавычек). Главное, только чтобы между всеми данными был знак "+".

Далее по тексту скрипта у нас идет метод отрисовки интерфейса ("void OnGUI(){}"), внутри которого мы видим объявление нового скина ("GUI.skin = HelpSkin;") и нового элемента интерфейса типа GUI.Box. В отличие от кнопки, бокс является неактивным элементом и служит обычно для вывода различных текстовых или графических данных.

Обратите внимание на то, как мы задали позиционирование для бокса. Здесь все значения указаны не напрямую, а при помощи математических выражений, что, по сути, является аналогом "резиновой верстки" в веб-разработке. Проблема в том, что при указании точных размеров GUI-элементов при разных разрешениях экрана они не будут адаптироваться и могут быть либо слишком мелки ми, либо, наоборот, крупными. В следующей версии движка разработчики обещают сделать GUI адаптивными, но пока приходится извращаться :(

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

Настройка скина

Чтобы увидеть, правильно ли работает наш скрипт, запустим проект и попробуем нажать на кнопку справки:

Рабочая справка по игре

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

Вернемся к нашему самому первому скрипту ("Sounds"), который отслеживал нажатия на кнопки для проигрывания звуков. В него (точнее, внутрь метода "void OnMouseDown()") нам достаточно будет прописать всего одну строчку:

if (this.name != "HelpButton"){Help.isVisible = false;}

Этой строчкой мы задаем условие: если имя нажатого коллайдера не равняется имени кнопки справки, то переменная "isVisible" в скрипте "Help" будет равняться "false". Только нужно чтобы переменная "isVisible" точно имела приписку "static", иначе получим ошибку.

Теперь при запуске мы увидим, что наше окно справки закрывается при нажатии не только на кнопку в правом верхнем углу, но и при касании к любой свободной части экрана. Единственное, что можно еще улучшить – сделать, чтоб окошко скрывалось и по нажатию на нем самом... Это будет Вашим "домашним заданием" ;) Скажу только, что ГУИ-бокс нужно будет сменить на аналогично оформленную кнопку, опять же, с настройкой скина и прописыванием функции, изменяющей переменную "isVisible". Все, дальше молчу :)

Компиляция игры и сохранение проекта

Наконец, у нас все работает! Это означает, что пришло время сохранять нашу игру и тестировать на реальном устройстве. А для этого ее нужно скомпилировать в исполняемый файл (для Windows, например, в EXE, а для Android в APK).

Если Вы хотите скомпилировать игру для ПК, то Вам не придется производить никаких предварительных настроек. Однако, для Андроида нужно будет сначала подключить скачанный нами в самом начале Android SDK. Делается это довольно просто: идем в меню "Edit", вызываем пункт "Preferences" и в открывшемся окошке переходим на вкладку "External Tools". Здесь ищем строку "Android SDK Location" и в ней указываем путь к распакованному архиву с SDK (см. скриншот ниже). Кстати, здесь же можно сменить активный по умолчанию монструозный текстовый редактор MonoDevelop на свой любимый :)

И вот настал момент истины! Идем в меню "File" и ищем там пункт "Build Settings". В открывшемся окошке нам нужно будет сразу добавить сцены для сборки. Если сцена одна (как в нашем проекте), то для этого будет достаточно нажать кнопку "Add Current". Если же их несколько, то нужно будет открыть каждую из них и аналогичным образом внести в список сцен, а затем посредством перетаскивания настроить нужную их очередность:

Сборка игры под Андроид

Следующим шагом выбираем платформу сборки (мы планируем игру под Андроид, значит, его и выбираем) и жмем внизу кнопку "Player Settings". В окне Инспектора откроется ряд настроек из которых некоторые являются обязательными или очень желательными. К желательным относится указание названий компании-разработчика, программы и ее иконки (Company Name, Product Name и Default Icon, соответственно) в верхней части списка настроек.

В нижней же части в разделе "Other Settings" имеется два обязательных параметра: "Bundle Identifier" и "Bundle Version". Версия по умолчанию проставляется, как 1.0, а вот идентификатор придется создать вручную и, желательно, уникальный. Состоять он должен из трех частей, отделенных друг от друга точками: зарезервированное слово "com", затем название компании-разработчика, а в конце название самого приложения.

Остальные настройки сборки можете менять по своему усмотрению или не менять вовсе. Главное, что теперь компиляция уже сможет запуститься. Для этого достаточно нажать кнопку "Build" в окошке "Build Settings" и дождаться, пока программ выдаст нам готовое, упакованное в APK-файл приложение :)

Заключение

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

Чтобы импортировать наш проект (и, кстати, любые плагины, скачанные из Интернета или Assets Store) нужно зайти в меню "Assets", выбрать пункт "Import Package", а в нем "Custom Packege", после чего указать путь к нашему файлу и нажать кнопку "Import". Кстати, сделать полный бекап своего проекта, с сохранением в такой unitypackage Вы можете из этого же меню ("Assets") кликом по пункту "Export Package".

Вроде, все :) Как человек, который сам осваивал Unity 3D с нуля, в статье я постарался дать ответы на максимальное количество вопросов и осветить основные нюансы работы с движком, которые возникают на первых порах. Но, возможно, кому-то этого будет мало, поэтому, если у Вас возникнут вопросы, можете обращаться либо прямо ко мне на почту, либо на форуме: чем смогу – помогу!

Желаю всем удачи и успешной реализации всех проектов!

P.S. Разрешается свободно копировать и цитировать данную статью при условии указания открытой активной ссылки на источник и сохранения авторства Руслана Тертышного.

P.P.S. Если Вы не хотите вникать в тонкости программирования, но имеете желание создать собственную флеш-игру, советую ознакомиться с другим игровым движком – Stencyl:
http://www.bestfree.ru/soft/media/flash-games-creation.php



Получать обновления:







Комментарии

Юрий 2014-12-20 09:40:06
А как бы к примеру уже готовую игру для андроид переделать для форточки? :))

Ответить
Руслан Тертышный 2014-12-20 11:05:15
А вот это уже только ручками :) И с нуля :)

Ответить
Александр 2015-01-17 15:52:32
Руслан, не могли бы вы опубликовать процесс загрузки приложения в магазин приложений Android или IOS? А эта статья довольно познавательная, пример простой и понятный. Спасибо!

Ответить
Руслан Тертышный 2015-01-17 18:17:13
Александр, для iOS я пока еще не пробовал, а для Андроида можно опубликовать игру на Яндекс.Маркете или на Google Play (только тут платно - 20 баксов за регистрацию). В обеих случаях Вам нужно будет зарегистрироваться в качестве разработчика и войти в свой личный кабинет. Затем Вам предложат загрузить сам APK-файл с игрой и несколько изображений-скриншотов заданных размеров. После того, как все будет загружено, останется только заполнить дополнительные поля (типа, версии игры и доступных в ней языков) и выбрать жанр. Вот, собственно, и весь процесс :)

Ответить
никита степанов 2015-02-07 13:08:30
Как добавить картинку (текстуру) в проект? Перетаскиваю, у меня появляется знак перекрестия. Что делать?

Ответить
никита степанов 2015-02-07 13:40:45
С проблемой разобрался, а как сделать так чтобы камера смотрела вниз?

Ответить
Руслан Тертышный 2015-02-07 16:52:24
Никита Степанов, смотря какой проект Вы создаете. Если 2D, то там просто достаточно выбрать ортографический режим и рисовать все спрайты в виде сверху. Если же 3D, то потребуется еще и скрипт написать, который будет перемещать камеру так, как нужно при определенных условиях.

Ответить
Никита Степанов 2015-02-07 20:07:53
Спасибо, попробую.

Ответить
Никита Степанов 2015-02-08 08:44:14
Руслан, мне кажется, что Unity очень сложный движок (по крайней мере для меня), поэтому попробую UDK, в нём тоже можно создавать игры для Андроида.

Ответить
Руслан Тертышный 2015-02-08 11:28:51
Никита Степанов, попробуйте. Если понравится - отпишитесь о впечатлениях :) Возможно мы и по нему сделаем обзор

Ответить
Виктор 2015-03-15 21:38:32
Доброго времени суток.
Заморочился я созданием приложений под андроид средствами Юнити.
Но никак не могу запустить уже установленное приложение, сообщает мол ошибка в приложении.
SDK версии 15 и 18 установлены с офф сайта под андроиды версий 4.0.3 и 4.3.1
Виртуальная машина андроида (для тестирования) как раз версии 4.0.3
JDK v1.7.0 r51
В Юнити пробовал по разному выставлять параметр Minimum API Lavel от 9 до 18
Сам Юнити компилирует на ура файл apk.
На VM устанавливается нормально, но при запуске чёрный экран на 1-1.5 сек и сообщение об ошибке в приложении.

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

Ответить
Руслан Тертышный 2015-03-15 23:54:04
Виктор, конкретно с Вашей проблемой я не сталкивался, но одно подозрение есть. Работая с Юнити, уже не раз сталкивался с различными проблемами компиляции и работы приложений именно под Андроид. Читая различные англоязычные форумы, я выяснил, что лучше всего для Unity3D использовать 21-ю версию Android SDK и уже на ее базе докачивать недостающие инструменты и среды. Категорически не рекомендуют 22-ю версию (сам сталкивался с данной несовместимостью) и 19-ю. Возможно, аналогичные проблемы есть и у упомянутых Вами 15-й и 18-й версии. В данный момент у меня проект безошибочно компилируется с 21-й версией и 13-м API (в самом Юнити). Хотя, с некоторыми сбоями, получается скомпилировать даже под 9-й API!

Рекомендую использовать именно портативную 21-ю сборку SDK (не JDK).

Ответить
Виктор 2015-03-16 05:27:26
Руслан, очевидно у меня Юнити не желает работать со сборками выше 16й API, так как удалив лишнее, скачал SDK 21, при компиляции Юнити затребовал SDK 0 > 16.
Я так понимаю любую от начала до 16й. Докачал именно 16ю (ради теста), Юнити, "приплясывая", завершил компиляцию. (В настройках ставил минимум 13ю версию Апи)
Ошибка в приложении (на андроиде сохранилась)
Отсюда два вопроса:
1. Какую версию Юнити Вы использовали? (у меня 4.3.1f1 может устарела?)
Версия PRO, к сожалению пока кряканая. Может по этому баги...
2. Вы говорили "именно портативную 21-ю сборку SDK", портативную?
Я начинал с сайта http://developer.android.com/sdk/index.html
Скачивал файл "installer_r24.0.2-windows.exe"
А после уже изменял через Android SDK Manager.
Может что-то не то юзаю?

P.S. Вот что ещё примечательно, Юнити у меня в начале ругался на отсутствующий файл "zipalign.exe" в папке tools (в самом sdk)
Научным путём (скачал всё что можно было), я откопал его именно в 19й сборке.
После скопировал в папку tools где он его и ищет.
Странно то, что больше я его нигде не встречал.
Можно узнать, в Вашей сборке Android SDK есть такая программка?

Ответить
Виктор 2015-03-16 05:34:10
P.P.S
JDK это от Java, те же модули, просто на форумах замечал, что про неё то же упоминали. Но там более новые сборки ставили, вот если ещё от этого могут быть ошибки...
Тогда ещё вопрос, у Вас установлена Java JDK или JRE, если да, то каких версий.
Заранее благодарю.

Ответить
Руслан Тертышный 2015-03-16 11:34:37
Виктор, скорее всего проблема именно в использовании ломанной и устаревшей версии движка. Скачайте бесплатную версию 4.6 или даже 5.0 (недавно вышла) и попробуйте повторить все, что делали.
P.S. JDK я не ставил. Стоит традиционное JRE и больше по Яве ничего. Все прекрасно работает с Android SDK без лишних костылей :)
P.P.S. Если хотите, могу выслать Вам на почту свою сборку SDK.

Ответить
Виктор 2015-03-16 14:20:35
Руслан, обновил Юнити до 4.6.3f1, он затребовал SDK 18.1.1 > 21
Но работает только с 21й версией.
В андроиде ошибка прекратилась, благодарю за подсказку.
Но приложение закрывается сразу после запуска.
Заметно, что на момент запуска экран разворачивает на 90 градусов=)) Потом обратно. Думаю может в самом виртуальном устройстве что-то не так.

У меня папка sdk 1Гб весит, может лишнего накачал, если не затруднит отправьте на air72ru@ya.ru буду благодарен.

Ответить
Павел 2015-04-02 19:49:13
Выдаёт вот такую ошибку:ssets/Leps.cs(10,47): error CS0619: `UnityEngine.Component.audio' is obsolete: `Property audio has been deprecated. Use GetComponent<AudioSource>() instead. (UnityUpgradable)'
Что делать?

Ответить
Руслан Тертышный 2015-04-02 20:02:14
Павел, не видя Вашего скрипта, не могу сказать, в чем проблема, но, судя по сообщению, в 10-й строке Вы неверно обратились к компоненту audio. Если можно, приведите фрагмент кода из 10-й строки и связанных с ней.

Ответить
Павел 2015-04-02 20:07:19
using UnityEngine;
using System.Collections;
public class Leps : MonoBehaviour {

public AudioClip Lepsvodka;
public AudioClip Lepslondon;

void OnMouseDown(){
if (this.name == "Lepsvodka"){audio.PlayOneShot (Lepsvodka);}
if (this.name == "Lepslondon"){audio.PlayOneShot (Lepslondon);}
}
}
Ошибка Соответственно:
Assets/Leps.cs(11,47): error CS0619: `UnityEngine.Component.audio' is obsolete: `Property audio has been deprecated. Use GetComponent<AudioSource>() instead. (UnityUpgradable)'

Assets/Leps.cs(11,53): error CS1061: Type `UnityEngine.Component' does not contain a definition for `PlayOneShot' and no extension method `PlayOneShot' of type `UnityEngine.Component' could be found (are you missing a using directive or an assembly reference?)

sets/Leps.cs(12,48): error CS0619: `UnityEngine.Component.audio' is obsolete: `Property audio has been deprecated. Use GetComponent<AudioSource>() instead. (UnityUpgradable)'
Assets/Leps.cs(12,54): error CS1061: Type `UnityEngine.Component' does not contain a definition for `PlayOneShot' and no extension method `PlayOneShot' of type `UnityEngine.Component' could be found (are you missing a using directive or an assembly reference?)

Ответить
Руслан Тертышный 2015-04-02 21:52:24
У Вас ошибки в самом написании :) Вы дважды закрыли функцию OnMouseDown(), поставив лишние фигурные скобки в конце 11 и 12 строк. Должно быть так:

if (this.name == "Lepsvodka"){audio.PlayOneShot (Lepsvodka);
if (this.name == "Lepslondon"){audio.PlayOneShot (Lepslondon);

Ответить
Павел 2015-04-02 22:53:15
Всё верно,они закрывают условие
if (this.name == "Lepsvodka"){audio.PlayOneShot (Lepsvodka);}
if (this.name == "Lepslondon"){audio.PlayOneShot (Lepslondon);}

нижние две закрывают функцию и класс

Ответить
Руслан Тертышный 2015-04-02 23:19:40
А, точно. Пардон :) Просто всю неделю кодил на PHP, а там скобки в одиночных условиях необязательны, вот и принял за ошибку :)

Скорее всего ошибка у Вас в самом редакторе... Все звуки нужно вешать либо на камеру, либо на какой-то GameObject (у Вас висит на каком-то компоненте).

Как вариант, можно оставить звук там, где он и есть, но для его получения использовать конструкцию "имяОбъектаНаКоторомВиситЗвук.GetComponent<AudioSource>();" Это все приравнять к переменной для использования далее в скрипте и с командой PlayOneShot.

Однако, лучше все же перевесить звук на GameObject.

Ответить
Руслан Тертышный 2015-04-02 23:23:36
Ага :) А вот еще, в чем может быть проблема: в новой 5-й версии Юнити упразднили некоторые команды, в том числе и нашу, над которой мы бьемся :) https://docs.unity3d.com/ScriptReference/Component-audio.html

Ответить
Павел 2015-04-03 00:16:05
Как тогда будем выглядеть код для меня? Если Вам не сложно, конечо

Ответить
Руслан Тертышный 2015-04-03 13:05:42
Попробуйте явно указать зависимость:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]
public class Leps : MonoBehaviour {

public AudioClip Lepsvodka;
public AudioClip Lepslondon;

void OnMouseDown(){
if (this.name == "Lepsvodka"){audio.PlayOneShot (Lepsvodka);}
if (this.name == "Lepslondon"){audio.PlayOneShot (Lepslondon);}
}
}

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

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]
public class Leps : MonoBehaviour {

public AudioClip Lepsvodka;

vois Start(){
Lepsvodka = GetComponent<AudioSource>();
}

void OnMouseUp(){
audio.PlayOneShot (Lepsvodka);
}

Либо же еще вариант - сделать все средствами UI (там есть блок onClick, а в нем функция проигрывания звука - останется только выбрать этот самый звук).

Ответить
Павел 2015-04-03 18:34:06
Не то , не то не сработало =)

Ответить
Руслан Тертышный 2015-04-03 19:10:39
Хм :) Увы, я не пророк :) Предлагаю Вам зарегистрироваться на нашем форуме и выложить скриншоты, где было бы видно, как у Вас все размещено и подключено в редакторе. Иначе так гадать можно долго :)

Ответить
Владислав 2015-06-16 18:28:52
Подскажите как добавить поддержку мультитача в приложение,что бы играло сразу два звука при двух касаниях.

Ответить
Руслан Тертышный 2015-06-17 10:34:36
Владислав, вот урок по мультитачу: https://unity3d.com/ru/learn/tutorials/modules/beginner/platform-specific/multitouch-input

Ответить
Владислав 2015-06-17 11:18:21
Руслан,если использовать его для нашего случая,то нужно поместить тело OnMouseDown() в цикл с урока?

Дело в том что оно корректно не работает,так как наши коллайдеры реагируют все сразу на касание в любой точке экрана.

Как проверить ,что был нажат именно наш коллайдер,используя touch input?

Ответить
Руслан Тертышный 2015-06-17 12:12:09
Владислав, Вы не уточнили, для какого случая :) Вообще же для проверки столкновения с коллайдерами обычно используется метод рейкастинга. Из точки прикосновения запускается луч и отслеживается, с какими коллайдерами он пересекается. Затем из полученного массива выбирается первый и далее уже воспроизводится функция с нужными действиями.

Ответить
Руслан Тертышный 2015-06-17 12:16:44
Вот, кстати, возможно, Вам подойдет: http://docs.unity3d.com/ScriptReference/Touch-position.html Зная позицию коллайдера и тача, можно активировать коллайдер.

Ответить
Александр 2015-09-04 15:14:03
Вот недавно наткнулся на видео " Создание Angry Birds на Unity3d" - https://www.youtube.com/watch?v=pWRKhQMiMms

Понравилась подача Самчука, да и для себя много полезных фич нашёл.

Ответить
Дмитрий 2016-05-20 04:32:54
Руслан здравствуйте. Вопрос немного наивный: а Sdk андроид достаточно только одной версии (например 21) или должно быть установлено несколько версий? Увы , чем проще вопрос тем сложнее найти на него ответ :( На Вас надежда.

Ответить
Руслан Тертышный 2016-05-20 16:44:33
Дмитрий, вопрос на самом деле довольно интересный... Фактически именно с него я начал формирование своего набора SDK. Для начала я скачал 19-й SDK (19.0.3) и компоненты только на полную 15-ю версию API. Первые сборки работали только на 4-й версии Андроида.
Затем мне понадобилось добавить рекламу и оказалось, что в 15-м API не хватало некоторых компонентов. Зато, судя по отзывам на форумах, они были в 9-м API. Так моя коллекция SDK пополнилась ещё одним комплектом компонентов. А тем временем сам SDK обновился до 21-й версии. Затем было неудачное обновление до 22-го SDK, в котором многие компоненты пришлось искать в новых подпапках, а некоторых не было вообще...
Сейчас проект успешно компилируется на 23-м SDK под API 9.
Итого, подводя итоги, можно констатировать следующее. Для компиляции проекта лучше всего качать 21 или новый 23-й SDK, а компоненты докачивать, исходя из того, под какую платформу Вы хотите делать сборку. Плюс, если Вы планируете внедрять рекламу или иные плагины, то Вам также придётся скачать из раздела Extras как минимум Сервисы Гугла, Android Support Repository и Google Repository. Остальное - на Ваш выбор :)

Ответить
Дмитрий 2016-05-20 17:46:37
Руслан, большое спасибо за подробный ответ! Приятно удивлен оперативностью :) Буду пересматривать свой набор SDK. похоже в нем много лишнего.

Ответить
Руслан Тертышный 2016-05-21 14:28:50
Дмитрий, пожалуйста :) Если можно, дам напоследок ещё один совет: если всё работает как надо, возможно, не стоит ничего трогать? ;)

Ответить
Валерий 2016-08-15 11:49:35
Не получается по данному коду проиграть звук при нажатии. Обратил внимание, что сейчас функция audio не используется. Но как тогда сделать программу? Кнопкой на onckilck не выходит

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]
public class sound : MonoBehaviour {
public AudioClip a1;
public AudioClip a2;
public AudioClip a3;
public AudioClip a4;

void OnMouseDown()
{
if (this.name == "a1") { audio.PlayOneShot(a1); }
if (this.name == "a2") { audio.PlayOneShot(a2); }
if (this.name == "a3") { audio.PlayOneShot(a3); }
if (this.name == "a4") { audio.PlayOneShot(a4); }
}

}

Ответить
Руслан Тертышный 2016-08-15 13:52:10
Валерий, дело в том, что движок обновился до 5-й версии и в ней немного изменился синтаксис и принцип работы некоторых команд. Полностью прочесть про воспроизведение звука можете здесь: https://docs.unity3d.com/ScriptReference/AudioSource.PlayOneShot.html
Ваш же пример, по идеи (я до сих пор работаю на 4-й версии, поэтому проверить не могу) должен выглядеть так:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(AudioSource))]

public class sound : MonoBehaviour {
public AudioClip a1sound;
public AudioClip a2sound;
public AudioClip a3sound;
public AudioClip a4sound;
AudioSource audio;

void Start() {
audio = GetComponent<AudioSource>();
}

void OnMouseDown() {
if (this.name == "a1") { audio.PlayOneShot(a1sound); }
if (this.name == "a2") { audio.PlayOneShot(a2sound); }
if (this.name == "a3") { audio.PlayOneShot(a3sound); }
if (this.name == "a4") { audio.PlayOneShot(a4sound); }
}
}

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

Ответить
Валерий 2016-08-15 17:55:34
Руслан, спасибо!
В проект добавил остальные строки ранее, но упустил void start(). Работает.
Главное с именами не напутать

Ответить
Руслан Тертышный 2016-08-15 18:04:36
Валерий, пожалуйста :) С именами, чтобы не путаться, проще всего поступать так: называть объекты с припиской к ним их сущности (это лично мой способ - никому его не навязываю :)). То есть, префаб, например, можно "обозвать" "a1Prefab", звук - "a1Sound", а, например, переменные: "a1VarEnergy", "a1VarPoints", "a1VarProgress" и т.п. Так у Вас везде будут уникальные имена и Вы всегда будете знать, с какими объектами, что и как у Вас соотносится.

Ответить

Страницы: [1]

Оставить комментарий


1 Все комментарии проверяются. Спам и некультурные высказывания будут удалены.
2 Задавать вопросы лучше на нашем форуме. Просто зарегистрируйтесь и создайте новую тему.

captcha
Обновить
Идёт загрузка...
* Поля, обязательные для заполнения

Наша рассылка:


Полезный совет:


  
Мы в Google+

Система проверки ошибок от Mistakes.ru