Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google

в 9:59, , рубрики: game development, Gamedev, unity3d, аниме, визуальная новелла, игры, кооперация разработки, мобильная разработка, Программирование, разработка, разработка мобильных приложений, Разработка под android, Тестирование игр, управление проектами

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 1 Многим знакомо чувство, когда чувствуется энергия от той самой идеи, что позволит свернуть горы и разработать законченное приложение, а не пополнить кладбище недоделок. Я по доброму завидую тем людям, что умеют трезво рассчитывать свои силы, а не увязать в трясине под гнётом рутины. У меня хватало сил, чтобы не дать начать себе что-то новое… Но конечно, разработка больших и длинных хобби проектов «потому, что бросить» жалко тянет соки, а не приносит радость. Эта публикация о том, как я намеренно дал слабину, чтобы поднять себе настроение, разработав простую игру за три дня. И сделал её за неделю, потратив десять маффинов, но получив кучу опыта и хорошего настроения.

Абсолютно случайно, заметил публикацию в которой более подробно и ясно раскрыто моё мнение про расчёт своих сил. Рекомендую тем, кто пропустил ознакомиться с переводом PatientZero статьи "Вы никогда не доделаете свою игру".

Завязка

Читая один развлекательный портал, я наткнулся на интересный комикс где описывался сюжет "Идеальной игры для Telltale Game". И не то, чтобы это было как-то связано с моим опытом, но идея зацепила меня. Я отложил её на потом. Потом наступило на следующий день, когда я понял, что идея от меня не отстаёт. Тем не менее, чего-то не хватало. После изучения комментариев к публикации я понял чего…

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 2

(добавлен ответ «сарказм»; отсылка к игре Fallout 4)
Я решил, что соберусь и сделаю игру за несколько дней.

Начало разработки

Но моё решение было не окончательным; я легко мог сдуться на середине и так недолгого пути. После раздумий был найден способ проверить мою целеустремлённость. Разработка была начата с вёрстки меню… Не то, чтобы я не умел или не любил разрабатывать GUI… Да кого я обманываю? Я не люблю верстать GUI в Unity3D: конечно, с выходом новой версии ситуацию улучшилась, но система всё ещё далека от идеала.
С вёрсткой меню вышла забавная история. Мой сосед долгое время просил показать, как я разрабатываю что-то с нуля, а я пообещал позвать. В общем, паренёк продержался только три часа вёрстки главного меню…

Уточнение сюжета

Во избежание недопонимания, уточню сюжет и «гемплей». Эту игру невозможно пройти или выиграть. Суть сводится к тому, что героя приветствует девушка (буквально парой фраз) и задаёт вопрос «Как прошёл ваш день?». Любая реакция игрока приводит к ссоре и концу игры. Я рассматривал это как игру обманку/розыгрыш.

Графика для интерфейса

Дизайн меню

Сначала, я хотел сделать классическое меню для текстовой новеллы, с кнопками & надписями, но потом решил, что в этом нет смысла и вспомнил, что уже давно мною был приобретен довольно хороший набор кнопок с иконками: Vector Flat Icons.

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

Первая ошибка

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

Первый прототип

К вечеру того же дня, я понял, что хочу закончить эту игру. Выглядело это примерно так:

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 3

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 4

(это не UML диаграмма)
В последствии, эта схема не изменилась. Лишь добавилась одна фраза для девушки и реакция на минутное молчание.

Разработка персонажей

Я сразу решил, что одной девушки для моей игры будет мало. Остановился на четырёх персонажах основанных на самых популярных архетипах аниме персонажей. Ну а в каком стиле ещё делать визуальную новеллу, как не в аниме?

Цундере — происходит слово от цунцун (tsuntsun), что означает — отвращение, и дередере (deredere), что означает — влюбленность. Такие персонажи изначально предстают как неприятные, нередко самовлюбленные и эгоистичные типажи, но на протяжении сюжета раскрывают в себе «светлую», хорошую сторону характера. Персонаж из «игры» лишь начинает раскрывать свою светлую сторону.

