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

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

Завязка


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


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

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


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

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

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


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

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


Дизайн меню


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

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

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


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

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


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



(это не UML диаграмма)

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

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


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

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

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

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

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

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



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

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


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

Проработка любого персонажа, который не похож на тебя это очень сложная работа. Тем более, что у нас было только несколько фраз, чтобы раскрыть героиню. К счастью, простые архетипы героинь; бессонные ночи за просмотром аниме и манги; отыгрыш в D&D позволили погрузиться в игровую вселенную и написать максимально реалистичные фразы.

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



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


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



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


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

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



Про интеграцию достижений писать особого смысла нет так, как есть прекрасная статья от 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 без должного опыта. Какие проблемы мне доставил этот код будет написано ниже.


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

UPD:
Оказывается, в Unity3D есть тень для текстовых полей. Можно было установить её вместо второго поля. Спасибо Lertmind за информацию.

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


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

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

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

Локализация


Переведённые тексты это конечно круто, но какой в них смысл, если их не будет в игре? С переводом названий в Unity/Android всё просто: нужно просто создать в папке Plugins обычный для ОС файл строковых ресурсов.
\Assets\Plugins\Android\res\values-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 знала о моих проблемах с авторскими правами и слегка изменила концепцию. Поэтому, мне пришлось «порвать солнце», чтобы растянуть холст и вспомнить, как работают эффекты в фотошопе. Ниже три изображения. Я специально объединил их без возможности увеличения: важны крупные элементы, а не прорисовка деталей. Второе изображение это версия художника; третье — моя обработка.



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


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

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

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

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


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

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

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

Их я не рассматривал из-за полной их аморальности. Я тут веселюсь, а не деньги зарабатывать собираюсь как никак. Поэтому, я вернулся к изначальным:
Первый вариант отпал довольно скоро…


(на тот момент были готовы только 2.5 девушки)

Думаю, что методом исключения, все поняли, что я остановился на втором варианте. Но конечно, иконка прошла длительную эволюцию.

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

Версия 1


Я окрестил эту версию «Горничная убила муху, которая её очень долго доставала, и очень этому рада».



На самом деле, это было почти «ОНО!». Меня смущало, что девушка смотрит на кулак, а не пользователя, да и сам кулак был скорее не жестом, а частью движения.

Версия 2


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



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

Версия 3


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



Версия 4


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



Версия 5


Кулак уменьшен, фенечка добавлена. Идеально…



Прогресс 1


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



Прогресс 3


Начинаем постепенно подбирать оттенки цвета кожи и определять зоны румяности/блеска.



Прогресс 7


Кто говорил, что рисовать весело?



Релиз 1


Прошло примерно два с половиной часа после начала работы. Специально обученные гномы передают кейс с маффином художнику.



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


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



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

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




Оптимизация


Сначала я лишь хотел отшутиться, что такому проекту оптимизация не требуется, но жизнь решила иначе. Я ожидал, что размер игры не превысит 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 тоже фигово работает.



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

Публикация


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


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

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


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


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


Мне кажется, что с каждым разом IARC опрос набирает всё больше пунктов… Например, в этот раз я узнал, что такое "стикини". Вообще, это интересный опыт узнавать такие слова из Консоли Разработчика Мобильных приложений. Итоговый рейтинг игры:



Первоначально он был более высоким:



Оказывается, что «Откровенные наряды или наготы в эротическом контексте» превращается в пункт «Изображение секса». Интересно кто это переводил.

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

Пруф

(первая версия ачивки «Коллекционер»)


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


Через пару часов после публикации я получил письмо с так нелюбимого мною адреса…
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 Play. Такие дела…

To be, or not to be


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



К счастью, я ошибся и написал «Novell» вместо «Novel» в названии забаненой версии. Пакет приложения такой ошибки не содержал: там я заменил «novel» на «novelette». Конечно, на всякий случай убрал скриншоты с достижениями и их иконками, а сами достижения зацензурил.



