Godot

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.

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)
Межстраничная реклама. Обычно показывается в момент загрузки уровня/поражения и т.д.
# Значение по умолчанию = 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() 
Реклама за вознаграждение.
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()
Проверить включен ли блокировщик рекламы.
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)
← Construct Unity →