Горничная — служанка. Один из типичных вариантов дизайна аниме-героинь, призванный сочетаться с образом «сексуальной прислужницы». В данном случае используется вариант «добровольная помощница».

Сестрёнка — не совсем архетип, но в аниме подобной тематики всегда найдётся девушка, которая вешается на героя и считает себя его сестрой.

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

Художник1 сразу же приступила к работе, используя некоторые ресурсы из другого проекта, что и привело к схожести персонажей.
За основу для внешности, я просто выбрал некоторых запомнившихся мне героев. Для рисования был использован не чистый аниме стиль, а добавлены мягкие тени, что придаёт некоторую «ламповость» игре.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 5

Я раздумывал над тем, что стоило остановится на более

классическом стиле и dere героинях.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 6

, но уже были ресурсы для представленного выше результата.

Написание фраз

Фразы ГГ я взял из комикса, а вот реакции девушек ещё нужно было разработать. Конечно, в идеале было бы неплохо провести пару тройку экспериментов, нанять психологов и экспертов, но в реальности всё проще. (и дешевле)
Как вы могли заметить, юмор, орфография и пунктуация не являются моими сильными местами. Поэтому, с разработкой текстов я попросил помочь своего друга — анимешника. В миру он android разработчик и не хочет ассоциироваться с чем-то ещё. В связи с этим, я не буду ссылаться на него, но очень ему благодарен.
Проработка любого персонажа, который не похож на тебя это очень сложная работа. Тем более, что у нас было только несколько фраз, чтобы раскрыть героиню. К счастью, простые архетипы героинь; бессонные ночи за просмотром аниме и манги; отыгрыш в D&D позволили погрузиться в игровую вселенную и написать максимально реалистичные фразы.

Самым сложным персонажем оказалась Яндэрэ, как и по рисовке, так и по проработке фраз. В итоге она оказалась темнокожей (толерантность!) розовоголовой девушкой типажа «буду бить любимого, пока не полюбит».

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 7

Анимация персонажей

Этот проект первый, когда я сел и разобрался, как же работает Animator. Хотя я использую лишь эффект изменения прозрачности и смены картинок для анимации героев, всё оказалось не таким однозначным. Герои меняют не только выражения лица, но и позы, что меняет контур их тела. Если лицо можно анимировать «наложением + уход в прозрачность» с телом так не получится. В настоящих новеллах, персонажи разрезаны на несколько частей (руки, голова) и анимируются только они. Это связано, что во время такой анимации герой может оказаться прозрачным.
Я не хотел так делать из-за излишней сложности; поэтому, во время смены позы2 подкладывал под неё, позу1 со 100% видимостью. В то время, как сверху наращивал ещё одну позу1. Получился некоторый бутерброд; иногда есть проблемы с наложением (например, когда полупрозрачность на волосах накладывается друг на друга), но в целом результат меня устроил.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 8

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

Всегда мечтал, что когда сделаю игру, добавлю в неё много достижений. Сначала, я думал, что ограничусь 20 достижениями. (по достижению за концовку с каждой девушкой) Тем не менее, в релизной версии мне удалось подготовить 29 достижений. И пускай одно из них даётся за просмотр авторов игры, мечта достигнута! Два достижения будут отслеживать статус игрока, а ещё шесть установлены, как награда за необычные действия.
Чтобы достижения было интереснее получать, художник4 за три маффина, согласилась подготовить по иконке к каждому достижению. На момент написания статьи, иконки достижений ещё не были готовы, так что я сохраню интригу, оставив здесь только доступные мне скетчи.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 9