Бан этой версии будет означать блокировку всего аккаунта. (с него я публиковал 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: Тут


UPD 09.03
Я даже и не знаю, как это написать… Впервые за долгое время Google принял мою аппеляцию. (Я обжаловал блокировку первой версии) Если бы не видел сам, подумал, что это фотошоп…

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


  1. kekekeks
    07.03.2016 15:08
    +3

    Плагиатом заниматься нехорошо.
    Найдите пять отличий:


     
    Ну кроме убогой рисовки и торчащего бюста. Оригинальный персонаж — Шидаре Хотару.


    1. BIanF
      07.03.2016 15:30
      +3

      Это игра розыгрыш. У каждой девушки есть прототип.


      1. kekekeks
        07.03.2016 15:31

        Что персонажи не отличаются оригинальностью и так заметно. Только вот не надо путать "прототип" с полным копированием. Второе называется плагиатом.


        1. Envy
          07.03.2016 15:42

          додзя


          1. kekekeks
            07.03.2016 15:44

            В додзях не переименовывают персонажей, а дорисовывают сюжетные вставки с имеющимися, знаете ли.


        1. veveve
          07.03.2016 17:10
          +7

          Не уверен, что вы правы. Википедия говорит:

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

          Понятие плагиата не имеет вполне определённого содержания, и в частных случаях не всегда возможно однозначно отделить его от сопредельных понятий: подражания, заимствования, соавторства и других подобных случаев сходства произведений. Во всяком случае, совпадение отдельных идей обычно не является плагиатом, поскольку любые новые произведения в чём-то основаны на идеях, не принадлежащих автору.

          Можете чётко сформулировать, почему это плагиат, а не, например, подражание или пародия?


          1. kekekeks
            07.03.2016 17:16
            -8

            Скопировано от и до визуальное изображение персонажа. Вы не википедию читайте, а 4-ую часть ГК. Ну или хотя бы разъяснения от ребят типа этих.


            1. BIanF
              07.03.2016 17:20
              +9

              Вам найти отличия?

              • Другая структура зрачков
              • Другой бант
              • Вырез
              • Другой размер груди

              Так что тут скорее неудачный косплей. Стоит использовать официальный арт для сравнения, чтобы заметить зрачки и пропорции. Если вам хочется кого-нибудь обвинить в плагиате, обратите внимание на разработчиков, которые используют официальные арты игр и пародийные названия в рекламе. (ВК и некоторые объявления в Admob)
              Но я не скрываю, что просил рисовать девушек по персонажам аниме, которые мне нравились.


              1. kekekeks
                07.03.2016 17:21
                -21

                Эцсамое, давайте я студии письмо со ссылкой на ваше поделие отправлю, а дальше уже сами с ними будете разбираться, пародия или нет.


                1. BIanF
                  07.03.2016 17:28
                  +7

                  Как хотите, Любезный


                1. wolandtel
                  07.03.2016 18:23
                  -1

                  КМПКВ, развешаем копирастов на деревьях.


                  1. kekekeks
                    07.03.2016 18:50
                    -4

                    Вы не путайте пиратство с плагиатом. Первое нарушает имущественные права "правообладателя", второе нарушает право автора называться автором.


                    1. vedenin1980
                      07.03.2016 18:58
                      +4

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


                    1. wolandtel
                      07.03.2016 23:07

                      Всё, что не паблик домэйн, – гнойная копирастия.


                      1. BIanF
                        08.03.2016 00:17
                        +9

                        Лишь ситхи всё возводят в абсолют.


    1. aikixd
      07.03.2016 15:48
      +15

      Извините, но в каждом аниме есть персонажи которых я уже видел. Горинчная с фиолетовыми волосами? Малолетка с косой и безумным смехом? Рей и Аска в конце концов, есть в каждом втором аниме.


      1. kekekeks
        07.03.2016 15:50
        -7

        Вы пять отличий-то найдите. Взять типовую "горинчную с фиолетовыми волосами" — это одно, слизать всё под копирку — несколько другое.


        1. PapaBubaDiop
          07.03.2016 18:13
          +19

          То есть после Ван Гога всем забыть про подсолнухи.


          1. kekekeks
            07.03.2016 18:14
            -6

            Подсолнухи рисовались с подсолнухов. "Горничная" рисовалась с чужого персонажа. Разницу чувствуете?


            1. PapaBubaDiop
              07.03.2016 18:19
              +24

              Девочка с голубыми волосами? Мальвина? Ты? (с)

              Засудить анимешников за ворованную девочку.


      1. ragequit
        07.03.2016 15:55
        +10

        Т.е. посмотрел Еву можно вообще аниму не смотреть? Мол, уже все видели: сферическая цундере в вакууме, хнычущий ГГ, загадочная бледнолицая синеволосая няша-клон и все такое? Даже шагающие роботы, убивающие людей клешнями есть. Не стоит же так обобщать.


        1. aikixd
          07.03.2016 18:11
          +4

          В общих чертах. Есть наверное сюжетов 6 и они населены примерно одними и теми же персонажами которые говорят одинаковыми диалогами.
          А учитывая что горничных есть туча (буквально, сотни в аниме десятки тысяч в мангах), были нарисованы абсолютно все возможные варианты. Вы принципиально не можете нарисовать новую.
          Я люблю аниме, но назвать его разнообразным не могу, за исключением действительно выдающихся событий, которых пару раз в год выходит, вроде психопаспорта, странников или бибопа.


    1. kenoma
      07.03.2016 23:55
      +3

      Как вы отличия то находите?!


  1. Mugik
    07.03.2016 17:15

    Спасибо, скачал.

    А вот насчёт отрисовки. А кто делал эти наброски и рисовал графику? Вы сами или дизайнер/художник? Наёмный работник или ваш знакомый?


    1. BIanF
      07.03.2016 17:21

      Всё рисование делали на заказ мои знакомые фрилансеры.


    1. BIanF
      12.03.2016 01:32

      Вообще, я всё описал в статье и даже указал авторов в авторах.


  1. NeoCode
    07.03.2016 17:57

    Так а в чем игра-то заключается?


    1. BIanF
      07.03.2016 17:58
      -3

      Это просто розыгрыш. Например, даёте девушке и предлагаете пройти.


  1. 200ton
    07.03.2016 17:58

    Подскажите, Google Play аккаунт банится всегда после 3 забаненых приложений? Или есть и другие варианты? Например, 5 забаненых приложений.


    1. BIanF
      07.03.2016 18:00

      У меня такое было только один раз. (Когда больше трёх)
      Но там были заморозки по требованиям ручной DMCA проверки.


      1. 200ton
        07.03.2016 18:07

        Еще, интересно, для статистики, а после скольки забаненых Google Play аккаунтов, вам забанили AdMob ?

        P.S есть мнение, что покупать инностранные Google Play аккаунты не целесообразно, так как те кто их продает, покупают на одну кредитку сразу много акков. И потом продают их разным людям. И бан одного акка, автоматом ведет к бану всех остальных акков купленых на эту банковскую карту.


        1. BIanF
          07.03.2016 18:11

          не помню


    1. Rumlin
      09.03.2016 12:36

      От автора про блокировки — Google не прощает ошибок: противостояние с Google Play
      Еще по теме, похоже бан с одного раза — За что блокируют разработчиков Google Play


  1. wolandtel
    07.03.2016 18:25
    +21

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


    1. aikixd
      08.03.2016 12:27

      А у них для всех одинаковая поддержка? Вот скажем NY Times тоже автоматом банится без объяснений?


      1. BIanF
        08.03.2016 15:28
        +1

        Нет конечно. Ходят слухи, что у них есть аккаунты приложения с которых проходят проверки автоматом… А крупным фирмам они вообще сами звонят. Но я вам этого не говорил.


  1. alpaca
    08.03.2016 04:19

    Как сюжет "Добро пожаловать в NHK"


  1. BigBag
    08.03.2016 13:32
    +3

    Все так углубились в обсуждение персонажей, что пропустили повторяющуюся фразу "вторичные половые органы".


    1. BIanF
      08.03.2016 15:27

      А вы так задумались над вторичными органами (я уже исправил) что пропустили дракончиков =)


  1. stalkerg
    08.03.2016 19:12

    О! Ну с моим анимешным приложением было то же самое. Они крайне ревниво к этому относятся. Со второй попытки вроде нормально. Правда я думаю, что после 100 000 скачек они начинают осторожнее относится. :)


    1. BIanF
      08.03.2016 19:13

      У меня банили аккаунты и с большим количеством скачиваний.


      1. stalkerg
        09.03.2016 10:40

        Эх… ну я вроде стараюсь всем их требованиям удволетворять. Я просто не понимаю почему они не банят тогда Facebook/Instagram/Twitter где порево найти как нефиг делать?


        1. BIanF
          09.03.2016 15:25
          +1

          Потому, что это Facebook/Instagram/Twitter. Ещё спросите почему они не банят Google Chrome.


          1. stalkerg
            09.03.2016 15:52

            Значит после нескольких миллионов врятли будут банить автоматом, а сначала будут решать вопрос в частном порядке.


            1. vedenin1980
              09.03.2016 16:17

              Да, всего-то нужно написать свой Facebook/Instagram/Twitter. А лучше сразу свой гугл, чтобы уж наверняка. :)


              1. BIanF
                09.03.2016 16:19

                Устроиться на работу в Google и стать главной департамента ревьеров...


              1. stalkerg
                09.03.2016 16:42

                Ну, зато есть к чему стремится! В принципе у меня, что то типа Инстаграма и получается.


  1. MichaelBorisov
    08.03.2016 23:32
    +2

    Вопросник о сексуальности от Гугла напоминает вопросник в стиле: "Ты перестала пить коньяк по утрам?" Ни одного варианта ответа, где человек мог бы хоть как-то оправдаться!

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


  1. lain8dono
    09.03.2016 00:54
    +2

    Ужасные градиенты же. Web 2.0 какой-то. И общая палитра вырвиглазная.

    Если и срисовывать, то хоть нормально



    1. BIanF
      09.03.2016 00:57

      По мне тепло и лампово =)
      Если делать игру, то конечно в аниме стиле. А для этого норм.
      K-on


      1. lain8dono
        09.03.2016 01:17
        +2

        Так об этом я и говорю. Вебдванольные градиенты это не аниме-стиль. Надо полагать вы мало смотрите это самое аниме, раз не видите в этом проблемы.


        1. BIanF
          09.03.2016 01:21

          В рамках этого проекта не вижу. Проблема в том, что это был набор графике для конструктора аниме персонажей, которые нифига не аниме.


          1. lain8dono
            09.03.2016 01:35
            +1

            1. BIanF
              09.03.2016 01:36

              Спасибо, но коней на переправе не меняют. Буду публиковать то, что есть, как мейкер аниме персонажей =\


  1. baboon
    09.03.2016 09:40

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

    Зачем нужны такие разрешения? Это уже не POT


    1. BIanF
      09.03.2016 15:32

      Не все смартфоны могут переварит некратные двойке/большие разрешения.
      http://answers.unity3d.com/questions/345535/unity-android-sprites-appearing-as-black-squares.html


      1. baboon
        09.03.2016 15:44

        Ну так вроде речь про даунскейл под девайс. Я не понял связи между эти и текстурами с неквадратными/не кратными двойке размером.


        1. BIanF
          09.03.2016 15:47

          У меня есть Explay Infinity 2 для тестов. Он не переваривает 1023х1024, а вот с 1024х1024 всё нормально.


          1. baboon
            09.03.2016 15:52

            А, я понял вы с начало сделали 1023х1024 и удивились что не работает… Сори)


            1. BIanF
              09.03.2016 15:54

              Сначала я сделала 1024х1025.


  1. jehy
    09.03.2016 09:57
    +4

    Мне понравилось, тёплая ламповая статья. У автора была цель сделать за неделю на unity игру в стиле visual Novell, и автор это успешно сделал. Все огрехи вроде шаблонных персонажей и рисовки вполне уважительно обусловлены постановкой задачи. Плюс было интересно почитать про бан в Google play.

    Вопросы, не очень относящиеся к статье, но на которые наверняка получу ответ с учётом контекста:
    1) А вы не смотрели, есть ли уже готовые решения для создания visual novell под Android? Вроде как платформа подходит практически идеально.
    2) Вы не смотрели, что уже есть в Google play, и как там решали проблему рейтинга? Ну или может просто есть рекомендации, что хорошего посмотреть и поиграть.


    1. BIanF
      09.03.2016 15:34

      Я знаю, что есть RenPy и ассет в Unity3d. Но RenPy я использовать не хотел, а ассет давно не обновлялся и был без поддержки локализации. Боялся, что пока прикручу её весь запал исчезнет.

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