Внимание!
Данная документация является устаревшей. Instant Games Bridge теперь называется Playgama Bridge. Актуальная документация доступна по ссылке wiki.playgama.com.
Godot 3.x #
Подключение #
Скачайте актуальный архив instant_games_bridge.zip
со страницы релизов на гитхаб, разархивируйте его и положите содержимое в res://addons
:
Включите плагин в настройках проекта:
Укажите нужные данные в настройках плагина:
Инициализация #
Когда игра загружена — плагин уже проинициализирован. Ничего дополнительно делать не нужно.
Сборка #
Для корректной работы плагина необходимо выбрать соответствующий HTML-шаблон. Укажите в настройках экспорта в пункте Custom HTML Shell
:
res://addons/instant_games_bridge/template/index.html
⚠️ Предупреждение
При загрузке файлов на Crazy Games в пункте Game Type нужно выбрать HTML5.
Информация о платформе #
ID платформы #
Bridge.platform.id
Возвращает ID платформы, на которой запущена игра в данный момент.
Возможные значения: playgama
, crazy_games
, game_distribution
, yandex
, wortal
, playdeck
, telegram
, vk
, ok
, vk_play
, absolute_games
, mock
.
Язык #
Bridge.platform.language
Если платформа предоставляет данные об языке пользователя — то это будет язык, который установлен у пользователя на платформе. Если не предоставляет — это будет язык браузера пользователя.
Формат: ISO 639-1. Пример: ru
, en
.
Параметр из адресной строки #
Bridge.platform.payload
С помощью данного параметра можно в ссылку на игру встраивать какую-либо вспомогательную информацию.
Платформа | Формат ссылки |
---|---|
Playgama | — |
Crazy Games | crazygames.com/game/example?payload=your-info |
Game Distribution | — |
Yandex | yandex.com/games/play/183100?payload=your-info |
Wortal | — |
PlayDeck | — |
Telegram | — |
VK Play | — |
VK | vk.com/app8056947#your-info |
OK | — |
Absolute Games | — |
Mock | site.com/game?payload=your-info |
Информация о домене #
Bridge.platform.tld
Если данных нет –
null
. Если данные есть – com
, ru
, etc.
Отправка сообщения платформе #
Bridge.platform.send_message("game_ready")
# Для удобства можно использовать константы
Bridge.platform.send_message(Bridge.PlatformMessage.GAME_READY)
Сообщение | Описание |
---|---|
game_ready |
Игра загрузилась, все загрузочные экраны прошли, игрок может взаимодействовать с игрой. |
in_game_loading_started |
Началась какая-либо загрузка внутри игры. Например, когда идёт загрузка уровня. |
in_game_loading_stopped |
Загрузка внутри игры окончена. |
gameplay_started |
Начался геймплей. Например, игрок зашёл в уровень с главного меню. |
gameplay_stopped |
Геймплей закончился/приостановился. Например, при выходе с уровня в главное меню, открытии меню паузы и т.д. |
player_got_achievement |
Игрок достиг особенного момента. Например, победил босса, установил рекорд и т.д. |
Серверное время #
func _ready():
Bridge.platform.get_server_time(funcref(self, "_on_get_server_time_completed"))
func _on_get_server_time_completed(result):
print(result) # UTC time in milliseconds
Информация о девайсе #
Тип девайса #
Bridge.device.type
Возвращает тип девайса, с которого пользователь запустил игру. Возможные значения: mobile
, tablet
, desktop
, tv
.
Информация об игроке #
Поддержка авторизации #
Bridge.player.is_authorization_supported
Возможные значения:
true
,
false
.
Авторизован ли игрок в данный момент #
Bridge.player.is_authorized
Возможные значения:
true
,
false
.
ID игрока #
Bridge.player.id
Если данных нет –
null
. Если данные есть – данные в формате string
.
Имя игрока #
Bridge.player.name
Если данных нет –
null
. Если данные есть – данные в формате string
.
Аватар игрока #
Bridge.player.photos
Возможные значения: пустой массив, массив с ссылками на изображения.
Авторизация игрока #
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"scopes": true
}
Bridge.player.authorize(options, funcref(self, "_on_player_authorize_completed"))
func _on_player_authorize_completed(success):
if success:
print("Authorized")
else:
print("Authorization error")
Информация об игре #
Текущее состояние видимости #
Bridge.game.visibility_state
Возвращает текущее состояние видимости игры (вкладки с игрой).
Возможные значения: visible
, hidden
.
📝 Примечание
Нужно реагировать на изменение состояния видимости. Например, выключать звук в игре приhidden
и включать приvisible
.
# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
Bridge.game.connect("visibility_state_changed", self, "_on_visibility_state_changed")
func _on_visibility_state_changed(state):
print(state)
Пользовательские данные #
Есть два типа хранилища: локальноеlocal_storage
и внутреннее platform_internal
. При записи в локальное — данные сохраняются у игрока на конкретном девайсе, при записи во внутреннее — данные сохраняются на серверах платформы.
Тип хранилища по умолчанию #
Bridge.storage.default_type
Тип хранилища, который используется по-умолчанию в конкретный момент на конкретной платформе. Возможные значения: local_storage
, platform_internal
.
Проверка на поддержку #
Bridge.storage.is_supported("local_storage")
Bridge.storage.is_supported("platform_internal")
# Для удобства можно использовать константы
Bridge.storage.is_supported(Bridge.StorageType.LOCAL_STORAGE)
Bridge.storage.is_supported(Bridge.StorageType.PLATFORM_INTERNAL)
Возможные значения:
true
,
false
.
Проверка на доступность #
Bridge.storage.is_available("local_storage")
Bridge.storage.is_available("platform_internal")
# Для удобства можно использовать константы
Bridge.storage.is_available(Bridge.StorageType.LOCAL_STORAGE)
Bridge.storage.is_available(Bridge.StorageType.PLATFORM_INTERNAL)
Возможные значения:
true
,
false
.
Загрузка данных #
# Загрузить данные по ключу
func _ready():
Bridge.storage.get("level", funcref(self, "_on_storage_get_completed"))
func _on_storage_get_completed(success, data):
if success:
if data != null:
print(data)
else:
# Данных по ключу level нет
print("Data is null")
# Загрузить данные сразу по нескольким ключам
func _ready():
Bridge.storage.get(["level", "coins"], funcref(self, "_on_storage_get_completed"))
func _on_storage_get_completed(success, data):
if success:
if data[0] != null:
print("Level: ", data[0])
else:
# Данных по ключу level нет
print("Level is null")
if data[1] != null:
print("Coins: ", data[1])
else:
# Данных по ключу coins нет
print("Coins is null")
# Загрузить данные из конкретного хранилища
Bridge.storage.get("level", funcref(self, "_on_storage_get_completed"), Bridge.StorageType.LOCAL_STORAGE)
Сохранение данных #
# Сохранить данные по ключу
func _ready():
Bridge.storage.set("level", "dungeon_123", funcref(self, "_on_storage_set_completed"))
func _on_storage_set_completed(success):
print("On Storage Set Completed, success: ", success)
# Сохранить данные по нескольким ключам
Bridge.storage.set(["level", "is_tutorial_completed", "coins"], ["dungeon_123", true, 42], funcref(self, "_on_storage_set_completed"))
# Сохранить данные в конкретное хранилище
Bridge.storage.set("level", "dungeon_123", funcref(self, "_on_storage_set_completed"), Bridge.StorageType.LOCAL_STORAGE)
Удаление данных #
# Удалить данные по ключу
func _ready():
Bridge.storage.delete("level", funcref(self, "_on_storage_delete_completed"))
func _on_storage_delete_completed(success):
print("On Storage Delete Completed, success: ", success)
# Удалить данные по нескольким ключам
Bridge.storage.delete(["level", "is_tutorial_completed", "coins"], funcref(self, "_on_storage_delete_completed"))
# Удалить данные из конкретного хранилища
Bridge.storage.delete("level", funcref(self, "_on_storage_delete_completed"), Bridge.StorageType.LOCAL_STORAGE)
Если при работе с данными не передавать конкретный тип хранилища, то используется тип хранилища по умолчанию Bridge.storage.default_type
.
Реклама #
Banner #
Поддерживается ли баннер #
Bridge.advertisement.is_banner_supported
Возможные значения:
true
,
false
.
Показать баннер #
var options
match Bridge.platform.id:
"vk":
options = {
"position": "bottom",
"layoutType": "resize",
"canClose": false,
}
"crazy_games":
options = {
"containerId": "div-container-id"
}
"game_distribution":
options = {
"containerId": "div-container-id"
}
Bridge.advertisement.show_banner(options)
Скрыть баннер #
Bridge.advertisement.hide_banner()
Состояние баннера #
Bridge.advertisement.banner_state
Текущее состояние баннера. Возможные значения: loading
, shown
, hidden
, failed
.
# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
Bridge.advertisement.connect("banner_state_changed", self, "_on_banner_state_changed")
func _on_banner_state_changed(state):
print(state)
Interstitial #
Межстраничная реклама. Обычно показывается в момент загрузки уровня/поражения и т.д.Минимальный интервал между показами #
# Значение по умолчанию = 60 секунд
Bridge.advertisement.minimum_delay_between_interstitial
Между показами Interstitial-рекламы нужно соблюдать временные интервалы. Например, Yandex просто не покажет рекламу если вызывать слишком часто, а VK будет показывать так часто, как вызывается метод.
Для удобства, в данном SDK есть встроенный механизм таймера между показами. Вам нужно лишь указать нужный интервал и можно дёргать метод показа рекламы сколько угодно.
Bridge.advertisement.set_minimum_delay_between_interstitial(30)
Состояние рекламы #
Bridge.advertisement.interstitial_state
Текущее состояние рекламы. Возможные значения: loading
, opened
, closed
, failed
.
📝 Примечание
Нужно реагировать на изменение состояния рекламы. Например, выключать звук в игре приopened
и включать приclosed
иfailed
.
# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
Bridge.advertisement.connect("interstitial_state_changed", self, "_on_interstitial_state_changed")
func _on_interstitial_state_changed(state):
print(state)
Показать рекламу #
Bridge.advertisement.show_interstitial()
Rewarded #
Реклама за вознаграждение.Состояние рекламы #
Bridge.advertisement.rewarded_state
Текущее состояние рекламы. Возможные значения: loading
, opened
, closed
, rewarded
, failed
.
📝 Примечание
Нужно реагировать на изменение состояния рекламы. Например, выключать звук в игре приopened
и включать приclosed
иfailed
.
⚠️ Предупреждение
Награду игроку нужно выдавать только при наступлении состоянияrewarded
.
# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
Bridge.advertisement.connect("rewarded_state_changed", self, "_on_rewarded_state_changed")
func _on_rewarded_state_changed(state):
print(state)
Показать рекламу #
Bridge.advertisement.show_rewarded()
AdBlock #
Проверить включен ли блокировщик рекламы.func _ready():
Bridge.advertisement.check_adblock(funcref(self, "_on_check_adblock_completed"))
func _on_check_adblock_completed(result):
print(result) # true or false
Социальные взаимодействия #
Поделиться #
Bridge.social.is_share_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"vk":
options = {
"link": "https://vk.com/mewton.games"
}
Bridge.social.share(options, funcref(self, "_on_share_completed"))
func _on_share_completed(success):
print(success)
Вступить в сообщество #
Bridge.social.is_join_community_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"vk":
options = {
"groupId": 199747461
}
"ok":
options = {
"groupId": 62984239710374
}
Bridge.social.join_community(options, funcref(self, "_on_join_community_completed"))
func _on_join_community_completed(success):
print(success)
Пригласить друзей #
Bridge.social.is_invite_friends_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"ok":
options = {
"text": "Hello World!"
}
Bridge.social.invite_friends(options, funcref(self, "_on_invite_friends_completed"))
func _on_invite_friends_completed(success):
print(success)
Опубликовать пост #
Bridge.social.is_create_post_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"vk":
options = {
"message": "Hello world!",
"attachments": "photo-199747461_457239629"
}
"ok":
options = {
"media":[
{
"type": "text",
"text": "Here you can see odnoklassniki API docs(click the link)"
},
{
"type": "link",
"url": "https://apiok.ru"
},
{
"type": "poll",
"question": "Do you like our API?",
"answers": [
{ "text": "Yes" },
{ "text": "No" }
],
"options": "SingleChoice,AnonymousVoting"
}
]
}
Bridge.social.create_post(options, funcref(self, "_on_create_post_completed"))
func _on_create_post_completed(success):
print(success)
Добавить в избранное #
Bridge.social.is_add_to_favorites_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
Bridge.social.add_to_favorites(funcref(self, "_on_add_to_favorites_completed"))
func _on_add_to_favorites_completed(success):
print(success)
Добавить на рабочий стол #
Bridge.social.is_add_to_home_screen_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
Bridge.social.add_to_home_screen(funcref(self, "_on_add_to_home_screen_completed"))
func _on_add_to_home_screen_completed(success):
print(success)
Оценить игру #
Bridge.social.is_rate_supported
Поддерживается ли функционал на платформе.
Возможные значения:
true
,
false
.
func _ready():
Bridge.social.rate(funcref(self, "_on_rate_completed"))
func _on_rate_completed(success):
print(success)
Внешние ссылки #
Bridge.social.is_external_links_allowed
Разрешены ли внешние ссылки на платформе.
Возможные значения:
true
,
false
.
Лидерборды #
Поддержка #
Bridge.leaderboard.is_supported
Возможные значения:
true
,
false
.
Нативный popup #
Bridge.leaderboard.is_native_popup_supported
Поддерживается ли нативный popup.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"vk":
options = {
"userResult": 42,
"global": true
}
Bridge.leaderboard.show_native_popup(options, funcref(self, "_on_show_native_popup_completed"))
func _on_show_native_popup_completed(success):
print(success)
Очки игрока #
Запись #
Bridge.leaderboard.is_set_score_supported
Поддерживается ли запись очков игрока.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"leaderboardName": "YOUR_LEADERBOARD_NAME",
"score": 42
}
Bridge.leaderboard.set_score(options, funcref(self, "_on_set_score_completed"))
func _on_set_score_completed(success):
print(success)
Чтение #
Bridge.leaderboard.is_get_score_supported
Поддерживается ли чтение очков игрока.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"leaderboardName": "YOUR_LEADERBOARD_NAME"
}
Bridge.leaderboard.get_score(options, funcref(self, "_on_get_score_completed"))
func _on_get_score_completed(success, score):
print(success)
print(score)
Записи таблицы #
Bridge.leaderboard.is_get_entries_supported
Поддерживается ли чтение полной таблицы.
Возможные значения:
true
,
false
.
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"leaderboardName": "YOUR_LEADERBOARD_NAME",
"includeUser": true,
"quantityAround": 10,
"quantityTop": 10
}
Bridge.leaderboard.get_entries(options , funcref(self, "_on_get_entries_completed"))
func _on_get_entries_completed(success, entries):
print(success)
match Bridge.platform.id:
"yandex":
for entry in entries:
print("ID: " + str(entry.id))
print("Name: " + str(entry.name))
print("Score: " + str(entry.score))
print("Rank: " + str(entry.rank))
print("Photo: " + str(entry.photo))
Внутриигровые покупки #
Существуют два типа покупок — постоянные (например, отключение рекламы) и расходуемые (например, внутриигровые монеты).Поддержка #
Bridge.payments.is_supported
Возможные значения:
true
,
false
.
Покупка #
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"id": "PURCHASE_ID"
}
Bridge.payments.purchase(options, funcref(self, "_on_purchase_completed"))
func _on_purchase_completed(success):
print(success)
Расходование #
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"purchaseToken": "PURCHASE_TOKEN"
}
Bridge.payments.consume_purchase(options, funcref(self, "_on_consume_completed"))
func _on_consume_completed(success):
print(success)
Каталог всех товаров #
func _ready():
Bridge.payments.get_catalog(funcref(self, "_on_get_catalog_completed"))
func _on_get_catalog_completed(success, catalog):
print(success)
match Bridge.platform.id:
"yandex":
for item in catalog:
print("ID: " + str(item.id))
print("Title: " + str(item.title))
print("Description: " + str(item.description))
print("Image: " + str(item.imageURI))
print("Price: " + str(item.price))
print("Price Currency Code: " + str(item.priceCurrencyCode))
print("Price Currency Image: " + str(item.priceCurrencyImage))
print("Price Value: " + str(item.priceValue))
Список купленных товаров #
func _ready():
Bridge.payments.get_purchases(funcref(self, "_on_get_purchases_completed"))
func _on_get_purchases_completed(success, purchases):
print(success)
match Bridge.platform.id:
"yandex":
for purchase in purchases:
print("Product Id: " + str(purchase.productID))
print("Purchase Token: " + str(purchase.purchaseToken))
Удаленная конфигурация #
С помощью удаленной конфигурации вы можете управлять настройками вашей игры не выпуская обновлений.Поддержка #
Bridge.remote_config.is_supported
Возможные значения:
true
,
false
.
Загрузка значений #
func _ready():
var options
match Bridge.platform.id:
"yandex":
options = {
"clientFeatures": [
{ "name": "player_coins", "value": "42" },
{ "name": "player_level", "value": "dungeon_123" },
]
}
Bridge.remote_config.get(options, funcref(self, "_on_remote_config_get_completed"))
func _on_remote_config_get_completed(success, data):
print(success)
print(data)