Про интеграцию достижений писать особого смысла нет так, как есть прекрасная статья от litemesa. Единственная неточность (или изменение) касается накопительных достижений. На данный момент в Google Play нужно не инкрементировать статус достижения, а отсылать текущий прогресс в процентах. (по крайней мере при использовании Social.ReportProgress).
Так, как достижений немного, я просто храню полученные в PlayerPrefs в виде строки «idдостижения|...|idдостижения». Но сохраняю их туда только после получения подтверждения от сервера Google об успешном получении. Кроме того, я сделал одно накопительное достижение «Процесс открытия всех концовок». Для этого, достижения полученные за открытие концовок я дублирую в ещё одной строке. Это выглядит примерно так:

     public void FinishRoot(string achId)
    {

        if (Authenticated)
        {
            String roots = PlayerPrefs.GetString("Roots");
            if (roots == null || roots.Length <= 0 || !Array.Exists(roots.Split('|'), element => element == achId))
            {
                if (roots == null || roots.Length <= 0)
                {
                    roots = achId;
                }
                else
                {
                    roots += "|" + achId;
                }
                PlayerPrefs.SetString("Roots", roots);
            }
            int totalRoots = 20;
            float progress = ((float) PlayerPrefs.GetString("Roots").Split('|').Length / totalRoots ) * 100;
            Social.ReportProgress(PlayAchievements.achievement_girl_negotiator, progress, (bool success) =>
            {});
        }
        UnlockAchievement(achId);
    }

На самом деле, рисование ачивок сильно затормозило выход игры. Я вовремя не заметил, что художник4 не справляется. В итоге, позвал художника5 (за те же три маффина) на помощь лишь на третью неделю, тогда как всё остальное было готово к концу первой недели. То есть, я просто две недели «ждал». (первые пять иконок были готовы за три дня)
Оставалось девять достижений без иллюстраций… Для одного из них я кривовато срисовал Эльфмана из аниме «FairyTail». Ко второму прекрасно подошла девушка с иконки. Для третьего обработал один из скетчей. Иконкой оставшихся достижений послужил значок инь-ян.

Stroke Text

На скриншоте прототипа видно поехавший текст. Это одна из первых версий компонента, который я написал для игры: текст с обводкой. Он состоит из двух скриптов и двух текстовых полей.
Если с полями всё более менее ясно: это текст и собственно говоря тень, то может возникнуть вопрос зачем нам два скрипта?
StrokeText это ExecuteInEditMode компонент — его методы выполняются в редакторе. Кроме того, он хранит значения переменных по умолчанию (из инспектора) и применяет их. Это было сделано для удобной отладки до ввода системы локализации.

TextController отвечает за синхронизация параметров двух текстовых полей. Кроме того, в этом классе есть метод для анимированного показа текста. (симуляция печатной машинки)

	void Update ()
    {
        period += Time.deltaTime;
        while (cursor < text.Length && period >= stepTime)
        {
            period -= stepTime;
            cursor++;
            string _text = text.Substring(0, cursor);

            if (_text.Substring(_text.Length - 1, 1) == " ")
            {
                period += stepTime;
            }

            textField.text = _text;
            strokeField.text = _text;

            if (listener != null)
                listener.textShownPercent((cursor / ((float)text.Length / 100) ));
        }
    }

Конечно, опытные разработчики скажут, что StrokeText нужно заменить на Editor скрипт, но меня бросает в дрожь от того, что снова нужно программно задавать различные элементы для ввода параметров поля…

    void Start()
    {
        textController = GetComponent<TextController>();
        UpdateParams();
    }

(Кстати, этот компонент не будет адекватно себя вести с правосторонней письменностью)
Тем не менее, я жестоко поплатился за свой выбор, пойдя против архитектуры Unity без должного опыта. Какие проблемы мне доставил этот код будет написано ниже.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 10

(Вот, кстати довольно позитивный скриншот, когда может показаться, что я настоящий Unity разработчик)

Перевод & Локализация

Хороший перевод это лучшее, что может случиться с вашей игрой/приложением*. Это знание пришло ко мне в процессе долгой и успешной работы с Alconost. К сожалению, в данном случае, они мне помочь не могли: ведь оплату маффинами не принимали. Поэтому, я решил попытаться написать в чат Java программистов Техносферы и мне чертовски повезло! На мою

