我想要的另一件事是自动获取内部版本号。有多种方法可以做到这一点,但我所做的是在项目设置中创建自己的条目,以便我可以通过使用
ProjectSettings.get_setting("application/config/build_number").
为了在 Python 中执行相同的操作,我会遍历文件的每一行,检查是否在其中找到“config/version”,并获取值。
# If you have a better way of parsing the file, tell me!
with open(file, 'r', encoding='UTF-8') as f:
for line in f:
if 'config/version' in line:
number = line.strip().split("config/version=", 1)[1]
number = number.replace('"', '')
return number
【上传】
下一步是上传到 Itch & Steam。
【Itch】
我从 Itch 开始,因为它似乎是最简单的。要上传到那里,您需要首先下载Butler。安装后,您可以使用登录butler login,然后就可以开始了!
上传命令非常简单:
butler push directory user/game:channel --userversion x.x.0
对我来说:
butler push build/colorspace_buildnumber_itch.zip mreliptik/colorspace:windows --userversion buildnumber
在我的例子中,频道是 Windows 或 Linux。
基本上就是这样!它非常简单,而且因为它需要的设置非常少,所以您可以一直使用它,即使是在游戏堵塞时也是如此。
【Steam】
啊啊Steam,为什么你总是要这么复杂?我们喜欢你,但你已经对我们生产的所有产品打了 30% 的折扣,而且你还想要我们的时间?你这个小混蛋!
说实话,一旦你了解了它是如何工作的,事情并没有那么复杂。只是比Itch更复杂一点。
您需要steam_cmd,它位于steamworks sdk > 工具 > ContentBuilder 内。
找到该文件夹后,您将看到:
三个构建器文件夹,分别对应于 Windows、Mac 和 Linux 的构建可执行文件。
Content,对应于将要构建的内容。
Output,这是构建的结果(如果适用)。
scripts 是您放置定义构建应如何运行的不同脚本的位置。
如果需要,您可以将构建器路径放入环境变量中,或者使用可执行文件的完整路径。
我在 Content 旁边创建两个文件夹ContentWindows和ContentLinux,并在构建时使用它们来分隔内容。这是为了简化以后的脚本。我知道我将能够在该特定内容文件夹中构建所有文件,并且不必为不同的仓库过滤文件。
【脚本】
我们需要设置脚本,幸运的是,Valve 提供了默认脚本作为示例。您可以在脚本文件夹下找到它们,或者在GitHub 上的示例文件夹下找到它们。
您的应用程序有一个脚本,它告诉 Steam 您要为哪个软件仓库构建,并且每个软件仓库一个脚本。在我的示例中,您可以看到我有两个软件仓库脚本,因为我有两个软件仓库要构建:linux 和 windows。
在应用程序脚本中,您只需填写应用程序 ID、描述(如果需要),并在 depot 下为每个 depot 添加一行,以及您的 depot 编号和关联的 depot 脚本。
"AppBuild"
{
"AppID" "APP_ID" // Your AppID
"Desc" "Automatic build" // internal description for this build
"Preview" "0"
"ContentRoot" "" // content root folder relative to this script file
"BuildOutput" "..\output" // output folder relative to this script file
"Depots"
{
// file mapping instructions for each depot are in separate script files
"DEPOT_NUMBER_1" "depot_build_DEPOT_NUMBER_1.vdf"
"DEPOT_NUMBER_1" "depot_build_DEPOT_NUMBER_2.vdf"
}
}
然后,您为每个软件仓库创建一个脚本。您添加您的软件仓库 ID 和您创建的内容文件夹。该路径是相对于脚本的。在FileMapping下,我没有执行任何特殊操作,因为我想上传文件夹中的所有文件。下面是一个例子:
"DepotBuild"
{
// Set your assigned depot ID here
"DepotID" "DEPOT_NUMBER_1"
// Setup specific content folder for depot
// I have one content folder per depot number, one for linux, one for windows
"ContentRoot" "..\YOUR_CONTENT_FOLDER"
// include all files recursively
"FileMapping"
{
// This can be a full path, or a path relative to ContentRoot
"LocalPath" "*"
// This is a path relative to the install folder of your game
"DepotPath" "."
// If LocalPath contains wildcards, setting this means that all
// matching files within subdirectories of LocalPath will also
// be included.
"Recursive" "1"
}
}
【命令】
获得脚本后,您最终可以调用 steam_cmd 来上传内容。但首先,您应该手动运行该命令,因为 Steam 会要求您提供 steamguard 代码。
steamcmd +login STEAM_USERNAME STEAM_PASSWORD, +run_app_build_http APP_SCRIPT_PATH +quit
我的 python 脚本只是压缩构建,将它们移动到两个内容文件夹(linux 和 windows),上传到 steam,然后删除 zip。不过,您不必压缩它们,这就是我在构建过程中所做的。
最后的话
我希望这向您展示了构建和上传到 itch 和 steam 是非常容易的。当然,我编写的脚本适合我的需要,因此您必须根据自己的喜好进行调整。
我相信使用 python 非常容易,因为它非常接近 GDScript。
您还可以扩展功能以支持其他商店,甚至使用 github action 为您构建游戏。
对于一个客户项目,我在 GitHub 上设置了自动上传和发布创建,这很容易使用他们的命令行程序来完成。
这也就意味着,如果以 C++ 写的引擎代码,可以直接编译到网页端运行,以 JS 作为胶水来粘合。这就形成了网页端游戏的第二大类实现,我们说它是基于 WebAssembly 的,把游戏引擎搬到了网页中,例如 Unity、Godot 等。这里的引擎有 WebGL 的部分,也有其他的(例如物理系统等等)。
【包的导出】
在 Godot 中导出到网页的操作是比较容易的,选择 Project -> Export,添加 HTML5 的导出模板即可。在添加之后,工具栏上也会出现一个按钮,点击之后可以直接在网页端预览效果,十分地方便。
打开导出的文件,主要会包含 index.html、index.pck、index.wasm,还有一些 js 的胶水文件。index.pck 是场景、素材、资源文件的打包,而 index.wasm 即是游戏的引擎文件。占据主要大小的是后两者。
【关于 pck 文件及优化】
一般来说,pck 文件中会包含场景(.tscn)、脚本(.gd),还有资源(.jpg, .ttf)等。代码和场景都还好,一般占大头的是图片等资源。对于特别大的图片,可以选中图片资源、双击,切换到 Import 选项卡,在 Compression 的模式中选择 Lossy(有损):
更多的导入选项可以参考文档
https://docs.godotengine.org/en/stable/getting_started/workflow/assets/importing_images.html
【关于 wasm 文件及优化】
默认导出的 wasm 大概有 18M 左右(可能随版本会有差异),里面包含了整个引擎的所有功能。换句话说,哪怕只是做了一个空的项目,导出的 wasm 也是一样的,因为 wasm 就相当于一个 exe 执行文件。其实并非所有的引擎功能都是需要的,例如只是做个 2D 游戏的话,3D 部分的代码就不需要了。
Godot 提供了通用模板的方式,允许使用者按照他自己的实际情况来开/关某些模块。也就是说,你可以通过重新编译源代码的方式,来生成你自己专属的 wasm。官方文档其实写的很详细了,但是第一次看还是会蛮头大的,这里面其实还是有很多潜在坑的。
如果想要自己定制引擎,首先需要在 github 上克隆最新的仓库代码,并且切换到指定的分支。
#Get Godot repogit clone https://github.com/godotengine/godot.gitcd godot# List remote branch and checkout one of them (e.g. 3.4)git branch -rgit checkout 3.4
然后参考这个教程 https://docs.godotengine.org/en/stable/development/compiling/compiling_for_web.html,按照顺序按照 Emscripten 、Python 和 Scons。
安装 Emscripten 的时候参考官网通过代码来安装,只需要执行:
# Get the emsdk repo
git clone https
://github.com/emscripten-core/emsdk.git# Enter that directory
cd emsdk
# Download and install the latest SDK tools.
python emsdk
.
py install latest
# Make the "latest" SDK "active" for the current user. (writes .emscripten file)
python emsdk
.
py activate latest
# Activate PATH and other environment variables in the current terminal
source
./emsdk_env.sh
默认的 Emscripten 安装脚本有点问题,尤其是在先前已经安装过 python 的情况下,这里根据自己的情况改,然后使用 pip install scons 安装 scons
然后就可以按照之前的文档去进行构建了,可以先运行 scons platform=list 查看有哪些打包环境可用。(对于导出到网页端来说,如果不安装 emsdk,就无法进行到下一步)
最简单的,可以用 scons platform=javascript tools=no target=release 来打包一个 Release 环境的包。
那么,如何针对性的选择要开启/关闭哪些功能呢,可以参考文档上的说明,但更快的方式是,使用一个 custom.py 模板。进入到下面这个页面 https://godot-build-options-generator.github.io/ ,在左侧勾选你需要或者不需要的模块,就可以在右侧生成一个 python 文件:
把这个文件丢到引擎的源代码根目录,再运行 scons 的时候,就能够识别到了。它会在 bin 目录下生成一个 zip 文件。这个文件需要放置到导出窗口下的 Custom Template,如下图所示,在每次导出前配置即可。
使用的定制模板导出的文件大小,就会在把 3d 模块、视频播放等一些不必要模块去掉以后,生成的 wasm 大小可以压缩到 10M 以内,优化了一半大小。(这里需要注意的是,如果开启了图片有损压缩,那就需要把 webP 功能打开,不然会 error)
进一步优化
同时,如果在服务端能够开启 gzip 压缩,则能够进一步地减小包传送的大小,经过测试,10M 左右的包在开启压缩以后,只传送了 2.8M 的数据,只有原来的 1/3 大小了,如下:
小结
以上便是,在用 Godot 引擎导出到网页端的一些具体的实践。通过上面的操作,可以显著降低导出包的大小,希望能对你有所帮助。
Godot游戏引擎开发的多关卡地图平台闯关游戏实例视频教程,并生成发布Android安卓端、IOS苹果端、iPhone手机端、H5移动端、Google Play Store 游戏平台上,完整丰富的多关卡闯关游戏实例教程,玩家状态机、开门、推箱子、多种陷阱、机关按钮、屏幕UI、移动控制操纵杆等等,强烈推荐必学!感谢 爱丽丝的梦境Official 辛苦翻译和搬运,感谢原作者的付出。