Найти тему
Nefrace

Godot Engine и браузерные игры

Оглавление

Браузерные игры давно укрепились в сознании людей как способ быстренько скоротать несколько минут времени, не парясь установкой чего либо на своё устройство. И со временем появляется всё больше способов их создавать. Чистый JavaScript, фреймворки, и даже экспорт из Unity. Godot Engine также предоставляет средства для создания браузерных игр.

Однако, с приходом версии 4.0 появилась целая волна сообщений от разных авторов о том, что их игры на Годо абсолютно не работают в вебе, а только показывают небольшое окно с непонятной ошибкой, говорящей об отсутствии каких-то Cross Origin Isolation и SharedArrayBuffer.

Страшный сон человека, перешедшего на Godot 4.0
Страшный сон человека, перешедшего на Godot 4.0

Что такое SharedArrayBuffer и зачем он нужен?

Если очень сильно упрощать - SharedArrayBuffer позволяет приложению создавать несколько потоков, которые будут объединены общей памятью для эффективного обмена данными. В Godot 3 нельзя создавать новые потоки, а также есть проблемы со звуком, проявляющиеся в виде задержек или подвисаний. Большинство современных браузеров поддерживают эту технологию, однако требуют включения межсайтовой изоляции (Ещё один термин, встречающийся в ошибке - Cross Origin Isolation), чтобы предотвратить доступ к данным из общей памяти другими страницами. В общем случае делается это при помощи отдачи сервером, который показывает страницу, двух заголовков:

Cross-Origin-Opener-Policy: same-origin

Cross-Origin-Embedder-Policy: require-corp

По этому поводу есть отличная статья на web.dev

Решение проблемы

А что с этим делать нам? Ну, есть несколько вариантов, зависящих от того, куда вы выкладываете игру:

  • Если вы делаете игру для площадки Itch.io, то поздравляю! Вам достаточно на странице игры включить пункт "SharedArrayBuffer support", который сразу же заставит игру работать.
Почти в самом низу страницы с настройками проекта.
Почти в самом низу страницы с настройками проекта.
  • Если же игра, внезапно, находится на вашем собственном веб-сайте значит скорее всего у вас есть доступ к настройкам веб-сервера и вы сможете указать нужные заголовки самостоятельно. Тут я не буду на этом останавливаться подробно, потому что конфиги явно будут менятся от сервера к серверу, будь то Apache, Nginx, Caddy или всё происходит через панель управления вашего хостинга.
  • Если вы не имеете доступа к серверной части и не можете менять отправляемые им заголовки, то недавно появился обходной путь в виде небольшого проекта под названием coi-serviceworker, который один добрый человек под ником Nisovin обернул в ассет. Достаточно установить этот плагин в проект и включить в настройках!
Так ассет выглядит в каталоге
Так ассет выглядит в каталоге
Здесь он включается
Здесь он включается

После этого ничего больше не нужно настраивать, игра запустится без каких либо проблем, но с одной оговоркой: страница с игрой должна один раз перезагрузиться после первоначальной подгрузки скрипта, благо, это дело автоматизировано. Однако, если вы хотите такую игру где-то опубликовать, например, на тех же Яндекс Играх, то скорее всего, она не пройдёт модерацию как раз по причине перезагрузки. Я лично это не тестировал, но шансы не нулевые.

Что можно сделать ещё?

Какой же самый идеальный вариант? На данный момент, если вы заранее знаете, что хотите выпускать игру для браузеров и хотите охватить максимум устройств, используйте Godot 3 версии. Это всё ещё отличный движок, который будет продолжать поддерживаться ещё долгое время, так как обрёл статус LTS-релиза, и игры на нём будут работать на большинстве устройств.

В пользу выбора третьей версии говорит ещё то, игры на Godot 4 могут не работать на устройствах фирмы Apple из-за того, что в их браузерах на данный момент не поддерживается WebGL 2, который, опять же, является требованием для веб-экспорта из Godot 4. Так что если вы планируете не оставить владельцев данных устройств без своей игры, или сами являетесь гордым пользователем Apple - смело берите Godot 3.5.2 и в дальнейшем 3.6.

Ну и будем надеяться, что в скором времени можно будет без проблем взять последний релиз и игра на нём будет работать без проблем, как и на "тройке".