просьбу
"А тут случайно никто не хочет перевести 5000 символов на английский, чтобы оказаться в титрах игры? :D Там на иконке аниме горничная с котовырезом. Примерно как в Джаггернауте от Мейла. Только это не Джаггернаут."

откликнулся Dmitry Tsyganov. За несколько дней он сделал такой перевод на английский, что:

  • Даже я со своим уровнем понял все фразы кроме "Aunt Jemima".
  • После «обратного» перевода, несколько фраз оказались лучше оригинала.

*После бейджа "Выбор редакции" или продажи за overмногоденег.

Локализация

Переведённые тексты это конечно круто, но какой в них смысл, если их не будет в игре? С переводом названий в Unity/Android всё просто: нужно просто создать в папке Plugins обычный для ОС файл строковых ресурсов.
AssetsPluginsAndroidresvalues-xx (просто values для английского)

<?xml version="1.0" encoding="utf-8"?>
 <resources>
     <string name="app_name">Hello World</string>
 </resources>

Для перевода текстов в самой игре стандартного средства в Unity нет, но присутствует множество пользовательских Assets для решения этой проблемы, как платных, так и бесплатных. Но какой программист не любит быстрый велосипед? (Ответ: хороший) В качестве локализации я решил взять небольшой скрипт с локализацией в Android стиле:

  • xml файл со строковыми ресурсами
  • Editor скрипт, который парсит xml и генерирует enum id для строк
  • Синглтон, который получает строки из xml ресурса по enum id
  • LocalizationController, который имеет в себе массив текстовых Компонентов и по именам их владельцев просит локализованный текст у синглтона

В целом, это обычный скрипт локализации за исключением автоматической генерации enum. К сожалению, я не смог найти его автора, поэтому просто залил код на Gist. Я лишь добавил поддержку своего StrokeText.

StrokeText

Помните, я писал, что мне аукнется инициализация StrokeText в Start вместо Awake? Вот с локализацией и аукнулась. Я получил две ситуации:
1) Отрабатывает сначала Start() в StrokeText, затем Start() в локализации
2) Отрабатывает сначала Start() в локализации, затем в StrokeText
Это выпило очень много моей крови… Сначала, я очень долго пытался локализовать причину. Вроде дело в локализации, а вроде «динамические тексты» берутся правильно. Ну а когда нашёл, был настолько уставшим, что… Использовал множество хаков, чтобы контролировать порядок запуска Start, использовал таймеры и корутины. Вместо того, чтобы использовать Awake для инициализации текста: правильная архитектура рулит.

Разработка фона

На самом деле, мне так понравился фон из интернета, что я хотел его оставить. К сожалению, все баны, которые я перенёс слегка подорвали мою психику и публикация приложения с пиратским контентом вызвала бы у меня острые приступы психоза и паранойи. Следующим логичным шагом было попытаться найти автора, чтобы попросить его лицензировать изображение для игры за три маффина. К сожалению, я нигде не смог найти упоминания автора. (Хотя мне удалось найти публикацию на deviantart, но как я понял это был не автор)
Поэтому, я просто попросил за художника2, которая обычно рисует мне фоны перерисовать так понравившейся мне фон; установил ужасно сжатые сроки, а сам отправился заниматься своими делами.
Конечно это была моя ошибка, ведь художник2 знала о моих проблемах с авторскими правами и слегка изменила концепцию. Поэтому, мне пришлось «порвать солнце», чтобы растянуть холст и вспомнить, как работают эффекты в фотошопе. Ниже три изображения. Я специально объединил их без возможности увеличения: важны крупные элементы, а не прорисовка деталей. Второе изображение это версия художника; третье — моя обработка.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 11

Музыкальная пауза

Год назад я был на GameDevParty по геймдизайну, где очень наглядно объяснили, что хороших игр без звука не бывает. Следующие слова из моей статьи которую я так и не дописал: я благодарю игрового продюсера Алину Браздейкене за столь ценный урок.

