Привет Хабр. Хочу поделиться опытом в разработке игры-викторины на Unity 5 версии. Замечу, что подобная игра уже выпускалась мной в 2014 году и набирала 7800 скачиваний. Из-за ужасной реализации игра заработала 80% удалений и проект был заброшен. Попробуем запустить игру по новой, исправив ошибки предшественника.

В статье рассмотрим такие темы как:

  1. Идея игры
  2. Структура проекта
  3. Особенности игровой логики и способы реализации
  4. Внедрение инструментов монетизации in app purchase и официального плагина AdMob
  5. Продвижение

Идея игры


Идея игры простая. Мы зашифровываем популярные песни в виде смайлов emoji и предлагаем пользователю расшифровать.

image


На момент публикации, подобных русскоязычных игр в Google Play нет.

Структура проекта


При разработке на Unity я не использую паттернов, но стараюсь разделить логику от отображения.



Игровой объект Display (Canvas) является родительским элементом UI, на нем висит класс для доступа ко всему UI — GameDisplay. Весь интерфейс размещается в родительском Display (Canvas) и мы при необходимости ссылаемся к элементам UI через класс GameDisplay.

Для обработки взаимодействия с UI я создаю пустой игровой объект Handlers и на нем размещаю класс(ы), который содержит методы для обработки нажатия кнопок.

Для удобства группировки, все это мы помещаем в пустой игровой объект UI (не является элементам интерфейса и не отображается).

Пример класса GameDisplay
public class GameDisplay : MonoBehaviour {

    public GameObject LevelNumText;
    public GameObject InputField;
    public static GameObject StaticInputField, StaticAlertsText;
    public GameObject AlertsText;


    float AlertHideTimer = 4f;

    void Awake()
    {
        // для доступа к элементам UI создаем static ссылки на объекты
        StaticInputField = InputField;
        StaticAlertsText = AlertsText;
    }


Пример класса Handler:
namespace NavigationHandlers
{
    public class NavigationHandlers : MonoBehaviour
    {
        public void LoadHowToPlayScene()
        {
            SceneManager.LoadScene(1);
        }

        public void StartGame()
        {
            SceneManager.LoadScene(2);
        }

        public void BackToMainMenu()
        {
            SceneManager.LoadScene(0);
        }
    }
}


В объекте Levels содержатся наши уровни Level_(num). Как видно по скрину, Level_1 элемент UI содержащий компонент grid layout group. В Level_1 помещены дочерние Image элементы, которые отображают смайлы и группируются в grid благодаря родительскому компоненту.

Особенности игровой логики и хранения данных


Для сохранения незначительно количества игровых данных (счет\имя игрока и.т.д) я использую PlayerPrefs обернутый для удобства в класс DB.

Пример класса DB:
public class Db : MonoBehaviour {

    public static List<string> answers = new List<string>();

    public static void SaveDb()
    {
        PlayerPrefs.Save();
    }

    public static int CurrentLevel
    {
        get { return PlayerPrefs.GetInt("CurrentLevel"); }
        set { PlayerPrefs.SetInt("CurrentLevel", value); }
    }


С помощь этого, мы имеем возможность удобно обращаться к бд Db.CurrentLevel = Db.CurrentLevel + 1;

Логика игры не сложная и состоит из одного класса Game. Все уровни (имеют тег Level) по умолчанию активированы. Наша задача найти и отключить, за исключением текущего CurrentLevel.

// находим все уровни по тегу
Levels = GameObject.FindGameObjectsWithTag("Level");

// деактивируем ненужные 
foreach (GameObject Level in Levels)
        {
            // деактивируем все уровни которые не подходят текущему
            if (Level.gameObject.name != "Level_" + Db.CurrentLevel + "")
            {
                Level.gameObject.SetActive(false);
            }
            // который подходит активируем
            else
            {
                Level.gameObject.SetActive(true);
            }
            
        }

Внедрение инструментов монетизации in app purchase и официального плагина AdMob


Раньше пользовался «самопальными» инструментами для сервиса Admob и внутриигровых покупок. Сейчас Unity и Google предоставляют из коробки прекрасные\удобные\простые плагины. Плагин для рекламы можно скачать тут, а для in app purchase в самой Unity > Services. Скачал, загрузил все в проект и используешь. Официальные примеры и документация превосходны.

Продвижение


Раньше я использовал сервисы для накрутки пятерок\скачиваний\комментариев advertmobile и apptools. Я крайне не рекомендую пользоваться этими инструментами. Ребята из корпорации бобра серьезно потрудились, накрученные отзывы удаляются\не отображаются.

Игра находится в GP пятый день, статистика по скачиваниям: 228/459 (+1 игровая покупка). В adMob 5900 показов и 6$ дохода. Мы получили 231 удаление, есть над чем поработать. Возможно хромает качество, или игра не оправдала ожидание. Согласно «доске лидеров» в игру играют, люди пишут мне на почту и просят подсказки.

Для продвижения использую тематические форумы, группы вк, статьи в блогах, группы в телеграмм, Хабрахабр. Смогу ли я набрать 7800 скачиваний как в прошлой версии, или GP для инди стал непостижим? Ответ на этот вопрос и при необходимости\востребованности более подробный разбор логики в следующий раз.
Поделиться с друзьями
-->

Комментарии (11)


