为专用服务器导出
如果要在没有 GPU 或显示服务器的计算机上为项目运行专用服务器, 则需要使用 Godot 的服务器版本.
平台支持
Linux: 下载官方Linux 服务器二进制文件. 要从源码编译服务器二进制文件, 请遵循 为 X11 平台编译(Linux、*BSD 操作系统) 中的说明.
macOS : 从源代码编译macOS 的服务器二进制文件.
Windows: 目前还没有运行在Windows平台下的专用服务器版本. 可以使用
--no-window
命令行参数来防止Godot创建窗口. 请注意, 即使使用了--no-window
, 还是需要OpenGL支持.
如果项目使用C#, 那么就必须使用带有Mono的服务器.
“无头”与“服务器”二进制文件的比较
在 服务器下载页面 提供了两种不同的可执行文件.
Server(服务器):不包含编辑器的功能,体积更小、优化更高,是在服务器平台下的最佳选择。
Headless(无头):包含编辑器功能的可执行文件,目的是用来导出项目。该可执行文件可以用来运行专用服务,但是因为其体积较大、优化程度较低,所以不建议将其作为专用服务器使用。
导出 PCK 文件
有两种方法可以导出服务项目:
创建Linux/X11导出预设, 并为Release(custom_template/release)选定指向服务器的可执行文件, 然后照往常一样导出项目即可.
只导出PCK文件, 建议从Linux/X11导出预设设定中导出.
这两种方法的输出结果应该是相同的. 下文介绍了PCK文件的方法.
一旦下载好一个服务器二进制文件, 你应当导出包含项目-数据的PCK文件. 创建导出预设后, 点击导出对话框底部的 Export PCK/ZIP , 然后选择一个目标路径. 文件对话框的 Export With Debug 检查框不会对最终的PCK文件造成影响, 所以可以让它保持原样.
详见 导出项目 .
备注
如果你要从无头编辑器中导出项目,那么在项目文件夹中使用 --export-pack 选项调用无头编辑器,就可以只导出一个 PCK 文件。
备注
PCK文件会包含如材质, 声音等服务器通常不需要的资源, 因此PCK文件会比可能的要大. 未来的Godot版本计划加入对去除PCK文件中服务器不需要资源的支持.
从好的方面, 这允许客户端和专用服务构建使用同一个PCK文件. 如果你想发布一个既可用于客户端又可用于专用服务的单一存档文件, 可能很有用.
准备服务分布
下载或编译服务器二进制文件后,应将其放在与你导出的 PCK 文件相同的文件夹中。服务器二进制文件的名称应该与 PCK 文件相同(不包括扩展名)。这可以让 Godot 自动检测使用 PCK 文件。如果你想用不同名字的 PCK 启动服务器,你可以使用 --main-pack
命令行参数指定 PCK 文件的路径:
./godot-server --main-pack my_project.pck
启动专用服务
如果你的客户端和服务都是同一个 Godot 项目的一部分,你必须添加一个使用命令行参数直接启动服务的方法。这可以通过在你的主场景(或单例)的 _ready()
方法中添加以下代码片段来实现:
if "--server" in OS.get_cmdline_args():
# Run your server startup code here...
# Using this check, you can start a dedicated server by running
# a Godot binary (headless or not) with the `--server` command-line argument.
pass
另外,你也可以让专用服务在检测到无头或服务器二进制时总是启动:
# Note: Feature tags are case-sensitive! It's "Server", not "server".
if OS.has_feature("Server"):
# Run your server startup code here...
# Note that using this check may break unit testing scripts when
# running them with headless or server binaries.
pass
如果你的客户端和服务器是独立的Godot项目, 服务器通常应该配置成运行主场景时自启服务的方式.
下一步
在Linux上, 为了让你的专用服务在崩溃或系统重启后重新启动, 你可以 创建一个系统服务 . 这也可以更方便的查看服务器日志, 系统提供的日志自动轮询功能.
如果你有容器的经验, 可以考虑将专用服务器包装在一个 Docker 容器中. 这样, 在弹性配置中可以更容易地使用它(这不在本教程的范围内).