Тем не менее, маффинов на музыку я не выделил, а в лучших традициях интернета начал искать свободную композицию по ключевому слову «романтика». И нашёл ведь! К сожалению, игра выглядела очень пресно с одной мелодией на фоне, а ведь я ясно помнил, что музыка должна соответствовать моменту.
Поэтому, поиски были продолжены, но уже по запросу «free battle rpg music». В моей голове это выглядело так:

выезжает панелька с ответами; начинает играть типичная боевая музыка; игрок понимает, что всё не так просто...

Про то, как можно сделать простой менеджер звуков писал HexGrimm. Я же для проигрывания двух мелодий лишь добавил в игровой контроллер метод, который запускал одну из двух захардкоженных мелодий. Кроме того, добавил сохранение и загрузку первой и единственной настройки.

Разработка иконки

Здесь должен был быть абзац о том, что иконка очень важна для приложения, но это очень заезженная тема. Я лишь напишу, что согласно информации от неGoogle. (Очень интересная лекция о метриках Google Play от Ефимцевы Натальи. Хотя и сжатая на мой вкус) пользователям нравятся драконы и женские вторичные половые органы.

Иконку мне согласилась делать художник3 за один маффин так, как оценила уровень треша за что ей большое спасибо. Кстати, она уже делала мне иконку удачно скомбинировав драконов и женские вторичные половые органы, но это к делу не относится. Но, чтобы получить иконку художника мало: нужна концепция! У меня было два варианта:

  • Комбинация всех героинь в одну иконку
  • Вывод на первый план одной из героинь

Шутка. Все знают, что всегда существуют минимум три варианта. Вот третий и четвёртый:

  • Абсолютно левый, но мега-грудастый персонаж
  • Известный персонаж в стиле, не скрывающим его характерные черты, но позволяющим избежать бана из-за авторских прав

Их я не рассматривал из-за полной их аморальности. Я тут веселюсь, а не деньги зарабатывать собираюсь как никак. Поэтому, я вернулся к изначальным:
Первый вариант отпал довольно скоро…
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 12
(на тот момент были готовы только 2.5 девушки)
Думаю, что методом исключения, все поняли, что я остановился на втором варианте. Но конечно, иконка прошла длительную эволюцию.
В качестве центральной героини была выбрана Горничная, как самый харизматичный вариант, если можно так написать, учитывая продолжительность геймплея. По моему замыслу, она должна была быть недовольна пользователем, вызывая у него желание установить игру и решить проблему.

Версия 1

Я окрестил эту версию «Горничная убила муху, которая её очень долго доставала, и очень этому рада».
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 13
На самом деле, это было почти «ОНО!». Меня смущало, что девушка смотрит на кулак, а не пользователя, да и сам кулак был скорее не жестом, а частью движения.

Версия 2

Название придумывать не стал. Мне больше понравилась предыдущая поза. Кроме того, эта девушка скорее советует забить на проблему чем манит её решать.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 14

Я абсолютно не умею рисовать, (или успешно поддерживаю данную легенду) но изредка беру в руки «Выбор прямоугольной области», чтобы собрать из нескольких скетчей примерно то, что я хочу видеть. Стоит понимать, что между версиями на самом деле, проходили долгие осуждения, «мои примеры» и картинки из интернета «как надо».

Версия 3

Возврат к предыдущей позе с сохранением кулака и переводом взгляда на зрителя. Кулак теперь меньше груди, что определённо убавляет агрессивности, в довершение добавлено стеснение и аниме иконка злости. Очень мило надуты губки, но рот выбивает из желаемой картины.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 15

Версия 4

Почти картинка из моей головы, но куда же без дёгтя? Кулак всё ещё сравним с грудью, кроме того я забыл указать на пропущенный момент из референса (которого нет в статье) но есть у художника — кружевной браслетик на руке.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 16

Версия 5

Кулак уменьшен, фенечка добавлена. Идеально…
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 17

Прогресс 1

Горничная переходит из скетча в лайн арт, попутно получая дефект мизинца и проблемы с глазами.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 18

Прогресс 3

