Разработчикам
Как опубликовать HTML5-игру в каталоге Gamely.
Как опубликовать
- Зарегистрируйтесь и подайте заявку на аккаунт разработчика: расскажите о себе и своих играх, оставьте контакт. Модератор проверит заявку.
- После одобрения в кабинете разработчика откроется загрузка игр.
- Загрузите игру: ZIP-архив с
index.htmlили один HTML-файл. - Добавьте описание, правила, категорию и возрастную метку.
- Игра уходит на модерацию. После проверки она появится в каталоге, а если нет — в кабинете будет указана причина.
Требования к игре
index.html— в корне архива или в единственной папке внутри него.- Ресурсы подключаются относительными путями:
img/hero.png, а не/img/hero.png. - Архив — до 100 МБ (после распаковки — до 300 МБ, до 5000 файлов), одиночный HTML — до 5 МБ.
Сжатые сборки Unity (
.br,.gz) отдаются с нужными заголовками. - Обложка: положите в корень архива
cover.png,cover.jpg,cover.webpилиcover.svgв пропорции 16:9. - Иконка:
icon.png,icon.webpилиicon.svg, квадрат. Её показывают маленькой (от 48 px), поэтому без текста — один крупный узнаваемый символ игры. - Игра должна работать и на компьютере, и на телефоне: мышь, клавиатура и касания.
- Игра запускается в изолированной песочнице:
localStorage, cookie,alertи всплывающие окна недоступны. Прогресс и рекорды сохраняйте через Gamely SDK.
Игра с Яндекс Игр
Загрузите тот же ZIP-архив, что загружали в консоль Яндекс Игр, — пересобирать ничего не нужно. У Gamely есть
свой SDK с тем же API, что у Яндекса: при загрузке ссылки на https://yandex.ru/games/sdk/v2 и
/sdk.js начинают вести на него.
- Работает как на Яндексе:
YaGames.init(), облачные сохраненияplayer.getData/setData, статистикаgetStats/setStats/incrementStats,getStorage(),environment(язык — русский),deviceInfo,LoadingAPI.ready(),GameplayAPI, событияon/off,screen.fullscreen,getFlags. - localStorage тоже работает: в песочнице SDK подменяет его хранилищем, которое сохраняется вместе с прогрессом.
Читайте его после
YaGames.init()— до подключения он может быть ещё пустым. - Реклама:
ysdk.adv.*идут через рекламу площадки; пока сеть не подключена, полноэкранная не показывается (onClose(false)), а за просмотр видео награда выдаётся сразу. - Лидерборды (
ysdk.leaderboardsи старыеgetLeaderboards()) пишут в таблицы рекордов площадки. Порядок всегда «больше — лучше». - Отзывы:
feedback.requestReview()открывает окно отзыва на странице игры. - Пока заглушки — игра не упадёт, но функции нет: покупки (каталог пуст), бонусы, ярлык на рабочий стол, мультиплеер, вход через Яндекс.
- Если у игрока есть аккаунт Gamely,
player.getName()вернёт его имя, аgetMode()— пустую строку, как у вошедшего на Яндексе.
Что не пройдёт модерацию
- Чужие игры и чужая графика без прав на них.
- Вредоносный код, майнинг, попытки выйти за пределы песочницы.
- Азартные игры на деньги, экстремизм, контент 18+ без соответствующей метки.
- Неработающие игры: чёрный экран, ошибки при запуске, невозможность пройти начало.
Сохранения: Gamely SDK
Игра запускается в песочнице, где localStorage и cookie недоступны. Чтобы сохранять прогресс и рекорды,
подключите SDK — он передаст сохранение площадке, и оно будет храниться за игроком.
<script src="/sdk/v1.js"></script>
<script>
let progress = { level: 1, coins: 0 };
Gamely.init().then(async (sdk) => {
const saved = await sdk.data.get(); // null, если сохранения нет
if (saved) progress = saved;
startGame(progress);
// Сохраняйте по событиям: уровень пройден, покупка, конец раунда.
onLevelComplete(() => sdk.data.set(progress));
sdk.game.ready(); // игра загрузилась и готова к игре
});
</script>
sdk.data.get()— сохранение игрока илиnull.sdk.data.set(value)— записать. Любое JSON-значение до 200 КБ. Частые вызовы SDK склеивает и отправляет не чаще раза в секунду — последнее значение не потеряется.sdk.data.clear()— удалить сохранение.sdk.environment.host—"gamely"на площадке,"standalone"вне её.sdk.player—{ anonymous, name, id }: вошёл ли игрок, его имя и постоянный id для вашей игры.sdk.game.ready(),sdk.game.start(),sdk.game.stop()— игра загрузилась, игровой процесс начался и остановился.sdk.ads.fullscreen()→{ shown }иsdk.ads.rewarded()→{ rewarded }— реклама, подробнее ниже.sdk.on('pause', fn)иsdk.on('resume', fn)— площадка начала и закончила показ рекламы: выключите звук и остановите игру, потом продолжите.
Сначала прочитайте сохранение, потом начинайте записывать: иначе первое действие игрока может затереть старый прогресс.
Вне площадки — когда вы открываете игру у себя на компьютере — SDK сохраняет в localStorage, а если он
недоступен, в память. Игра работает одинаково. Для отладки без интернета скачайте
sdk/v1.js и подключите локальную копию; при загрузке на площадку верните путь
/sdk/v1.js.
У гостя сохранения привязаны к браузеру. Когда игрок входит в аккаунт, прогресс переезжает в него и становится доступен на всех его устройствах.
Реклама в игре
Рекламу показывает площадка: вы только вызываете её в подходящий момент, а сеть, частоту и оформление настраиваем мы. Подключать рекламные SDK в саму игру не нужно и нельзя — в песочнице они не работают.
- Полноэкранная —
await sdk.ads.fullscreen()в естественной паузе: между уровнями, после проигрыша. Площадка сама пропустит показ, если реклама была меньше минуты назад или игра идёт меньше 30 секунд, — вызывайте смело,shown: false— это нормально. - За награду —
const { rewarded } = await sdk.ads.rewarded()только по нажатию игрока на кнопку с понятной подписью («×2 монеты за рекламу»). Награду выдавайте, только еслиrewardedравноtrue; еслиfalse— покажите «Реклама сейчас недоступна». - Во время показа приходит
pause, после —resume. Игры с Яндекса получают привычныеgame_api_pauseиgame_api_resume, аysdk.adv.*работают как на Яндексе. - Не показывайте рекламу при запуске игры и на каждое действие игрока: такие игры отклоняются на модерации.
Показы рекламы в ваших играх видны в кабинете в разделе «Статистика».
Таблица рекордов
Рекорды вошедших игроков видны всем: в игре и на странице игры. У гостя результат не записывается — предложите ему войти.
await sdk.leaderboard.setScore(1200); // записать, если лучше прежнего
await sdk.leaderboard.setScore(87, { board: 'time', extra: 'уровень 3' });
const top = await sdk.leaderboard.getEntries({ top: 10, around: 2 });
// top.entries: [{ rank, name, score, extra, player, me }], top.me — место игрока или null
const mine = await sdk.leaderboard.getPlayerEntry();
- Результат — целое число, больше — лучше. Для времени отправляйте, например, оставшиеся секунды.
- Таблиц может быть несколько (
board: латиница, цифры,_ - .), по умолчанию —main. - Хранится лучший результат игрока: худший не перезаписывает рекорд.
Монетки площадки
Монетки — общая валюта Gamely. Игроки покупают их в профиле, получают в подарок при регистрации и понемногу каждый день за вход. Ваша игра может предложить что-то за монетки — продолжение после проигрыша, подсказку, скин.
const balance = await sdk.coins.balance(); // число или null, если игрок не вошёл
const { ok, reason } = await sdk.coins.spend(15, 'Продолжить полёт');
if (ok) revive(); // reason: cancelled | not_enough | guest | unavailable
- Трату подтверждает игрок в окне площадки — игра не может списать монетки сама. Название покупки (до 60 символов) игрок видит в этом окне и в истории в профиле.
- Одна трата — от 1 до 1000 монеток. Выдавайте покупку, только если
okравноtrue. - Для отладки вне площадки:
Gamely.init({ debugCoins: 100 })— SDK даст 100 тестовых монеток.
Отзыв об игре
sdk.feedback.canReview() → { value, reason } и sdk.feedback.request() → { sent }:
площадка покажет окно отзыва. Просите отзыв после удачного момента (пройден уровень, новый рекорд) и не чаще раза за игру.
Статистика
В кабинете разработчика видно, сколько раз запускали ваши игры, сколько было игроков, сколько в среднем длится игра и сколько раз показана реклама — по дням и по каждой игре.