Мечтаете создать собственную игру? Хотите начать этим зарабатывать или стремитесь к личностному развитию и росту за счет интересного хобби? Наверняка, у вас есть много вопросов, касающихся самого процесса выпуска такого программного обеспечения.
И еще больше у людей, интересующихся данной темой, возникает сомнений в собственных силах. Развеять их все позволяют программы для создания игр для Андроид. С ними можно позабыть о необходимости изучать языки программирования, получать новые знания и навыки, что требует больших инвестиций времени и сил, а порой и денег.
Как самому создать игру на Android с нуля
Сложно найти человека, который бы отказался от возможности самостоятельно создать игру для устройств Андроид. И при этом мало кто знает, что сделать это можно, не изучая предварительно программирование, даже его азы.
Все, что нужно, – скачать программу, представляющую собой онлайн-конструктор, удобный сервис, позволяющий разрабатывать бесплатные и платные игрушки, а также те, на которых можно зарабатывать за счет размещения рекламы.
Как Сделать Игру Без Программирования
Движки для создания игр на Android
Опасаетесь того, что попытка создать игру на Андроид обернется полным провалом? Не отказывайтесь от реализации оригинальной идеи, осуществления мечты только из-за страха. Процесс разработки программного обеспечения на операционную систему Android не такой сложный, как кажется многим.
Не стоит забывать, что сегодня технологический прогресс позволяет автоматизировать многие процессы, что существенно облегчает жизнь людей. Процесс создания игры также может быть автоматизирован за счет простой и удобной утилиты.
Виртуальный конструктор не требует от юзера знаний языков HTML, CSS, JS, PHP и т. д. Использовать специальные движки – одно удовольствие, особенно, если речь идет о проверенных, хорошо зарекомендовавших себя.
Unity 3d программа для создания игр и приложений
Приложение, позиционирующее себя, как межплатформенная среда, позволяющая создавать компьютерные игры и различные сервисы. С ее помощью можно выпустить софт для ПК, мобильного гаджета, а также игровой консоли.
Источник: dzen.ru
Создание моментальных игр на Unity в Google Play Instant
Google анонсировал сервис Google Play Instant в марте 2018-го; с тех пор гейм-девелоперы могут создавать игры с мгновенным погружением. Существует несколько способов привлечения игроков в мгновенные игры: от кнопки TRY NOW («Попробуйте сейчас!») в Google Play до обычной ссылки, которую могут расшарить друг другу пользователи. Благодаря этому разработчики могут продемонстрировать свою игру и привлечь новых пользователей. В этой статье рассказывается о том, как создать билд готовой к выпуску мгновенной игры на Unity с нуля, а также преимущества мгновенных игр. Продолжение под катом.
Как создать свою игру? | ТОП 5 программ для новичков
При помощи сервиса Google Play Instant вы можете вывести свои игры на новый уровень:
1. Повысить возможности нахождения (discoverability)
Благодаря Google Play Instant игрокам будет легче найти и попробовать вашу игру. Пользователи могут запустить вашу игру из Google Play Store одним кликом — рядом с кнопкой загрузки появится кнопка TRY NOW, также с мобильного сайта можно перейти на мгновенную игру, просто нажав на веб-баннер.
И это еще не все. Пользователи могут попробовать вашу игру по расшаренной ссылке через Google Search, социальные сети, мессенджеры, электронную почту и другие платформы.
2. Подвести к установке
Так как игрокам не нужно устанавливать игру на устройство, они с большим энтузиазмом согласятся ее попробовать. Мгновенные игры не требуют времени на установку и не занимают память на устройстве юзера. Они дают пользователю шанс увидеть лучшее, что есть в игре, а затем установить полную версию без потери прогресса.
3. Улучшить удержание (retention)
Когда вы даете пользователю шанс попробовать вашу игру, они убеждаются в том, что она стоит того, чтобы ее установить. Также уменьшается количество пользователей, которые удаляют игру сразу после установки. Пользователи устанавливают игру осознанно и наслаждаются ей, что повышает количество игроков, которые ее установили.
Гейм-девелоперы уже оценили преимущества мгновенных игр в сравнении с устанавливаемыми играми (кейсы тут на английском):
- Hothead Games saw a 19%+ increase in user acquisition with their game Mighty Battles.
- King saw an increase in user acquisition with their game Bubble Witch 3 Saga.
- Jam City was able to find high-quality players with Panda Pop.
- Playtika found new players and increased user retention and revenue.
Как безболезненно интегрировать Google Play Instant с игрой на Unity?
Вы можете собрать мгновенную игру и разместить ее на внутренней платформе для тестирования за несколько часов. Вы сможете протестировать свою игру и тут же ее показать (если она не превышает лимит 13,5 Мб для игр на Unity). Вы увидите кнопку TRY NOW в Play Store. После того, как игра размещена в тестовом окружении, нужно сфокусироваться на следующем:
- Определиться с тем, как должна выглядеть мгновенная игра
- Уменьшить размер билда до 13,5 Мб (лимит для Unity-игр)
- Прогнать мгновенной игры через тесты и QA (игра должна отвечать требованиями песочницы и разрешениям в отношении безопасности пользователя). Мы рекомендуем тестировать игру на разных версиях OS — хотя бы на Nougat и Oreo
Что дальше?
Создайте мгновенную игру за 5 шагов.
Шаг 1: Создаем рабочую среду
Перед тем, как приступить к созданию мгновенной игры, пробегитесь по чек-листу, дабы убедиться в том, что у вас есть все, что требуется.
- Unity версии 5.6 или новее (мы не рекомендуем использовать сборку старее 2017.4)
- Плагин на Unity Google Play Instant (asset store) (source)
- Устройство с Android (физическое или виртуальное) с версией не старее Android 5.0 (Lollipop), работающее в режиме разработчика и с включенной отладкой USB
- Доступ к исходному коду APK для сборки версий отладки (debug) и релизной версии
- Установленное окружение для тестирования на Google Play Console
- Учетная запись в Unity Development Beta (обязательно для продакшна)
Шаг 2: Собираем и тестируем мгновенную игру
Теперь вы конвертируете существующую игру в мгновенную игру. Не беспокойтесь пока об уменьшении размера или сборке билда для мгновенной игры — эта инструкция даст вам возможность понять, как выглядит весь процесс.
1. Выберите PlayInstant → Build Settings
2. В выпадающем меню смените Android Build Type на Instant
- Пока вы не настроите ссылку на цифровой ассет (Digital Asset Link), не заполняйте строку Instant Apps URL
- Если нужно, вы можете указать другое окружение в строке Override Scene
- Если вы используете цифровые ассеты, выберите соответствующий манифест в поле AssetBundle Manifest
- Нажмите Save
3. Выберите PlayInstant → Player Settings. В настройках будет всплывающее окно:
- Нажмите на кнопку Update рядом с пунктами списка Required changes, чтобы сохранить настройки перед тем, как запустить мгновенное приложение
- Мы рекомендуем обновить настройки согласно Recommended changes (нацелено в основном на снижение размера)
- Закройте всплывающее окно
4. После настройки выберите PlayInstant → Build and Run, чтобы запустить мгновенное приложение на подключенном устройстве.
Шаг 3: Загружаем во внутреннее окружение для тестирования
Последний шаг с созданной мгновенной игрой — возьмите билд и загрузите его во внутреннюю среду для тестирования Play Store (в ней может находиться одновременно до 100 тестирующих). Чтобы загрузить игру на внутреннюю платформу для тестирования, не обязательно соблюдать лимит в 13,5 Мб.
- Выберите PlayInstant → Build for Play Console
- Зайдите в Google Play Console, убедитесь, что выбрано нужное приложение, откройте вкладку Android Instant Apps.
- Выберите Instant app internal test и следуйте инструкциям на этой странице, чтобы загрузить файл, который вы создали в процессе выполнения 1-го шага. Больше информации в этом гайде по релизу мгновенного приложения: releasing an instant app.
Управление релизом мгновенного приложения через Google Play Console
Примечание: убедитесь, что вы должным образом настроили доступ для списка внутренних тестировщиков приложения. Изменение настроек здесь: App releases → Instant app internal test → Manage Testers.
Шаг 4: Уменьшаем до лимитных 13,5 Мб
После ознакомления со всеми техническими тонкостями тестирования билда мгновенной игры нужно решить, как будет выглядеть игра и приступить к уменьшению размера. Не переживайте, если игра много весит — разработчики со сборками размером более 350 Мб могут безболезненно запускать мгновенные игры. Вот несколько техник уменьшения объема сборки:
Оптимизация настроек
Как мы видели раньше в: PlayInstant → Player Settings, это меню предлагает некоторое количество рекомендаций для снижения размера сборки. Перечисленные изменения уменьшают размер игры:
- Монобилды должны поддерживать сокращение неиспользуемого кода
- Графический API только OpenGLES2
- Билды IL2CPP должны поддерживать сокращение неиспользуемого кода
Не пытайтесь впихнуть всю игру в мгновенное приложение. Мгновенная игра должна показать геймплей — продемонстрируйте туториал или несколько особенных уровней. Уберите ненужные текстуры, модельки, изображение и аудиосопровождение — словом, все то, не является основой геймплея.
Наконец, чтобы уменьшить размер, сожмите цифровые объекты:
- Разрешение текстур
- Количество полигонов в 3D-моделях
- Качество аудиодорожек
Использование ассетов (Asset Bundles)
Наборы ассетов (Asset Bundles) помогут вам загружать ассеты прямо в процессе исполнения игры. Если ассеты не будут загружены до запуска, они не будут учитываться в лимите 13,5 Мб. Это самый распространенный способ для разработчиков игр снизить размер мгновенной игры. Вам нужно три компонента:
- Набор ассетов, созданный из окружения вашей мгновенной игры.
- Загрузочный экран, который покажет пользователю информацию о загрузке ассетов в фоновом режиме.
- Веб-сервер или CDN в качестве хоста ассетов.
Примечание: вы можете использовать столько наборов ассетов, сколько захотите, но каждый ассет не должен превышать размер 15 Мб.
- Выберите PlayInstant → Quick Deploy
- Откройте вкладку Bundle Creation, выберите окружение для динамического показа. После этого выберите Build AssetBundle внизу экрана и загрузите файл на ваш веб-сервер или CDN.
- Откройте вкладку Loading Screen и введите URL для вашего набора ассетов, а также фоновые текстуры, которые вы хотите использовать для загрузочного экрана (хватит и одной по умолчанию). После завершения нажмите Create Loading Scene.
У вас должен получиться загрузочный экран, который будет вызывать ваш набор ассетов. Можно поискать кастомный автогенерируемый скрипт загрузочного экрана для Unity, если хотите посмотреть, как он делается, или настроить его так, как удобно вам.
Шаг 5: Помогаем игроку перейти от мгновенной игре к установленной игре
Теперь нам нужно подумать, как пользователь будет переходить от мгновенной игры к полной. Если нужно, вы можете перенести данные через диалог, используя Cookie API (встроены в плагин Unity в Google Play Instant).
Обновление мгновенной игры до установленного приложения
Ваша игра должна предложить пользователю способ установки полной версии — всплывающая подсказка или кнопка (но только не во время игрового процесса!). Когда пользователь готов установить игру, плагин вызывает ShowInstallPromptmethod и направляет пользователя в Google Play:
using GooglePlayInstant; … public void install()
Сохранение данных при обновлении до устанавливаемой версии (опционально)
В некоторых случаях вам потребуется сохранить данные игрока и его прогресс во время мгновенной игры. Например:
- Когда игрок приобретает внутриигровые покупки или кастомизирует персонажа
- Если мгновенная игра похожа на игровой туториал (у игрока должна быть возможность пропустить обучение в установленной игре)
- Чтобы вознаградить игрока за то, что он установил игру из мгновенной версии
1. Вызовите CookieApi.SetInstantAppCookie , чтобы сохранить строки с данными из мгновенной игры
using GooglePlayInstant; … public void StoreData(string data)
2. Вызовите CookieApi.GetInstantAppCookie в установленной игре, чтобы вернуть строки с данными
using GooglePlayInstant; … var data = CookieApi.GetInstantAppCookie(data);
Эти шаги помогут вам освоить процесс создания игры через Google Play Instant. По ссылкам вы можете прочитать больше документов, изучить часто задаваемые вопросы или получить информацию о мгновенных играх.
- Разработка игр
- Разработка под Android
- Unity
- Игры и игровые консоли
Источник: habr.com
Создаём музыкальную игру с библиотекой Oboe от Google — часть 1
Совсем недавно Google представила библиотеку Oboe для создания аудиоприложений с минимальными задержками. Мы перевели их руководство по созданию простой игры.
Чему вы научитесь:
- Как проигрывать звуки с помощью библиотеки Oboe;
- Как создавать аудиопотоки с низкой задержкой;
- Как смешивать звуки;
- Как проигрывать звуки точно в нужное время;
- Как синхронизировать аудио с экранным интерфейсом.
Что вам понадобится:
- Android Studio 3.0.0 или выше;
- NDK и Build Tools;
- Устройство с Android Jelly Bean (16 уровень API) или выше для тестирования. Устройства Pixel подойдут лучше всего;
- Не помешает знание C++, но оно не является обязательным.
В чём суть игры?
Игра проигрывает клёвый четырёхбитный трек в цикле. Когда игра начинается, она также воспроизводит звук хлопка на первых трёх долях такта.
Пользователь должен повторить три хлопка с теми же промежутками во времени, нажимая на экран после начала второго такта.
При каждом нажатии пользователя игра воспроизводит звук хлопка. Если нажатие происходит в нужное время, экран загорается зелёным цветом. Если нажатие произошло слишком рано или слишком поздно, экран загорается оранжевым или фиолетовым соответственно.
Приготовления
Склонируйте проект
Склонируйте репозиторий Oboe на GitHub и переключитесь на ветку io18codelab :
$ git clone https://github.com/google/oboe $ cd oboe $ git checkout io18codelab
Откройте проект в Android Studio
Запустите Android Studio и откройте проект:
- File → Open
- Выберите папку «oboe/samples».
Обратите внимание, что этот проект содержит все примеры кода для библиотеки Oboe. Нам понадобится только RhythmGame.
Запустите проект
Выберите конфигурацию запуска RhythmGame:
Затем нажмите Ctrl+R для сборки и запуска шаблона приложения — оно должно скомпилироваться и запуститься, но всё, что оно делает, — показывает серый экран. Далее мы будем добавлять функциональность.
Откройте модуль RhythmGame
Файлы, с которыми мы будем работать, хранятся в модуле RhythmGame. Убедившись, что в окне Project выбран режим Android, разверните его.
Теперь разверните папку cpp/native-lib. На протяжении этой статьи мы будем редактировать Game.h и Game.cpp.
Сравниваем с финальной версией
Будет полезно в течение работы сравнивать текущую версию кода с финальной, которая хранится в ветке master. С Android Studio можно легко сравнивать ветки.
Android Studio нужно знать, где находится исполняемый файл git. Как правило, его можно узнать, введя which git в терминале. Затем вы сможете обновить путь до git в Android Studio через Preferences→Version Control→Git.
Сначала нужно разрешить интеграцию с системой контроля версий:
- VCS→Enable Version Control Integration…
- Выберите git.
Теперь вы можете сравнивать свой код с версией в ветке master:
- Нажмите на текущую ветку в правом нижнем углу;
- Выберите master→Compare.
В результате откроется новое окно. Выберите вкладку «Diff». Должен появиться список файлов с разницей между ними.
Выберите любой файл, чтобы посмотреть различия.
Обзор архитектуры
Пользовательский интерфейс
На левой части графика показаны объекты, связанные с пользовательским интерфейсом.
OpenGL Surface вызывает tick() каждый раз, когда экран нужно обновить, как правило, 60 раз в секунду. Затем Game даёт объектам для рендеринга интерфейса указание отобразить пиксели на поверхности OpenGL, после чего экран обновляется.
Интерфейс игры очень простой: единственный метод SetGLScreenColor() обновляет цвет экрана.
События нажатий
При каждом нажатии на экран вызывается метод tap() , в который передаётся время нажатия.
Аудио
На правой части графика показаны объекты, связанные с аудио. Oboe предоставляет класс AudioStream и связанные объекты, чтобы дать возможность Game отправлять аудиоданные на выходное устройство (динамики или наушники).
Каждый раз, когда AudioStream требуется больше данных, он вызывает метод AudioDataCallback::onAudioReady() . Он передаёт массив audioData в Game , где массив должен заполниться фреймами аудио в количестве numFrames .
Проигрываем звук при нажатии на экран
Чтобы воспроизвести звук хлопка нужен файл, в котором содержатся цифровые аудиоданные и аудиопоток.
Загружаем файл со звуком
В проекте в папке src/main/assets есть файл CLAP.raw, который содержит PCM-аудиоданные в следующем формате:
- Формат: 16-битное целое число;
- Каналы: 2 (стерео);
- Частота дискретизации: 48,000 кГц.
Если вы хотите просмотреть или воспроизвести этот файл, вы можете загрузить его в аудиоредактор Audacity, перейдя в меню по вкладкам File→Import→Raw Data и использовать указанные выше опции.
Чтобы загрузить этот файл в игру, нужно использовать метод SoundRecording::loadFromAssets . Откройте Game.h и объявите поле типа SoundRecording* с именем mClap и значением nullptr :
private: //. имеющийся код SoundRecording *mClap;
Теперь откройте Game.cpp и добавьте следующий код в метод start() :
void Game::start()
Это необходимо для загрузки PCM-аудиоданных в объект SoundRecording в начале игры.
Создаём аудиопоток
Чтобы создать аудиопоток, воспользуемся AudioStreamBuilder , который позволяет указывать желаемые свойства аудиопотока до его создания.
Устанавливаем свойства потока
Свойства потока должны совпадать со свойствами источника.
Откройте Game.h и объявите поле типа AudioStream* с именем mAudioStream :
private: // . имеющийся код. AudioStream *mAudioStream;
Теперь добавьте следующий код в метод start() в Game.cpp:
void Game::start() < // . имеющийся код. AudioStreamBuilder builder; builder.setFormat(AudioFormat::I16); builder.setChannelCount(2); builder.setSampleRate(48000); >
Настраиваем обратный вызов
Воспользуемся обратным вызовом для передачи аудиоданных в поток. Мы делаем именно так, потому что такой подход обеспечивает лучшую производительность.
Чтобы использовать обратный вызов, нужно объявить объект, который реализует интерфейс AudioDataCallback . Вместо создания нового объекта можно реализовать этот интерфейс в Game . Откройте Game.h, найдите строку class Game < и замените её на class Game : public AudioStreamCallback < .
Теперь нужно переопределить метод AudioStreamCallback::onAudioReady() :
public: // . имеющийся код. // Наследуется от oboe::AudioStreamCallback DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override;
Параметр audioData для onAudioReady является массивом, который заполняется аудиоданными с помощью mClap->renderAudio .
Примечание Каждый раз, когда вы получаете контейнерный массив типа void * , не забывайте привести его к формату текущего потока данных и предоставляйте данные только в этом формате. В противном случае это обернётся ужасными шумами!
Добавим реализацию onAudioReady() в Game.cpp:
// . имеющийся код. DataCallbackResult Game::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) < mClap->renderAudio(static_cast(audioData), numFrames); return DataCallbackResult::Continue; >
Возвращаемое значение DataCallbackResult::Continue говорит потоку о вашем намерении продолжать посылать аудиоданные, а это значит, что обратные вызовы должны продолжаться. Если вернуть DataCallbackResult::Stop , обратные вызовы прекратятся и поток больше не будет воспроизводить аудио.
Чтобы завершить создание обратного вызова, нужно сообщить конструктору потоков, где найти объект обратного вызова с помощью setCallback() в start() :
void Game::start() < // . имеющийся код. builder.setSampleRate(48000); builder.setCallback(this); >
Создание и запуск аудиопотока
Когда всё готово, создать и запустить поток не составляет труда. Добавьте этот код в start() :
void Game::start() < // . имеющийся код. builder.setCallback(this); // Создаём поток Result result = builder.openStream( if (result != Result::OK)< LOGE(«Failed to open stream. Error: %s», convertToText(result)); >// Запускаем поток result = mAudioStream->requestStart(); if (result != Result::OK) < LOGE(«Failed to start stream. Error: %s», convertToText(result)); >>
Проверка ошибок: всегда проверяйте результат операций потока и тщательно обрабатывайте все ошибки. Почти все методы в Oboe возвращают объект Result , который можно проверить на наличие Result::OK и привести к читабельной строке с помощью convertToText() .
Обработка нажатий
Метод tap() вызывается при каждом нажатии на экран. Начнём воспроизведение звука хлопка, вызвав setPlaying() . Добавьте этот код в tap() :
void Game::tap(int64_t eventTimeAsUptime) < mClap->setPlaying(true); >
Соберите и запустите приложение. При нажатии на экран вы должны услышать звук хлопка.
Оптимизация задержки аудиопотока
Как вы могли заметить, между нажатием на экран и воспроизведением звука проходит определённое время, которое называют задержкой. Как правило, она исходит из двух источников: тачскрина и аудиопотока.
Мы можем оптимизировать задержку аудиопотока, изменив его свойства на следующие:
- Установив значение PerfomanceMode равным LowLatency ;
- Установив значение SharingMode равным Exclusive ;
- Уменьшив размер внутреннего буфера.
Откройте Game.cpp и добавьте эти строки сразу после создания обратного вызова в start() :
void Game::start() < // . имеющийся код. builder.setCallback(this); builder.setPerformanceMode(PerformanceMode::LowLatency); builder.setSharingMode(SharingMode::Exclusive); // . имеющийся код. >
Установить размер буфера можно только после создания потока. Добавьте этот код после создания потока в start() :
void Game::start() < // . existing code. Result result = builder.openStream( if (result != Result::OK)< LOGE(«Failed to open stream. Error: %s», convertToText(result)); >// Уменьшаем задержку потока, установив размер буфера кратным размеру «всплеска» mAudioStream->setBufferSizeInFrames(mAudioStream->getFramesPerBurst() * 2); // . имеющийся код. >
Так мы устанавливаем размер буфера равным двум «всплескам» — данным, которые записываются в течение каждого обратного вызова. Мы выбираем именно два всплеска, так как это хороший компромисс между задержкой и защитой от буферной недогрузки. Это часто называют многократной буферизацией и используют в графическом программировании.
Соберите и запустите приложение. Вы должны заметить, что время между нажатием и звуком хлопка уменьшилось и игра ощущается более отзывчивой. Хорошая работа!
Воспроизведение нескольких звуков
Один звук может быстро надоесть. Было бы неплохо проигрывать на фоне какой-нибудь бит, под который можно нажимать на экран.
На данный момент игра помещает в аудиопоток только звуки хлопков.
Используем микшер
Чтобы проигрывать несколько звуков одновременно, нужно смешать их с помощью Mixer .
Создаём фоновую дорожку и микшер
Откройте Game.h и объявите ещё один SoundRecording* для фоновой музыки и Mixer :
private: // . имеющийся код. SoundRecording *mClap; SoundRecording *mBackingTrack; Mixer mMixer;
Теперь добавьте в Game.cpp этот код после загрузки звука хлопка в start() :
void Game::start() < mClap = SoundRecording::loadFromAssets(mAssetManager, «CLAP.raw»); mBackingTrack = SoundRecording::loadFromAssets(mAssetManager, «FUNKY_HOUSE.raw»); mBackingTrack->setPlaying(true); mBackingTrack->setLooping(true); mMixer.addTrack(mClap); mMixer.addTrack(mBackingTrack); // . имеющийся код. >
Этот код загружает содержимое ресурса FUNKY_HOUSE.raw (который содержит PCM-данные в том же формате, что и ресурс звука хлопка) в объект SoundRecording . Воспроизведение начинается при запуске игры и продолжается бесконечно.
Звук хлопка и фоновая музыка добавляются в микшер.
Обновляем обратный вызов
Теперь нам нужно сделать так, чтобы обратный вызов использовал микшер вместо звука хлопка. Обновите onAudioReady() следующим образом:
DataCallbackResult Game::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) < mMixer.renderAudio(static_cast(audioData), numFrames); return DataCallbackResult::Continue; >
Соберите и запустите игру. Вы должны услышать фоновую дорожку и звук хлопка при нажатии на экран.
В следующей части мы займёмся механикой игры и визуальной частью.
Источник: tproger.ru