Начинаем постепенно подбирать оттенки цвета кожи и определять зоны румяности/блеска.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 19

Прогресс 7

Кто говорил, что рисовать весело?
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 20

Релиз 1

Прошло примерно два с половиной часа после начала работы. Специально обученные гномы передают кейс с маффином художнику.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 21

Релиз «Ну это точно последние правки 12.png»

Примерно такой путь был проделан при разработке иконки для такой простой игры.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 22

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

Фотошопмонтаж поисковой выдачи

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 23

Оптимизация

Сначала я лишь хотел отшутиться, что такому проекту оптимизация не требуется, но жизнь решила иначе. Я ожидал, что размер игры не превысит 20mb, но на деле получил 34mb. Поэтому, в рамках оптимизации, меня интересовало уменьшение размера итоговой сборки. Есть два материала которые стоит прочитать. Это немного старая, но тем не менее, вполне актуальная офигительная статья от fischer и официальная документация(!).

Первым делом я по привычке прогнал всю графику через pngquant. (оптимизация с погрешностями) Конечно, это мне не помогло ведь в процессе сборки Unity3d переводит всю графику в свой промежуточный формат, о чём вполне однозначно написано в документации. Где я кстати и узнал о такой прекрасной вещи, как Editor Log, который сразу же помог выявить проблему:
9.0 mb 26.2% Assets/Pcs/BG.png вместо ожидаемых 1.3mb.

Непозволительно много места было занято фоном и одновременно самой большой картинкой игры. Перевод её размера в степени двойки уменьшил размер приложения на 7мб. (На самом деле, ещё я уменьшил фон панелек — файл food)
Ещё около мегабайта я выиграл установив Stripping Level.
Subset NET2.0 у меня использовался по умолчанию, а вот про «Универсальную сборку» я совсем забыл. Отдельная сборка под ARM7 и x86 архитектуры позволила уменьшить размер apk файла до желаемых 18мб. Happy End. Хотя будет неловко, если у кого-то будет тормозить анимация после моих слов, что оптимизация тут не нужна.

Но конечно, для полного морального дзена я отключил генерацию mipmaps.

Реклама

Чтобы хоть как-то окупить маффины, я решил добавить в игру рекламные баннеры и межстраничные объявления. Баннеры я отображаю внизу игрового меню, а межстраничные объявления каждую третью попытку. Как и в случае с достижениями, я использовал стандартную библиотеку от Google: Official Unity Plugin for the Google Mobile Ads SDK. Подключил легко, но заработала реклама только после обновления build tools до последней версии.
Конечно, я не тешу себя тем, что удастся что-то заработать на разовой развлекаловке, но не мог не добавить… Уж характер у меня такой.

Тестирование

Тестирование игр является особенным видом тестирования: об этом уже не мало писали на Хабре. Даже такую игру можно тестировать бесконечно, поэтому я просто остановился на следующих моментах:

  • Положение элементов UI на различных разрешениях
  • Выдача достижений
  • Реклама
  • Сохранение игрового прогресса (достижения) при перезагрузке
  • Проверка накапливающихся достижений
  • Синхронизация достижений с Google Play

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

Ошибки

На самом деле, при разработке игры у меня было лишь три «ошибки». Это уже упомянутая проблема с неверной инициализацией StrokeView и скачущей из-за этого локализацией.

Спрайт сохранённый в неверном размере (1024х1025) не отображался на некоторых устройствах при первом тестировании. Кстати, 1023х1024 тоже фигово работает.

Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 24

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

Публикация

Выбор названия

