Godot

Godot 3.x #

Подключение #

Скачайте актуальный архив instant_games_bridge.zip со страницы релизов на гитхаб, разархивируйте его и положите содержимое в res://addons:

Включите плагин в настройках проекта:

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

Когда игра загружена — плагин уже проинициализирован. Ничего дополнительно делать не нужно.

Сборка #

Для корректной работы плагина необходимо выбрать соответствующий HTML-шаблон. Укажите в настройках экспорта в пункте Custom HTML Shell:

res://addons/instant_games_bridge/template/index.html

Информация о платформе #

ID платформы #

Bridge.platform.id

Возвращает ID платформы, на которой запущена игра в данный момент. Возможные значения: playgama, vk, ok, yandex, crazy_games, absolute_games, game_distribution, vk_play, mock.

Язык #

Bridge.platform.language

Если платформа предоставляет данные об языке пользователя — то это будет язык, который установлен у пользователя на платформе. Если не предоставляет — это будет язык браузера пользователя. Формат: ISO 639-1. Пример: ru, en.

Параметр из адресной строки #

Bridge.platform.payload

С помощью данного параметра можно в ссылку на игру встраивать какую-либо вспомогательную информацию.

Платформа Формат ссылки
Playgama
VK vk.com/app8056947#your-info
OK
Yandex yandex.com/games/play/183100?payload=your-info
Crazy Games crazygames.com/game/example?payload=your-info
Absolute Games
Game Distribution
VK Play
Mock site.com/game?payload=your-info

Информация о домене #

Bridge.platform.tld
Платформа Возможные значения
Playgama null
VK null
OK null
Yandex com, ru, etc.
Crazy Games null
Absolute Games null
Game Distribution null
VK Play null
Mock null

Отправка сообщения платформе #

Bridge.platform.send_message("game_ready")

# Для удобства можно использовать константы
Bridge.platform.send_message(Bridge.PlatformMessage.GAME_READY)
Сообщение Описание Где поддерживается
game_ready Игра загрузилась, все загрузочные экраны прошли, игрок может взаимодействовать с игрой. yandex
in_game_loading_started Началась какая-либо загрузка внутри игры. Например, когда идёт загрузка уровня. crazy_games
in_game_loading_stopped Загрузка внутри игры окончена. crazy_games
gameplay_started Начался геймплей. Например, игрок зашёл в уровень с главного меню. crazy_games
gameplay_stopped Геймплей закончился/приостановился. Например, при выходе с уровня в главное меню, открытии меню паузы и т.д. crazy_games
player_got_achievement Игрок достиг особенного момента. Например, победил босса, установил рекорд и т.д. crazy_games

Информация о девайсе #

Тип девайса #

Bridge.device.type

Возвращает тип девайса, с которого пользователь запустил игру. Возможные значения: mobile, tablet, desktop, tv.

Информация об игроке #

Поддержка авторизации #

Bridge.player.is_authorization_supported
Платформа Возможные значения
Playgama false
VK true
OK true
Yandex true
Crazy Games false
Absolute Games true
Game Distribution false
VK Play true
Mock false

Авторизован ли игрок в данный момент #

Bridge.player.is_authorized
Платформа Возможные значения
Playgama false
VK true
OK true
Yandex true / false
Crazy Games false
Absolute Games true / false
Game Distribution false
VK Play true / false
Mock false

ID игрока #

Bridge.player.id

Если авторизация поддерживается на платформе и игрок авторизован в данный момент – возвращает его ID на платформе, иначе — null.

Имя игрока #

Bridge.player.name
Платформа Возможные значения
Playgama null
VK Имя игрока
OK Имя игрока
Yandex Если игрок авторизован и дал игре доступ к личной информации — имя игрока, иначе — null
Crazy Games null
Absolute Games Если игрок авторизован — имя игрока, иначе — null
Game Distribution null
VK Play Если игрок авторизован — имя игрока, иначе — null
Mock null

Аватар игрока #

Bridge.player.photos

Массив аватаров игрока, упорядоченный по возрастанию разрешения.

