为Web导出¶
HTML5导出允许将godot引擎中制作的游戏发布到浏览器。这需要支持 WebAssembly 和 WebGL 在用户的浏览器中。
重要
使用浏览器集成开发人员控制台,通常使用 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 2 当 GLES3 已选择选项。
警告
不建议使用WebGL 2,因为它预期会在不更换的情况下从Godot中删除。
并非所有浏览器都支持WebGL 2。 Firefox 和 Chromium (Chrome、Opera)是最受支持的浏览器, Safari 和 Edge 不要工作。论 iOS 所有浏览器都基于WebKit(即Safari),因此它们也不会工作。
Godot的WebGL2渲染器与3D有问题,不再维护。
局限性¶
出于安全和隐私的原因,许多在本机平台上轻松工作的功能在Web平台上更加复杂。以下是将Godot游戏移植到Web时应注意的限制列表。
使用cookie进行数据持久化¶
用户必须 允许cookie (特别是indexeddb)如果 user://
需要文件系统。在玩游戏时 iframe
, third-party 还必须启用cookie。匿名/隐私浏览模式也会阻止持久性。
方法 OS.is_userfs_persistent()
可用于检查 user://
文件系统是持久的,但在某些情况下会给出误报。
全屏和鼠标捕获¶
浏览器不允许任意使用 进入全屏 . 同样的道理 捕获光标 . 相反,这些操作必须作为对JavaScript输入事件的响应发生。在godot中,这意味着从按下的输入事件回调(如 _input
或 _unhandled_input
. 查询 输入 singleton不够,相关的输入事件当前必须处于活动状态。
出于同样的原因,除非从有效的输入事件处理程序中启动引擎,否则全屏项目设置将不起作用。这需要 customization of the HTML page .
HTTPClient and HTTPRequest¶
HTTP类在HTML5平台上有几个限制:
访问或更改
StreamPeer
不可能线程/阻塞模式不可用
每帧不能进行多次,因此循环中的轮询将冻结
无分块响应
无法禁用主机验证
已导出 .html
不能重复使用文件¶
导出时,在 生成的HTML文件 特别针对给定的导出选项。不得在进一步出口中重复使用。
启动启动启动未显示¶
默认的HTML页面在加载时不显示引导启动。但是,图像被导出为PNG文件,因此 custom HTML pages 可以显示。
未实现的功能¶
以下功能目前在HTML5平台上不可用:
螺纹
GDNative
C#
引擎和操作系统之间的剪贴板同步
小技巧
检查 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
ArrayBuffer
,TypedArray
和DataView
作为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)