Название это эссенция всего приложения: оно должно ярко отображать его суть. (желательно содержа в себе ключевые слова) Мне хотелось, чтобы в названии был намёк на факт розыгрыша в игре. Ну и конечно, название должно было отпугивать тех, кому эта игра была бы не интересна. В идеальном варианте, название должно было легко сокращаться, не теряя уникальности и смысла.
Начинал я с варианта «Сверх реалистичный симулятор девушек». Мало того, что оно не соответствовал моим требованиям, так и не влезал в ограничение Google Play (30 символов)
Тогда я начал раздумывать над названием, начав со своих требований. Самый простой способ отпугнуть снобов — использовать сленг. И у меня получилось!
Название: Фейк НовеллаСимулятор Тян
Сокр нзв.: Фейковая Новелла
Правда с переводом на английский вышла проблема. Конечно, заимствованные слова в современной речи фича не только русского языка, но вот аналога «тян» в английском языке не нашлось…
Пришлось остановиться на следующем варианте:
Название: Fake Novel: Girls Simulator
Сокр нзв.: Fake Novel

Загрузка нескольких APK в Play Store

Это было что-то новое для меня: раньше обходился универсальным APK файлом, но всё оказалось просто. Достаточно указать для каждой архитектуры свой Bundle Version Code и загрузить через расширенный режим управления.

Скучная картинка
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 25

Возрастные ограничения

Мне кажется, что с каждым разом IARC опрос набирает всё больше пунктов… Например, в этот раз я узнал, что такое "стикини". Вообще, это интересный опыт узнавать такие слова из Консоли Разработчика Мобильных приложений. Итоговый рейтинг игры:
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 26
Первоначально он был более высоким:
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 27
Оказывается, что «Откровенные наряды или наготы в эротическом контексте» превращается в пункт «Изображение секса». Интересно кто это переводил.
Возрастные ограничения в подобных играх настолько аморфная субстанция, что всё время меняются. В момент публикации, возрастной рейтинг уже выше. Я решил указать, что в игре подразумевается насилие, а так-же присутствует обнажённая женская грудь с прикрытыми сосками.

Пруф
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 28
(первая версия ачивки «Коллекционер»)

Секса в Гугле нет

Через пару часов после публикации я получил письмо с так нелюбимого мною адреса…

After review, Fake Novell — Girls Simulator, com.bianf.fake_novel, has been suspended and removed from Google Play as a policy strike because it violates the sexually explicit content policy by containing images with nudity.

Next Steps

Read through the Sexually Explicit Content policy for more details and examples of policy violations.
Make sure your app complies with all policies listed in the Developer Program Policies. Remember additional enforcement could occur if there are further policy issues with your apps.
If it’s possible to bring your app into compliance, you can sign in to your Developer Console and submit the policy compliant app using a new package name and a new app name.
Additional suspensions of any nature may result in the termination of your developer account, and investigation and possible termination of related Google accounts. If your account is terminated, payments will cease and Google may recover the proceeds of any past sales and/or the cost of any associated fees (such as chargebacks and transaction fees) from you.

If you’ve reviewed the policy and feel this suspension may have been in error, please reach out to our policy support team. One of my colleagues will get back to you within 2 business days.

Regards,

Помните, что в достижениях есть изображение женской груди с прикрытыми сосками? Вроде это не первое моё приложение для Google, но особо не вникал в их сексуальную политику.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 29
Приложение было ЗАБЛОКИРОВАНО окончательно. Без возможности отправить новую версию с исправленными ошибками. Три окончательных блокировки это блокировка всего аккаунта.
У меня только возникает вопрос: «Зачем тогда такой подробный тест?»
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 30
Почему — бы не делать на основании него всплывающее окошко «Осторожно, ваше приложение могут окончательно забанить!!!».
Так что никакой сексуальности в Google Play. Такие дела…

To be, or not to be

Я пишу эти строки, не зная чем всё закончится. Нужно создать новую версию игры и попытаться отправить её. Первая проблема после бана это то, что нужно менять название и пакет приложения.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 31
К счастью, я ошибся и написал «Novell» вместо «Novel» в названии забаненой версии. Пакет приложения такой ошибки не содержал: там я заменил «novel» на «novelette». Конечно, на всякий случай убрал скриншоты с достижениями и их иконками, а сами достижения зацензурил.
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 32
Бан этой версии будет означать блокировку всего аккаунта. (с него я публиковал Manga Reader из прошлой статьи и уже получил одно предупреждение) Надеюсь, что когда-нибудь в GP появится поддержка с человеческим лицом. И приложения будут сначала замораживать с указанием КОНКРЕТНЫХ причин и только потом банить. Собраться с духом и нажать кнопку Опубликовать!

