Pull to refresh

Готовимся к публикации игры в Xiaomi Mi Game Center (Unity, C#)

Reading time 8 min
Views 12K
Китайский рынок мобильных игр и приложений остается в значительной степени закрытым для остального мира. И не так давно Unity анонсировали сотрудничество с Xiaomi, призванное помочь разработчикам опубликовать свои игры с помощью сервисов Unity напрямую в Xiaomi Mi Game Center. А пока на официальном сайте висит табличка «Функция еще не включена, ждите новостей!», мы можем подготовить наш билд для Xiaomi. А если повезет, то и успешно опубликовать!

image

О чем статья


Самые хрупкие компоненты при портировании любой игры на новую платформу это — внутриигровые покупки (IAP), реклама (Ads) и игровые сервисы (рейтинги, достижения, мультиплеер, социальная интеграция и т.д.). Об особенностях реализации этих компонентов в Xiaomi Mi Game Center и пойдет речь далее.

Дисклеймер


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

Особенности Xiaomi Mi Game Center


В Китае недоступны Google Play и Facebook. Это значит, что интеграция сервисов Google Play и Facebook работать не будет. Если у вас есть собственная реализация авторизации игроков, игровых рейтингов, достижений и всего прочего, то вам повезло. Кроме того, платформа очень сырая, и грабель будет много. В плане монетизации все просто — Xiaomi реализовали свой сервис платежей с авторизацией, поддержка которого уже появилась в Unity IAP, а реклама доступна только через Unity Ads. Другие сервисы рекламы, даже если они доступны в Китае, использовать не разрешают.
Unfortunately, Unity Ads is the only ads platform can be included in the Xiaomi build.
Кроме того, для Unity Ads потребуется получить отдельный ID специально для Xiaomi. Поддержка Unity Ads сразу предупредила, что на данный момент заполнение крайне низкое.
Before we get started on this, please be aware that the fill rate of Unity Ads on Xiaomi platform is super low.
Супер, значит супер, идем дальше)

Первым делом


Организационные моменты — самое трудное. Тут нужно будет много писать и общаться. Для начала нужно обратиться в поддержку Unity и выразить свое желание опубликовать игру в Xiaomi Mi Game Center. На момент написания статьи все действия на стороне сервера выполнялись вручную специалистами Unity. Нам нужно завести проект и встроенные покупки и получить App ID, App Key, App Secret и SKU всех игровых покупок. Также нужно будет получить новый ID для Unity Ads (старый ID для Google Play использовать нельзя), но об этом будет рассказано в следующем разделе.

Акцентирую внимание на двух моментах:

  1. Bundle ID для Xiaomi должен отличаться от Bundle ID для Google Play. Мы добавили приписку .mi в конце, получилось com.herocraft.game.free.taptapbuilder.mi
  2. для SKU игровых покупок такого ограничения нет, но их длина ограничена 40 символами. В нашем случае SKU тоже стали другими

Далее мы сможем перейти на страницу id.unity.com/en/user_clients/settings и получить все параметры для настройки IAP. Unity Project ID — это id нашего проекта в Unity (старого проекта, который уже использует сервисы Unity), например 9f379fb5-39b9-43c9-850c-b4a855e3b82a. Тут же нужно заполнить выданные ранее App ID, App Key, App и сохранить. Я этого не сделал, и потом пришлось долго искать проблему =(

image

Кстати, несколько дней назад специалисты из Поднебесной прислали письмо:
The Mi-Unity developer portal is available now at developer.unity.mi.com
Увы, пока там пусто и нашего проекта нет. Остается надеяться, что вся эта рутинная ручная работа в будущем будет автоматизирована, и мы получим удобную консоль разработчика. Но это вряд ли случится прямо завтра)

Получение нового ID для UnityAds


Новый ID для UnityAds обязателен. Использовать ID от Google Play нельзя, т.к. Xiaomi является отдельной платформой в админке Unity Ads. На данный момент платформа Xiaomi скрыта для всех разработчиков, и сначала нужно попросить включить ее для вашего Unity аккаунта. Для этого пишем письмо в поддержку unityads-support@unity3d.com приблизительно следующего содержания:
Hi! Could you please enable Mi Game Center for my project Tap Tap Builder (a0853b2f-b5d8-450f-9f8c-5c701ef73c16)? I want to release my game in Xiaomi app store. Here is my Developer ID 26590 for confirmation. Thanks!
Обязательно укажите название и ID проекта, а также свой Developer ID (который отображается на странице Invoicing в вашем аккаунте). После того, как вам включат Mi Game Center, его можно будет добавить в настройках проекта как отдельную платформу, а затем получить ID для инициализации Unity Ads. Выглядит примерно вот так:

image

Готово! Теперь осталось самое простое — технические аспекты.

Технические аспекты


Итак, допустим, что вы уже используете Unity IAP в своем проекте. Если это не так, то все может быть несколько сложнее. Во-первых, меня сразу смутила некоторая неразбериха с плагинами. В Build Settings на вкладке Android у нас появилась кнопка Xiaomi Game Center, НЕ жмем Add!

image

Также существует проект интеграции на GitHub, НЕ заходим туда!

А еще есть плагины для Xiaomi в Unity Asset Store. Тоже ничего НЕ импортируем!

Все, что нам нужно, это последняя версия Unity IAP и Unity Ads (вкладка Services в Unity)!

image

Еще хотелось бы отметить, что если вам встречается название Unity Channel, это и есть интеграция с Xiaomi. Не знаю, почему они не придумали более очевидное название) Может быть, это что-то более общее по задумке.

Настраиваем IAP


Нужно создать IAP каталог и завести все покупки, если вы этого не сделали раньше. В Store ID Overides нужно внести SKU, если он отличается от того, что у вас было в Google Play. В нашем случае, пришлось сократить SKU, чтобы уложиться в 40 символов.

image

Когда закончили, нужно нажать App Store Export. Если все пройдет без ошибок — значит можно идти дальше.

Важное замечание от китайцев:
Google Play and App Store would obtain IAP products from server side when initializing, but Xiaomi doesn't support this feature. That's why Xiaomi IAP needs that «MiGameProductCatalog.prop» file. It obtains IAP products from this file locally.
Т.е. важно все правильно заполнить, а также указать заранее согласованную стоимость (вы это сделали, когда заводили покупки). Я ошибся со стоимостью, и потом ничего не работало.

Переключаем Unity IAP на Xiaomi:

image

Далее нужно запустить Unity IAP / Receipt Validation Obfuscator и вписать в нижнее поле наш Client RSA Public Key (который был получен тут: id.unity.com/en/user_clients/settings).

image

Проверка цифровой подписи покупок абсолютна такая же, как в Google Play, только ключ другой. Китайцы очень любят ломать игры и получать игровые покупки на халяву. Так что рекомендую сделать проверку цифровой подписи, хотя этот шаг пропускают 90% разработчиков. А теперь прервемся на РЕКЛАМУ! Вас может заинтересовать моя статья:

Защита игр и мобильных приложений от взлома для чайников

Наконец-то пишем код


Чтобы заработал IAP нужно сделать 4 действия: инициализировать его, авторизовать пользователя, выполнить покупки и проверить цифровую подпись.

Инициализация IAP


Поскольку инициализация IAP происходит локально по созданному каталогу, то для этого не нужны ни доступ в сеть, ни авторизация пользователя.

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

builder.Configure<IUnityChannelConfiguration>().fetchReceiptPayloadOnPurchase = true;

var catalog = ProductCatalog.LoadDefaultCatalog();

foreach (var product in catalog.allProducts)
{
	if (product.allStoreIDs.Count > 0)
	{
		var ids = new IDs();

		foreach (var storeId in product.allStoreIDs)
		{
			ids.Add(storeId.id, storeId.store);
		}

		builder.AddProduct(product.id, product.type, ids);
	}
	else
	{
		builder.AddProduct(product.id, product.type);
	}
}

UnityPurchasing.Initialize(this, builder);

Тут все просто, я скопировал это из IAPDemo, который находится внутри плагина Unity IAP. Важно установить fetchReceiptPayloadOnPurchase = true, чтобы сервер возвращал цифровую подпись. Если не проверяете ЦП, можете не устанавливать.

После успешной инициализации будет вызван метод IStoreListener.OnInitialized, который вернет все покупки в IStoreController.products.all. Далее можно нарисовать UI игрового магазина и отобразить цены. Да в общем, вы это и так знаете, если используете Unity IAP.