  1. Melorian
    09.12.2016 15:07
    +2

    Вы, конечно, простите, но о чем статья? В любом уроке по Юнити для начинающих информации на порядок больше, чем у вас


    1. Odrin
      09.12.2016 15:21
      +9

      Статья о том, как увеличить число скачиваний, опубликовав статью на хабре.


  1. Flakky
    09.12.2016 15:14

    Есть вопрос… В чем смысл использовать юнити для такой игры, когда куда логичнее и оптимальнее использовать HTML+JS, прогнанные через кордову без всяких движков и лишних вещей? Я уже не говорю о нативных способах…


    1. Maklaud
      09.12.2016 17:58
      -1

      Не надо разводить холивар, подобный вопрос 100 раз поднимался в подобных статьях. Каждый выбирает то, что ему удобно и больше нравится. Я тоже делаю игры на юнити, даже самые простые, просто потому что мне нравится юнити, люблю c# и не собираюсь ради этого на JS их писать.


    1. Vilyx
      11.12.2016 17:37

      Любую игру проще и быстрее написать на Unity3d и работать это будет приятнее и плавнее чем crodova и его суррогаты. Это я вам говорю как профессионал unity и любитель кроссплатформенной разработки.


      1. Flakky
        12.12.2016 00:13
        +2

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

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

        Вот например я бы тоже мог взять для такой игры Unreal Engine 4, ибо легко и быстро для меня. Но это не значит, что это грамотный выбор. Именно поэтому я выберу кордову в данном случае. Говорю как профессионал UE4 и разработчик на JS. :)


        1. Vilyx
          12.12.2016 01:03

          Просто перечислю по пунктам:
          1) С# лучше JS.
          2) Анимации интерфейса плавнее особенно на слабых девайсах.
          3) Если вы хотите разрабатывать игры, то JS и Cordova тут не помогут, разрабатывая такие простенькие игры вы получаете ценный опыт для будущих более сложных разработок.
          4) В случае, если захочется добавить красивых эффектов, систем частиц или ещё каких-то сложных анимаций, имея на руках Cordova печально улыбаемся и откладываем в сторонку свои желания, а с Unity просто добавляем что хотим.

          Единственный случай когда unity это плохой выбор — когда вы разрабатываете не игру. Да и то, с новой системой интерфейса можно поспорить что лучше.


          1. softaria
            13.12.2016 13:01

            Но ведь можно писать не на голом js, а использовать framework. Например, http://babylonjs.com/
            Там есть и particle systems и анимации и вообще всё, что нужно играм (даже трехмерным).
            И писать можно не на js, а на typescript. Тогда и большие проекты нормально пишутся.


            1. Vilyx
              13.12.2016 15:12

              Много чего можно, но это будет не так удобно и уж точно не так быстро.


              1. softaria
                13.12.2016 17:32

                Я писал и на c#/Unity и на typescrypt/babylon. Если разница в скорости разработки и есть, то она зависит от того с чем из вышеперечисленного у вас больше опыт.


                1. Vilyx
                  13.12.2016 17:37
                  -2

                  Значит вы плохо разобрались в unity.