Браузерные игры давно укрепились в сознании людей как способ быстренько скоротать несколько минут времени, не парясь установкой чего либо на своё устройство. И со временем появляется всё больше способов их создавать. Чистый JavaScript, фреймворки, и даже экспорт из Unity. Godot Engine также предоставляет средства для создания браузерных игр.
Однако, с приходом версии 4.0 появилась целая волна сообщений от разных авторов о том, что их игры на Годо абсолютно не работают в вебе, а только показывают небольшое окно с непонятной ошибкой, говорящей об отсутствии каких-то Cross Origin Isolation и SharedArrayBuffer.
Что такое 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.
Ну и будем надеяться, что в скором времени можно будет без проблем взять последний релиз и игра на нём будет работать без проблем, как и на "тройке".