Промо-коды.apk
Сейчас у многих магазинов популярны так званые «промо-коды», по которым покупатели могут получить скиду на товар. В среднем клиентская база магазинов, использующих такие «инновации» состоит из покупателей в возрасте от 16 до 30 лет. Люди данной возрастной категории практически не расстаются со своими смартфонами. На лицо актуальность мобильных приложений, которая растёт с каждым годом. Это и навело нас с ребятами на мысль о создании приложения для раздачи этих самых промо-кодов.
Концепция и маркетинг
После краткого обсуждения мы остановились на разработке лабиринта в котором пользователь должен отыскать промо-код. Количество промо-кодов, как и частота генерации лабиринта будет зависеть от заказчика. Найти промо-код в лабиринте может каждый пользователь, но получат его только первые N клиентов.
Преимущества для пользователя:
- приложение бесплатное, клиент не должен ни за что платить;
- увлекательная «гонка» за промо-кодом.
Преимущества для заказчика:
- увеличение клиентской базы, за счёт оригинального игрового формата раздачи промо-кодов;
- минимальные затраты на разработку и хостинг приложения;
- являясь владельцами приложения, возможность внедрения рекламы.
Преимущества для разработчиков:
- при имеющемся шаблоне, быстрая разработка под конкретный магазин, путём изменения дизайна и минимального изменения механики;
- постоянный доход в виде поддержки исправности хостинга и устранения проблем работы приложения;
- возможность внедрения рекламы (при согласии заказчика).
Unity3D как основной инструмент для разработки
При выборе игрового движка, мы остановились на Unity3D. Этому послужило сразу несколько причин:
- бесплатная версия (если ваша организация имеет заработок меньше 100 000 $ в год);
- широкий функционал бесплатной версии;
- мы уже имели небольшой опыт в разработке на данном движке.
Хранение данных
Когда стал вопрос о хранении данных, таких как: название акций, номера промо-кодов, карта лабиринта и т.д., мы пришли к выводу, что хранить данные локально – как минимум глупо.
Во-первых, увеличивается объём приложения, что засоряет память устройства, и, во-вторых, возникнет проблема с обновлением (пришлось бы вечно делать новый build и заливать его на площадку). Так мы пришли к выводу, что игра будет работать по принципу “Клиент-Сервер-БД”.
![image](https://habrastorage.org/getpro/habr/post_images/b57/785/df3/b57785df30efb2b9d5ff50bdbf3a01d3.png)
Почему не “Клиент — БД”? – Потому что в таком случае каждый пользователь будет иметь прямой доступ к БД, что сводит её защищённость к нулю.
Так как БД будет находится удаленно, нам понадобился хостинг. Для прототипа нашей игры мы выбрали бесплатный хостинг. Основными критериями были: предоставление сразу двух БД и возможность редактирования данных через PhPMyAdmin. В силу скудного опыта работы с БД, последнее стало для нас ключевым.
Доступ к БД
Так как игра принимает принцип “Клиент-Сервер-БД” – логично, что клиент должен обратиться к серверу, чтобы тот в свою очередь сделал запрос к БД. Возврат данных происходит в обратном порядке. Обращение от клиента к серверу производится с помощью уже существующих в Unity WWW и WWWForm (подробнее смотрите в API Scripting от Unity) с использованием C#, а от сервера к БД с помощью обычного php-скрипта. Для распределения данных, которые берутся из БД, в Unity был использован JSON.
<?php
$servername = "**";
$username = "**";
$password = "**";
$dbname = "**";
//Create connection_aborted
$con = mysqli_connect($servername,$username,$password,$dbname);
mysqli_set_charset($con, "utf8");
$id = $_REQUEST["id"];
$sql = "SELECT * FROM UnityDB WHERE id = {$id}";
$result = mysqli_query($con,$sql);
$rows = array();
$rows = mysqli_fetch_assoc($result);
$rows['Map'] = base64_encode($rows['Map']);
echo json_encode($rows,JSON_UNESCAPED_SLASHES);
mysqli_close($con);
?>
“Какое сегодня число?”
В каждой строке таблицы мы использовали id как идентификатор, по которому мы выбирали из всей таблице то, что нас интересует. Он имел значение от 1 до 31, в зависимости от числа данного месяца. Как вы уже поняли, на каждый id был готов свой лабиринт, промо-код и т.д. Проверка осуществлялась через короткий php-скрипт, который возвращает число в определенном часовом поясе (чтобы у всех было одно и то же число).
Синтаксис был реализован таким образом, чтобы не перегружать БД лишними запросами.
Сначала мы обращались к скрипту с датой, который возвращал число месяца. После этого шла проверка локального числа (которое сохранялось во время последнего запроса к БД) с числом, который возвратил скрипт. Если они одинаковы – тогда мы не обращаемся к БД, а просто используем локальные данные (то, что мы взяли из прошлого обращения к БД), а если даты различаются – тогда мы обращаемся к БД, а локальное число заменяем на то, что возвратил скрипт с датой.
<?php
date_default_timezone_set("UTC"); // Устанавливаем часовой пояс по Гринвичу
$time = time(); // Вот это значение отправляем в базу
$time += 5 * 3600; // Добавляем 3 часа к времени по Гринвичу
echo date("d", $time); // Выводим время пользователя, согласно его часовому поясу
?>
Стилистика игры
После написания основной механики игры, нужно было определиться с дизайном графики. Мы остановились на простом “мультяшном” стиле, потому что:
- несмотря на шаблонность, он приятен глазу;
- его легко реализовать как в 3D так и в 2D;
- данный стиль легко вариацируется в более сложные, что позволяет быстрее и эффективнее выполнить требования заказчика
![image](https://habrastorage.org/getpro/habr/post_images/6ab/4d7/7a1/6ab4d77a188d22f6a8d1530d94896273.png)
3D модели
Все 3D модели, включая модель персонажа и развертку, были сделаны в 3D Studio MAX.
Анимация же была сделана при помощи Mixamo, так как там уже есть готовые пресеты, которых нам было вполне достаточно.
![image](https://habrastorage.org/getpro/habr/post_images/c1b/437/2b2/c1b4372b258d5a5fb473967ec554c73b.png)
![image](https://habrastorage.org/getpro/habr/post_images/461/558/d89/461558d891c09ad4db74e63a823c52a8.png)
Текстурирование
Наша 3D модель состояла не более, чем из трёх цветов. Сама развертка выглядела таким образом:
![image](https://habrastorage.org/getpro/habr/post_images/7ad/1b7/5e8/7ad1b75e80e129e5161ae370aa19ded8.png)
Модель мы разделили на части в зависимости от цвета. В итоге сама текстура выглядела вот так:
![image](https://habrastorage.org/getpro/habr/post_images/fd9/338/429/fd93384294bfc28a55e9a13ceb8c2f53.png)
Текстуру можно сделать любого размера и это не повлияет на качество, так как это всего навсего два сплошных цвета. Естественно, мы сделали её как можно меньше, чтобы она не занимала много места на устройстве.
Удобно и быстро создавать различные вариации цветов одежды персонажа, что является несомненным плюсом при корректировки приложения под конкретный заказ.
Создать нужный материал в движке тоже не составило труда — в Unity уже присутствует Toon Shader, который нам практически полностью подходил. Немного изменив его мы достигли нужного нам результата.
Дизайн UI
Интерфейс создавался в Adobe Illustrator.
![image](https://habrastorage.org/getpro/habr/post_images/cc6/cb3/072/cc6cb3072602bdabbbf8e2d6e31ccbd0.png)
Система создания анимации в Unity сделана довольно удобно, что позволило нам легко анимировать меню, кнопки и пр.
![image](https://habrastorage.org/getpro/habr/post_images/44c/e0c/88f/44ce0c88f00db7c5ba15ae40827da0b9.gif)
Заключение
Разработав такой нехитрый шаблон, вы можете спокойно предлагать свой товар, магазинам или даже каким-то заведениям. Правильная презентация и портфолио в виде сделок с другими магазинами вам в этом помогут. Вот такой плёвый стартап придумали трое второкурсников холодным зимним вечером.
sefus
Так:
Тоже не надо.