Платформа Возможные значения
Playgama Пустой массив
VK Массив ссылок на изображения
OK Массив ссылок на изображения
Yandex Если игрок авторизован и дал игре доступ к личной информации — массив ссылок на изображения, иначе — пустой массив
Crazy Games Пустой массив
Absolute Games Если игрок авторизован — массив ссылок на изображения, иначе — пустой массив
Game Distribution Пустой массив
VK Play Если игрок авторизован — массив ссылок на изображения, иначе — пустой массив
Mock Пустой массив

Авторизация игрока #

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")
Платформа Возможные значения
Playgama false
VK true
OK true
Yandex Если игрок уже авторизован — true. Если не авторизован — показывается диалоговое окно авторизации. Далее true / false зависит от того авторизуется игрок или нет.
Crazy Games false
Absolute Games Если игрок уже авторизован или открылось окно авторизации — true. После авторизации происходит перезагрузка страницы. false в случае ошибки.
Game Distribution false
VK Play Если игрок авторизован — true. Если игрок авторизуется — true (после этого произойдёт перезагрузка страницы). false в случае ошибки.
Mock false

Информация об игре #

Текущее состояние видимости #

Bridge.game.visibility_state

Возвращает текущее состояние видимости игры (вкладки с игрой). Возможные значения: visible, hidden.

# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
    Bridge.game.connect("visibility_state_changed", self, "_on_visibility_state_changed")

func _on_visibility_state_changed(state):
    print(state)
📝 Примечание
Нужно реагировать на изменение состояния рекламы. Например, выключать звук в игре при opened и включать при closed и failed.

Пользовательские данные #

Есть два типа хранилища: локальное local_storage и внутреннее platform_internal. При записи в локальное — данные сохраняются у игрока на конкретном девайсе, при записи во внутреннее — данные сохраняются на серверах платформы.

Тип хранилища по умолчанию #

Bridge.storage.default_type

Используется автоматически, если при работе с данными не указывать конкретный тип.

Платформа Возможные значения
Playgama local_storage
VK platform_internal
OK Если игрок дал доступ — platform_internal, если нет — local_storage
Yandex Если игрок авторизован — platform_internal, если нет — local_storage
Crazy Games local_storage
Absolute Games Если игрок авторизован — platform_internal, если нет — local_storage
Game Distribution local_storage
VK Play local_storage
Mock local_storage

Проверка на поддержку #

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)
Платформа local_storage platform_internal
Playgama true false
VK true true
OK true true
Yandex true true
Crazy Games true false
Absolute Games true true
Game Distribution true false
VK Play true false
Mock 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)
Платформа local_storage platform_internal
Playgama true false
VK true true
OK true Если игрок дал доступ — true, если нет — false
Yandex true Если игрок авторизован — true, если нет — false
Crazy Games true false
Absolute Games true Если игрок авторизован — true, если нет — false
Game Distribution true false
VK Play true false
Mock 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
Платформа Возможные значения
Playgama false
VK true
OK true
Yandex true
Crazy Games true
Absolute Games false
Game Distribution true
VK Play false
Mock false
📝 Примечание
Чтобы баннеры работали в Yandex — необходимо их включить в настройках игры.
📝 Примечание
Чтобы баннеры работали в Crazy Games — необходимо в index.html добавить контейнер <div> нужных размеров. Подробнее про размеры: https://docs.crazygames.com/sdk/html5/#responsive-banners.
📝 Примечание
Чтобы баннеры работали в Game Distribution — необходимо в index.html добавить контейнер <div> нужных размеров. Подробнее про размеры: https://github.com/GameDistribution/GD-HTML5/wiki/Display-Ads.
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 есть встроенный механизм таймера между показами. Вам нужно лишь указать нужный интервал и можно дёргать метод показа рекламы сколько угодно. По умолчанию интервал = 60 секунд.

Bridge.advertisement.set_minimum_delay_between_interstitial(30)
Bridge.advertisement.interstitial_state

Текущее состояние рекламы. Возможные значения: loading, opened, closed, failed.

# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
    Bridge.advertisement.connect("interstitial_state_changed", self, "_on_interstitial_state_changed")

func _on_interstitial_state_changed(state):
    print(state)
