Всем привет, с вами Даниил. В этой статье я покажу способ, как подружить SDK Яндекс.Игр и движок Godot Engine.
Данная статья является текстовой версией видео на моём втором канале.
Официальная документация SDK Яндекс.Игр.
Также, для удобства создал репозиторий данного проекта на GitHub.
Обновление 05.11.2024: обновил ссылку на SDK в коде.
Я подготовил несколько сцен, где будет проходить демонстрация. Первую сцену я назвал "First", вторую – "Second". В первой сцене будет демонстрация "Награды за рекламу" посредством нажатия кнопки "Получить монеты" с иконкой, изображающую, что здесь будет реклама. Также, здесь есть кнопка "Вперёд", с помощью которой мы переходим в сцену "Second". В момент перехода будет демонстрироваться так называемая "Межстраничная реклама".
Чтобы присоединить SDK Яндекс.Игр, необходимо зайти в настройки экспорта проекта и, если нет шаблона версии для браузера, добавляем его.
Примечание: для того, чтобы вы могли добавлять шаблоны экспорта к проекту, необходимо иметь установленные шаблоны экспорта. [Editor, Manage Export Templates]
В шаблоне для браузера находим поле "Head Include" и вводим туда строку, которую нам предлагают написать из официальной документации SDK.
Присоединяем SDK и инициализируем его.
<script src="/sdk.js"></script>
<script>
YaGames.init().then(ysdk => { window.ysdk = ysdk; });
</script>
Во второй блок <script> добавляем функции, которые понадобятся для работы рекламы. Параметр "callback" пригодится для построения связи в движке. Подробнее в документации.
function ShowAd(callback) {
window.ysdk.adv.showFullscreenAdv({
callbacks: {
onClose: function(wasShown) {
callback(true);
console.log('Ad!');
},
onError: function(error) {
callback(false);
console.log('Ad Error:', error);
}
}
})
}
function ShowAdRewardedVideo(callback) {
window.ysdk.adv.showRewardedVideo({
callbacks: {
onOpen: () => { console.log('Video ad open.'); },
onRewarded: () => {
isRewarded = true;
callback(isRewarded);
console.log('Reward!');
},
onClose: () => { console.log('Video ad closed.'); },
onError: (e) => { console.log('Error while open rewarded ad:', e); }
}
});
}
Итак, JavaScript код готов, возвращаемся в движок. В качестве примера, я создал файл глобального скрипта "global.gd", в котором я буду реализовывать ответ от SDK.
В скрипте будет находиться переменная "coins" для сохранения количества монет в памяти. Переменные "callback_rewarded_ad" и "callback_ad" – это реализация параметров в движке для JavaScript функций "ShowAdRewardedVideo" и "ShowAd" соответственно. Переменная "win" предоставляет доступ к JS функциям игры, но это будет работать только в HTML5 версии проекта. Функции "js_show_ad" и "js_show_rewarded_ad" будут использоваться в момент, когда и где нам необходимо показать рекламу, а функции "_rewarded_ad" и "_ad" будут использоваться автономно после выполнения JS кода.
var coins = 0
var callback_rewarded_ad = JavaScript.create_callback(self, '_rewarded_ad')
var callback_ad = JavaScript.create_callback(self, '_ad')
onready var win = JavaScript.get_interface("window")
func js_show_ad():
win.ShowAd(callback_ad)
# Здесь можно приостановить музыку / звуки
func js_show_rewarded_ad():
win.ShowAdRewardedVideo(callback_rewarded_ad)
# Здесь можно приостановить музыку / звуки
func _rewarded_ad(args):
print(args[0])
coins += 10
# Здесь можно возобновить музыку / звуки
func _ad(args):
print(args[0])
# Здесь можно возобновить музыку / звуки
Переходим в сцену "First" и создаём для неё скрипт. Мы подключаем сигналы к кнопкам и вызываем необходимые методы. Вызываем вознаграждение за рекламу и переход в сцену "Second", делаем так, чтобы показывалась актуальная информация о монетах.
onready var label: Label = $Margin/VBoxContainer/Panel/VBoxContainer/Label
func _process(_delta: float) -> void:
update_ui()
func update_ui():
label.text = "Монеты: %d" % [Global.coins]
func _on_Reward_pressed() -> void:
Global.js_show_rewarded_ad()
func _on_Next_pressed() -> void:
get_tree().change_scene("res://scenes/second/second.tscn")
Переходим в сцену "Second" и для неё также создаём скрипт. Делаем так, чтобы при переходе на данную сцену у нас показывалась обычная реклама, делаем возврат в сцену "First".
func _ready() -> void:
Global.js_show_ad()
func _on_Back_pressed() -> void:
get_tree().change_scene("res://scenes/first/first.tscn")
Теперь проверяем рекламу. Заходим в консоль Яндекс.Игр и "Добавляем приложение". Учтите, исходя из документации "Рекламный блок будет создан только при полностью заполненном черновике", но не обязательно заполнять абсолютно все поля. Например, я пропустил поля "Скриншоты", "Видео" и "Обложка", а на остальных полях на время можно написать непонятный текст, выбрать что-то случайно и загрузить какую-нибудь иконку.
Яндекс.Игры принимает игры в виде zip архива, название главного файла должно быть "index.html".
Через некоторое время, файл проверится и игра станет доступна вам по ссылке.
Проверяем рекламу, нажимаем на кнопку "Получить монеты".
Проверяем обычную рекламу.
Подписывайся на канал, оценивай будущие статьи и не только, пиши комментарии, а с вами был Даниил, всем удачи, мира и спокойствия, всем пока.