
Привет! Я Артем Ковардин, руководитель команды Push Service в RuStore. В этой статье мы с вами рассмотрим, как подключить MyTracker для мобильной игры на Godot.
Godot — замечательный движок для игр, но под него достаточно мало готовых плагинов. Поэтому часто разработчику нужно самостоятельно создавать все необходимые плагины: для аналитики, рекламы, подписок и так далее. Начнем с того, что помогает нам качественно развиваться – аналитика.
Прежде всего, аналитика помогает разработчику зарабатывать на своих играх. Она нужна любому приложению: без аналитики не получится закупить трафик, непонятно, сколько времени пользователь проводит в приложении и сколько удалось заработать с каждого источника.
В этой статье мы будем работать с сервисом аналитики MyTracker. Это позволит закупать рекламу на площадках VK. Разберемся, как подключить сервис, разработать плагин для аналитики и подключить его в игру.
Добавление игры в MyTracker
Добавляем игру в своём аккаунте MyTracker. Начинаем с указания ссылки на приложение.

Создаём проект и указываем валюту RUB.

Сохраняем настройки и попадаем на страницу с инструкцией по подключению SDK.

Все готово, идём создавать плагин и подключать его в нашу игру.
Первым делом создаём Android проект. Никаких хитростей тут нет, все делаем как с обычным приложением на Android.
После создания проекта добавляем новый модуль с названием my-tracker. В нём пропишем всю логику плагина, которая будет доступна в нашей игре. Но чтобы все заработало, нужно добавить специальную библиотеку для разработки плагинов под Android. Эту библиотеку можно найти на странице с загрузками Godot. Выбираем пункт AAR library for Android и загружаем .aar библиотеку в папку godot-lib.
Чтобы библиотека из godot-lib стала доступна в проекте, создаём скрипт gradle.
configurations.maybeCreate("default") artifacts.add("default", file('godot-lib.4.0.2.stable.template_release.aar'))
Все модули перечисляем в settings.gradle.
rootProject.name = "rustore-my-tracker" include ':app' include ':godot-lib' include ':my-tracker'
Зависимости
Теперь нужно подключить библиотеку MyTracker. Посмотреть актуальную версию можно в документации MyTracker. На момент написания статьи актуальной была версия 'com.my.tracker:mytracker-sdk:3.0.+'. Подключать библиотеку будем по-хитрому.
Нужно создать специальный файл MyTracker.gdap, в котором будет вся необходимая информация о плагине.
[config] name="MyTracker" binary_type="local" binary="my-tracker-release.aar" [dependencies] remote=["com.my.tracker:mytracker-sdk:3.0.+"]
В параметре name этого файла указываем имя плагина, в параметре binary_type —local, а в binary — название собранной .aar библиотеки. Если указать binary_type=remote, в параметре binary нужно добавить ссылку на .aar.
Самое интересное начинается в секции dependencies. Зависимости можно указать local или remote. В нашем случае указывается только одна remote зависимость. При необходимости можно указать список сторонних репозиториев через параметр custom_maven_repos=[], но для нашего плагина это не нужно. Все эти зависимости будут использоваться при сборке игры на Godot. Узнать больше подробностей про параметры плагина можно в документации Godot.
А теперь время магии gradle. Напишем немного кода, чтобы не копировать руками зависимость из my-tracker/MyTracker.gdap в my-tracker/build.gradle.
dependencies { File gdap = new File("my-tracker/MyTracker.gdap") def match = gdap.text =~ /(?<=remote=)[^;]+/ def remote = Eval.me(match[0]) for(item in remote){ println "implementing $item" implementation item } compileOnly project(':godot-lib') }
Этот код честно подсмотрен в плагине для AdMob — неплохой пример для изучения, но у нас будет лучше.
В коде выше мы открываем файл MyTracker.gdap, парсим его, находим все пакеты, указанные в параметре remote, и подключаем их как implementation. Теперь, если нужно поднять версию библиотеки Android, достаточно внести изменения только в один файл. Конечно, отдельно нужно будет указать кастомные репозитории, но даже так жизнь становится проще.
Все зависимости подключены и можно приступать к написанию скриптом. Давайте создадим файл для нашего плагина, назовём его MyTracker.kt. Итоговая структура проекта получается такой:
- app/ - godot-lib/ - build.gradle - godot-lib.4.0.2.stable.template_release.aar - my-tracker/ - src/ - build.gradle - MyTracker.gdap - build.gradle - settings.gradle
Реализация
Начнём с создания класса нашего плагина в файле MyTracker.kt:
package ru.rustore.mytracker import org.godotengine.godot.Godot import org.godotengine.godot.plugin.GodotPlugin class MyTracker(godot: Godot?) : GodotPlugin(godot) { override fun getPluginName(): String { return "MyTracker" } }
Пока все просто. Наследуемся от базового класса GodotPlugin и реализуем один метод getPluginName(), который, ожидаемо, возвращает название плагина.
Чтобы игра смогла найти этот класс и загрузить плагин, необходимо добавить нужную информацию в файл AndroidManifest.xml модуля my-tracker:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="<http://schemas.android.com/apk/res/android>"> <application> <meta-data android:name="org.godotengine.plugin.v1.MyTracker" android:value="ru.rustore.mytracker.MyTracker" /> </application> </manifest>
MyTracker— название нашего плагина.ru.rustore.mytracker.MyTracker— полный путь к файлу плагина.
Теперь нужно реализовать инициализацию трекера. По-хорошему, инициализировать трекер нужно непосредственно при создании приложения в методе Application.onCreate(). Но в MyTracker можно инициализировать его вручную с использованием метода trackLaunchManually():
package ru.rustore.mytracker import com.my.tracker.MyTracker as Tracker import org.godotengine.godot.Godot import org.godotengine.godot.plugin.GodotPlugin import org.godotengine.godot.plugin.UsedByGodot class MyTracker(godot: Godot?) : GodotPlugin(godot) { override fun getPluginName(): String { return "MyTracker" } @UsedByGodot fun init(key: String) { if (godot == null) { return } Tracker.initTracker(key, godot.requireActivity().application) Tracker.trackLaunchManually(godot.requireActivity()) } }
Сначала добавляем метод init() и помечаем его @UsedByGodot. Как несложно догадаться, этот метод будет доступен из Godot.
Теперь нужно добавить возможность конфигурировать трекер из Godot. Для этого добавляем пачку методов, которые проксируют вызовы методов класса MyTrackerConfig.
@UsedByGodot fun setTrackingLaunchEnabled(trackingLaunchEnabled: Boolean) { Tracker.getTrackerConfig().setTrackingLaunchEnabled(trackingLaunchEnabled) } @UsedByGodot fun setLaunchTimeout(seconds: Int) { Tracker.getTrackerConfig().setLaunchTimeout(seconds) } @UsedByGodot fun setBufferingPeriod(seconds: Int) { Tracker.getTrackerConfig().setBufferingPeriod(seconds) } @UsedByGodot fun setForcingPeriod(seconds: Int) { Tracker.getTrackerConfig().setForcingPeriod(seconds) } @UsedByGodot fun setAutotrackingPurchaseEnabled(autotrackingPurchaseEnabled: Boolean) { Tracker.getTrackerConfig().setAutotrackingPurchaseEnabled(autotrackingPurchaseEnabled) } @UsedByGodot fun setTrackingPreinstallEnabled(trackingPreinstallEnabled: Boolean) { Tracker.getTrackerConfig().setTrackingPreinstallEnabled(trackingPreinstallEnabled) } @UsedByGodot fun setApkPreinstallParams(apkPreinstallParams: String) { Tracker.getTrackerConfig().setApkPreinstallParams(apkPreinstallParams) }
Отлично, теперь из Godot можно настраивать трекер. Но нужно добавить возможность указывать параметры.
@UsedByGodot fun setCustomParam(key: String, value: String) { Tracker.getTrackerParams().setCustomParam(key, value) } @UsedByGodot fun setEmail(email: String) { Tracker.getTrackerParams().setEmail(email) } @UsedByGodot fun setCustomUserId(id: String) { Tracker.getTrackerParams().setCustomUserId(id) } @UsedByGodot fun setAge(age: Int) { Tracker.getTrackerParams().setAge(age) } @UsedByGodot fun setPhone(phone: String) { Tracker.getTrackerParams().setPhone(phone) } @UsedByGodot fun setLang(lang: String) { Tracker.getTrackerParams().setLang(lang) }
На самом деле сеттеров ещё больше, но я использовал только самые популярные.
Осталось добавить последний и самый важный набор методов для трекания событий.
@UsedByGodot fun trackInviteEvent(params: Dictionary) { Tracker.trackInviteEvent(params.map { e -> e.key to e.value.toString() }.toMap()) } @UsedByGodot fun trackLevelEvent(level: Int, params: Dictionary) { Tracker.trackLevelEvent(level, params.map { e -> e.key to e.value.toString() }.toMap()) } @UsedByGodot fun trackEvent(name: String, params: Dictionary) { Tracker.trackEvent(name, params.map { e -> e.key to e.value.toString() }.toMap()) }
Обратите внимание на тип переменной params. Мы не можем просто передать из Godot тип Map<String, String>. Поддерживаются только: void, boolean, int, float, java.lang.String, org.godotengine.godot.Dictionary, int[], byte[], float[], java.lang.String[]. Поэтому нужно конвертировать org.godotengine.godot.Dictionary в тип Map<String, String>.
С помощью метода params.map { e -> e.key to e.value.toString() }.toMap() мы пробегаем по всем значениям Map и конвертируем их в строку String, а потом результат отдаётся в виде Map<String, String>. Надеюсь, это сработает.
Ещё один важный метод — учёт покупок. Он создаётся довольно просто:
fun trackPurchaseEvent( sku: String, purchase: String, signature: String, params: Dictionary ) { Tracker.trackPurchaseEvent( JSONObject(sku), JSONObject(purchase), signature, params.map { e -> e.key to e.value.toString() }.toMap() ) }
Чтобы учитывать покупки через него, нужно отключить автоматический трекинг покупок, используя метод setAutotrackingPurchaseEnabled(false).
По умолчанию SDK MyTracker отправляет данные на сервер раз в 15 минут. Но некоторые события важно отправить как можно раньше, и для этого есть метод flush().
@UsedByGodot fun flush() { Tracker.flush() }
Все нужные методы добавлены, собираем наш плагин и тестируем в реальной игре.
Сейчас добавлены только базовые методы, которые позволяют интегрировать и использовать SDK MyTracker в игре. О других возможностях вы можете почитать в документации MyTracker.
Сборка и подключение
Собираем всё командой ./gradlew build, как обычный модуль Android. Остаётся только скопировать файлы my-tracker-release.aar и MyTracker.gdap в папку res://android/plugins.
В вашей игре должен быть установлен Android Build Template для правильной работы плагина. Если Android Build Template установлен корректно, после добавления плагина, он отобразится в списке на экране настройки экспорта:

Это значит, что плагин доступен в коде самой игры.
Использование
Все начинается с метода _ready() в скрипте Game.gd. Нужно проверить доступность плагина методом Engine.has_singleton().
func _ready(): if Engine.has_singleton("MyTracker"): var tracker = Engine.get_singleton("MyTracker")
tracker — экземпляр нашего плагина. Мы можем вызывать методы, которые определили в класса плагина.
func _ready(): if Engine.has_singleton("MyTracker"): var tracker = Engine.get_singleton("MyTracker") tracker.setDebugMode(true) tracker.init("xxxxxxxxxxx")
xxxxxxxxxxx — SDK-ключ, который мы получили при создании приложения в настройках MyTracker. Метод setDebugMode(true) позволяет увидеть работу MyTracker в logcat приложения.

Залогируем событие завершения игры и событие рестарта. Для этого немного поправим код нашей игры.
func _on_collided(): tracker.trackEvent("finish", { "points": "%d" % score, }) restart.show() hero.active = false hero.boom() play = false for ch in get_children(): if ch.is_in_group("Enemy"): remove_child(ch) func _on_restart_pressed(): tracker.trackEvent("restart", { "points": "%d" % score, }) get_tree().reload_current_scene()
Эти события можно будет смотреть в отчётах MyTracker.
Убираем вызов tracker.setDebugMode(true), собираем игру и публикуем её новую версию.
Исходники
Исходники плагина для MyTracker доступны в GitFlic.
Заключение
В этой статье мы рассмотрели шаги подключения сервиса MyTracker к игре на Godot. Этот сервис поможет вам обезличенно анализировать поведение игроков, собирать статистику и закупать рекламу.