📝 Примечание
Нужно реагировать на изменение состояния рекламы. Например, выключать звук в игре при opened и включать при closed и failed.
Bridge.advertisement.show_interstitial() 

Реклама за вознаграждение.

Bridge.advertisement.rewarded_state

Текущее состояние рекламы. Возможные значения: loading, opened, closed, rewarded, failed.

# Отслеживать изменение состояния можно подключившись к сигналу
func _ready():
    Bridge.advertisement.connect("rewarded_state_changed", self, "_on_rewarded_state_changed")

func _on_rewarded_state_changed(state):
    print(state)
📝 Примечание
Нужно реагировать на изменение состояния рекламы. Например, выключать звук в игре при opened и включать при closed и failed.
⚠️ Предупреждение
Награду игроку нужно выдавать только при наступлении состояния rewarded.
Bridge.advertisement.show_rewarded()

Социальные взаимодействия #

Поделиться #

Bridge.social.is_share_supported

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK true
OK false
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgame false
VK true
OK true
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK true
OK true
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK true
OK true
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK true
OK false
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK Android: true.
Desktop, iOS: false.
OK false
Yandex true / false
Доступность опции зависит от девайса игрока, внутренних правил браузера и ограничений платформы.
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли функционал на платформе.

Платформа Возможные значения
Playgama false
VK false
OK true
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock false
func _ready():
    Bridge.social.rate(funcref(self, "_on_rate_completed"))
    
func _on_rate_completed(success):
    print(success)
Bridge.social.is_external_links_allowed

Разрешены ли внешние ссылки на платформе.

Платформа Возможные значения
Playgama false
VK true
OK false
Yandex false
Crazy Games true
Absolute Games false
Game Distribution false
VK Play false
Mock false

Лидерборды #

Поддержка #

Bridge.leaderboard.is_supported
Платформа Возможные значения
Playgama false
VK true*
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock false
⚠️ Предупреждение
* В VK с клиента можно только показать нативный popup, для всего остального потребуется свой сервер.

Нативный popup #

Bridge.leaderboard.is_native_popup_supported

Поддерживается ли нативный popup.

Платформа Возможные значения
Playgama false
VK Android, iOS, Mobile Web: true
Desktop: false
OK false
Yandex false
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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

Поддерживается ли запись очков игрока.

Платформа Возможные значения
Playgama false
VK false
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock false
func _ready():
    var options
    
    match Bridge.platform.id:
        "yandex":
            options = {
                "leaderboardName": "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

Поддерживается ли чтение очков игрока.

Платформа Возможные значения
Playgama false
VK false
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock false
func _ready():
    var options
    
    match Bridge.platform.id:
        "yandex":
            options = {
                "leaderboardName": "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

Поддерживается ли чтение полной таблицы.

Платформа Возможные значения
Playgama false
VK false
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock false
func _ready():
    var options
    
    match Bridge.platform.id:
        "yandex":
            options = {
                "leaderboardName": "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)
    print(entries)

Внутриигровые покупки #

Существуют два типа покупок — постоянные (например, отключение рекламы) и расходуемые (например, внутриигровые монеты).

Поддержка #

Bridge.payments.is_supported
Платформа Возможные значения
Playgama false
VK false
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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(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)

    for i in range(catalog.length):
        var catalog_item = catalog[i]
        print(catalog_item.id)
        print(catalog_item.title)
        print(catalog_item.description)
        print(catalog_item.icon)
        print(catalog_item.price_value)
        print(catalog_item.price_currency_code)

Список купленных товаров #

func _ready():
    Bridge.payments.get_purchases(funcref(self, "_on_get_purchases_completed"))
    
func _on_get_purchases_completed(success, purchases):
    print(success)

    for i in range(purchases.length):
        var purchase = purchases[i]
        print(purchases.id)
        print(purchases.token)

Удаленная конфигурация #

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

Поддержка #

Bridge.remote_config.is_supported
Платформа Возможные значения
Playgama false
VK false
OK false
Yandex true
Crazy Games false
Absolute Games false
Game Distribution false
VK Play false
Mock 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 →