Авторизация пользователя


Авторизацию можно провести либо при запуске приложения (Awake), либо когда она потребуется, например перед совершением покупки. Я сделал авторизацию по запросу, но для упрощения примера выполним ее в Awake:

public class XiaomiIntegration : MonoBehaviour, ILoginListener
{
	public void Awake()
	{
		var appInfo = new AppInfo
		{
			appId = "",
			appKey = "",
			clientId = "",
			clientKey = "",
			debug = true
		};

		StoreService.Initialize(appInfo, this);
	}

	public void OnInitialized()
	{
		StoreService.Login(this);
	}

	public void OnInitializeFailed(string message)
	{
	}

	public void OnLogin(UserInfo userInfo)
	{
	}

	public void OnLoginFailed(string message)
	{
	}
}

После успешной авторизации в userInfo будет храниться ID пользователя. Увы, получить его имя и другую информацию, которую можно было бы использовать в рейтингах и других сервисах, пока невозможно. Я в своих самописных рейтингах отображаю этот ID вместо имени пользователя от аккаунта Google Play или Came Center. Комментарий специалистов из Китая:
You can get the user id after login, but there is no API to get user name or user friends.
Mi account isn't like Facebook or Google Plus. It doesn't have a friends list or SNS.

Тут есть один очень важный нюанс, который не позволит вам протестировать реальные покупки, если вы не китаец. Даже если у вас есть Mi аккаунт. Дело в том, что при первой авторизации пользователь должен будет заполнить такую вот форму:

image

Что это такое:
It's «Personal real information registration» that required by the Chinese government. Players are required to input their real names and Chinese IDs in this form.
«Ты не пройдешь!». В тестовом режиме (debug = true при инициализации) такая форма не появляется.

Совершение покупки и проверка подписи


Тут все как обычно. Стоит только отметить, что необходимо использовать unified SKU. То есть не те специфичные (обрезанные в моем случае), SKU для Xiaomi, а универсальные ID, которые используются для Google Play и App Store.

var product = StoreController.products.WithID(sku);

StoreController.InitiatePurchase(product);

Когда покупка успешно выполнится, можно проверить ее цифровую подпись:

var receipt = args.purchasedProduct.receipt;
var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), UnityChannelTangle.Data(), Application.identifier);

validator.Validate(receipt);

Метод Validate выдаст исключение IAPSecurityException, если ЦП не пройдет проверку.

Заключение


Спасибо за внимание! Ставьте лайки, подписывайтесь и как-то так) Ниже составлю список полезных ссылок.

Ссылочки


developer.unity.mi.com — Mi-Unity developer portal
unity3d.com/ru/partners/xiaomi/guide — гайд по настройке Xiaomi (пока отсутствует).
id.unity.com/en/user_clients/settings — настройки проекта для Xiaomi
unitytech.github.io/channel/stand-alone-xiaomi-sdk-doc — проект интеграции Xiaomi. Может пригодиться, если вы не используете Unity IAP. А может быть еще по каким-то причинам. Могу лишь предположить, что этот проект, как и плагины в Asset Store, в будущем переедут в Build Settings / Android / Xiaomi Mi Game Center
unityads.unity3d.com/admin — отсюда можно сделать запрос на получение ID для Xiaomi, в любом случае вам нужны ребята из Unity Services Support (Unity Ads Support).

UPD 21.06.2018


Увы, публикация в Xiaomi не оправдала надежд. Было потрачено много усилий, это и перевод, и общение с китайцами, и сырая платформа с кучей недоработок и багов. Еще реализация требований правительства (черные списки) и крайне низкое заполнение рекламы без возможности использования сторонних провайдеров. Даже несмотря на то, что мы публиковались от имени крупного издателя Herocraft, фичер в сторе оказался совсем незначительным, и сейчас мы имеем около 200 установок в день (что выглядит удручающе).
Довелось также пообщаться с другими разработчиками, которые решили попытать счастья, многие сами жалуются в ЛС. У всех аналогичные проблемы и результаты. Так что если все-таки решитесь, будьте готовы)
Tags:
Hubs:
+4
Comments 4
Comments Comments 4

Articles