为Web导出

HTML5导出允许将godot引擎中制作的游戏发布到浏览器。这需要支持 WebAssemblyWebGL 在用户的浏览器中。

重要

使用浏览器集成开发人员控制台,通常使用 F12 ,查看 调试信息 比如javascript、引擎和WebGL错误。

注意

很多浏览器,特别是基于Chromium的浏览器,在 在本地打开file:// 协议。要解决此问题,请使用本地服务器。

小技巧

python提供了一种启动本地服务器的简单方法。使用 python -m SimpleHTTPServer 使用python 2或 python -m http.server 用python 3服务当前的工作目录 http://localhost:8000 .

WebGL 2

直到 OpenGL ES 3 渲染器从Godot中移除,以支持 Vulkan ,HTML5导出使用 WebGL 2GLES3 已选择选项。

警告

不建议使用WebGL 2,因为它预期会在不更换的情况下从Godot中删除。

并非所有浏览器都支持WebGL 2。 FirefoxChromium (Chrome、Opera)是最受支持的浏览器, SafariEdge 不要工作。论 iOS 所有浏览器都基于WebKit(即Safari),因此它们也不会工作。

Godot的WebGL2渲染器与3D有问题,不再维护。

局限性

出于安全和隐私的原因,许多在本机平台上轻松工作的功能在Web平台上更加复杂。以下是将Godot游戏移植到Web时应注意的限制列表。

使用cookie进行数据持久化

用户必须 允许cookie (特别是indexeddb)如果 user:// 需要文件系统。在玩游戏时 iframethird-party 还必须启用cookie。匿名/隐私浏览模式也会阻止持久性。

方法 OS.is_userfs_persistent() 可用于检查 user:// 文件系统是持久的,但在某些情况下会给出误报。

全屏和鼠标捕获

浏览器不允许任意使用 进入全屏 . 同样的道理 捕获光标 . 相反,这些操作必须作为对JavaScript输入事件的响应发生。在godot中,这意味着从按下的输入事件回调(如 _input_unhandled_input . 查询 输入 singleton不够,相关的输入事件当前必须处于活动状态。

出于同样的原因,除非从有效的输入事件处理程序中启动引擎,否则全屏项目设置将不起作用。这需要 customization of the HTML page .

音频自动播放

Chrome限制网站播放音频的方式。可能需要播放机单击或点击或按键以启用音频。

参见

谷歌提供了关于他们的 Web Audio autoplay policies .

HTTPClient and HTTPRequest

HTTP类在HTML5平台上有几个限制:

  • 访问或更改 StreamPeer 不可能

  • 线程/阻塞模式不可用

  • 每帧不能进行多次,因此循环中的轮询将冻结

  • 无分块响应

  • 无法禁用主机验证

  • 从属于 same-origin policy

已导出 .html 不能重复使用文件

导出时,在 生成的HTML文件 特别针对给定的导出选项。不得在进一步出口中重复使用。

启动启动启动未显示

默认的HTML页面在加载时不显示引导启动。但是,图像被导出为PNG文件,因此 custom HTML pages 可以显示。

未实现的功能

以下功能目前在HTML5平台上不可用:

小技巧

检查 list of open HTML5 issues on Github 查看您感兴趣的功能是否有问题。如果没有,打开一个来传达你的兴趣。

提供文件

为Web导出将从Web服务器生成几个要提供服务的文件,包括用于表示的默认HTML页。可以使用自定义HTML文件,请参见 自定义Web导出HTML页 .

生成的 .html 文件可以用作 DirectoryIndex 在Apache服务器中,可以重命名为 index.html 在任何时候,它的名字在默认情况下都不会被依赖。

HTML页面在浏览器窗口中以最大大小绘制游戏。这样它就可以插入到 <iframe> 随着游戏的大小,这是常见的大多数网络游戏主机网站。

其他导出的文件将按原样提供,位于 .html 文件,名称不变。这个 .wasm 文件是实现引擎的二进制WebAssembly模块。这个 .pck 文件是包含游戏的Godot主包。这个 .js 文件包含启动代码,由 .html 用于访问引擎的文件。这个 .png 文件包含启动启动启动映像。它不在默认的HTML页中使用,但包含在 custom HTML pages .

这个 .pck 文件是二进制的,通常以mime类型传递 application/octet-stream . 这个 .wasm 文件作为 application/wasm .

警告

交付WebAssembly模块 (.wasm )使用的MIME类型不是 application/wasm 可以阻止一些启动优化。

建议使用服务器端压缩来传递文件,特别是 .pck.wasm 文件,通常较大。Webassembly模块的压缩效果特别好,使用gzip压缩后,压缩量仅为原始大小的四分之一左右。

出口选择权

如果可运行的Web导出模板可用,则在 停止场景播放编辑过的场景 在编辑器中的按钮可以在默认浏览器中快速打开游戏进行测试。

如果路径指向 自定义HTML外壳 文件,将使用它而不是默认的HTML页。见 自定义Web导出HTML页 .

头部包括 附加到 <head> 生成的HTML页的元素。例如,这允许加载WebFonts和第三方Javascript API、包括CSS或运行Javascript代码。

从脚本调用javascript

在Web构建中, JavaScript 实现了singleton。它提供了一个名为 eval 它的工作原理与相同名称的javascript函数类似。它接受一个字符串作为参数,并以JavaScript代码的形式执行它。这允许以与集成到Godot中的脚本语言不可能的方式与浏览器交互。

func my_func():
    JavaScript.eval("alert('Calling JavaScript per GDScript!');")

最后一个javascript语句的值转换为gdscript值,并由返回 eval() 在某些情况下:

  • JavaScript number 作为gdscript返回 浮动

  • JavaScript boolean 作为gdscript返回 布尔

  • JavaScript string 作为gdscript返回

  • JavaScript ArrayBufferTypedArrayDataView 作为gdscript返回 PoolByteArray

func my_func2():
    var js_return = JavaScript.eval("var myNumber = 1; myNumber + 2;")
    print(js_return) # prints '3.0'

任何其他javascript值返回为 null .

HTML5导出模板可能在不支持单例的情况下生成。在HTML5以外的平台上调用 JavaScript.eval 也会回来 null . 单件的可用性可以通过 JavaScript feature tag ::

func my_func3():
    if OS.has_feature('JavaScript'):
        JavaScript.eval("""
            console.log('The JavaScript singleton is available')
        """)
    else:
        print("The JavaScript singleton is NOT available")

小技巧

gdscript的多行字符串,由3个引号包围 """ 如在 my_func3() 上面的内容对于保持JavaScript代码的可读性很有用。

这个 eval 方法还接受第二个可选的布尔参数,该参数指定是否在全局执行上下文中执行代码,默认为 false 要防止污染全局命名空间,请执行以下操作:

func my_func4():
    # execute in global execution context,
    # thus adding a new JavaScript global variable `MyGlobal`
    JavaScript.eval("var SomeGlobal = {};", true)