Спустя час после «опубликовать»

Я замечаю, что исправленная горничная не имеет белков. Обновляя иконку, вижу, что новые версии иконок не были опубликованы. Опубликовать изменение иконок достижений! Надеюсь, что модераторы Google Play имеют доступ к последним версиям достижений, иначе…

Спустя ещё один час

На почту падает письмо с… IARC RATING CERTIFICATE. Хороший знак. Обычно, если банят то до получения сертификата. Я обновляю консоль разработчика… Игра опубликована. Неожиданно, если честно: в последнее время мне не везёт.

Хабр не место для жалоб, но
не прошёл собеседование в интересное место на вакансию «без опыта» и моего мага в D&D жестоко сожрали призраки.

Задача тона

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

Постскриптум

Я очень надеюсь, что моя публикация никого не оскорбила присутствием у меня несколько сомнительного юмора. Так же хочу заметить, что выпуск игры никак не связан с 14 февраля. (Из-за задержек иконок и Google уже с 8 марта...)

Сейчас главное переживание это, как оценят эту неделю работы команды. (и месяц работы художников иконок) Одна из главных проблем это то, что многих пользователей может разочаровать стиль персонажей отличный от иконки; завешенные ожидания из-за повышенного возрастного рейтинга и конечно, чертовски короткие сюжетные линии, да и сам факт «непроходимости» не все примут за шутку. С другой стороны, я сам виноват, что сделал игру против большинства канонов геймдизайна. Хотя конечно, я надеюсь на весёлые комментарии и какое никакое сарафанное радио.

Конечно, я буду рад ответить на вопросы в комментариях, но попытаюсь предугадать некоторые из них по своей традиции.

Q: Почему не RenPy?
A: Unity3d мне интересен, а RenPy нет.
Q: Специалист использует инструмент к задаче, а не подгоняет привычный инструмент под неё.
A: Зависит от цели. Я хотел сделать законченную игру на Unity3d и я это сделал. Мой запал пропал быстрее чем бы я разобрался с RenPy.

Q: Ты будешь публиковать статистику?
A: Я думаю о том, чтобы написать статью «Игра за неделю через неделю».

Q: Ты опубликуешь исходный код?
A: Я не большой эксперт в Unity3d, но планирую опубликовать исходный код вместо со второй статьёй, чтобы получить множество полезных советов. В любом случае, я опубликую лишь код. Картинки придётся вырезать или из игры, или из статьи.

Q: ХудожнИК? Но тем не менее, глаголы ты пишешь в женском роде.
A: Это моя особенность. Мне так привычнее и проще. Надеюсь, что никто не посчитает это за оскорбление.

Q: Не слишком ли много ссылок?
A: Если вы читаете эти слова, то НЛО посчитало, что не слишком. Я уважительно отношусь ко времени тех, кто читает мои истории и не хочу заставлять их искать что-то по ключевым словам.

Q: Ты сделал игру из пары слайдов за неделю и гордишься этим?
A: Я прошёл за неделю полный цикл от идеи до публикации, узнав много нового и повеселившись. Я горжусь и рад этому.

Q: Не слишком ли много «Я»?
A: Да. Это одна из моих основных проблем. Извиняюсь.

Q: А что так много текста про новеллу на 5 минут?
A: 100% прохождение можно получить не менее чем за 10 минут игры. Но конечно, я хотел донести мысль о том, что даже посредственная разработка короткой, но законченной игры может занять большой промежуток времени и нужно грамотно рассчитывать свои силы.

Q: Так а где иконки достижений?

A: Тут
Фейковая Новелла: маленькая игра, разработка которой многому меня научила и очередной бан от Google - 33

Автор: BIanF

Источник

Поделиться новостью

* - обязательные к заполнению поля