跳至正文

10 月:游戏测试与大型 API 重构!

· 7 分钟读完
Gabriel • SyedMuhammad
lead developer™

万圣节游戏测试、大规模 API 重构及更多!

万圣节游戏测试​

本月我们举办了一年一度的万圣节 🎃 活动!一如既往,这一直是 nanos world 巨大发展的时刻!我要感谢所有参与游玩的人,以及参与为本次活动创建内容和游戏模式的测试者!

今年我们注册的游戏测试者比去年多 4 倍,并且我们创下了多项同时在线玩家记录。最棒的是,游戏服务器轻松处理了所有玩家 🙏!(除了资源库,我们不得不在活动期间提高下载限制 😜)。

由于活动,我们暂停了更新两周,只专注于漏洞修正和改进。我们推送了 10 多个小补丁,包含我们在活动前发现的许多漏洞修复和改进,以保证其稳定性!

载具改进​

我对载具类进行了几项改进,允许对其进行更大的自定义。

新的默认载具​

我们为默认的 nanos world 载具包添加了一个新的载具包。其中 4 个来自免费市场包(与我们之前的是同一创作者),越野车来自 Epic Games。

动画蓝图​

我添加了在载具上加载自定义动画蓝图的可能性,允许拥有自定义悬挂动画,就像这个新越野车的动画一样:

动态光源纹理​

现在可以使用自定义材质参数配置你的载具,动态打开或关闭其光源。你可以在此处找到有关如何配置载具材质的更多信息。

新的细微音效​

此外,我为载具添加了新的自定义音效,例如拉手刹或车轮刹车尖叫,增加了真实感和沉浸感。

资源库文本 HTML 解析器​

之前,由于资源库物品描述和更新日志是用 HTML 生成的,我们使用 CEF 浏览器(WebUI)渲染它们,但这太过头了,而且与 UI 的其余部分相当脱节。

因此我决定实现一个自定义 HTML 解析器,将 HTML 转换为适当的虚幻引擎富文本,然后拥有描述和更新日志的原生渲染器,使一切再次变得漂亮。

原生 JSON 解析器​

我正在将我们当前内置的 JSON 库迁移到更高效的原生 JSON 解析器。使用这个新解析器,我们在解析 JSON 字符串时达到了 10 倍的速度!所有方法将保持不变,只是实现会改变。

基准比较:(9.5 MB JSON 文件)
基准 'Lua JSON 解析器'(x10)耗时 9964ms。
基准 '原生 JSON 解析器'(x10)耗时 1057ms。

Kill Z​

我实现了一个内置的 Kill Z 系统。这是一个在实体达到太低高度时自动销毁实体的系统,防止一些如数值溢出等问题。

目前 Kill Z 偏移量是硬编码用于测试的。

大规模 API 重构​

这次重构更新将在未来更新中到来,尚未完全完成,但我想提前说明一些计划中的更改。我们知道重构通常伴随着一些破坏性更改,但这次我正在更加努力地使此更新具有零破坏性更改,在你更新包之前保持向后兼容性。

如果你有更多关于重大更改的想法(例如为保持标准而重命名方法),请告诉我们,以便我们将其包含在这个大更新中!

包兼容性​

我将在 Package.toml 中引入一个新的“兼容性版本”设置,你可以在其中配置与该包兼容的游戏当前版本,如果游戏更新并且你的包使用的任何方法被修改,它将继续以“兼容模式”工作(带有弃用警报)。

这与通常的“弃用警告”不同,因为现在在方法签名改变的情况下,包不会停止工作(就像今天发生的那样),并且旧的实现/接口仍将在内部存在。

事件​

目前事件的工作方式只是订阅并在本地或远程调用它们,但如果我们只想在特定侧接收它们,我们无法严格限制。一个新的补充将是仅远程事件的订阅:

Events.SubscribeRemote()

这样只有在另一端使用 Events.CallRemote() 调用的事件才会触发它。并且使用 Events.Subscribe() 订阅的事件也将不再接收远程事件。

模块​

模块(Lua 外部二进制文件)将被改造成为一种包类型。这样它们可以轻松共享并被其他包使用,包括通过资源库。

配置文件​

现在不同的包类型将有不同的配置文件格式(toml)。

例如,loading-screen 包配置目前包含许多它不使用的配置(依赖项、资产、Lua 设置等)。我想为每种包(模块、加载屏幕、游戏模式、库和脚本)拥有特定的配置文件,因为它们也将在内部以不同方式加载。

服务器、包和资产图像​

我正在移除配置 .toml 文件中的 image URL 设置,取而代之的是图像应放在 .toml 旁边,名称为 Package.jpg、Assets.jpg 或 Server.jpg。这将避免客户端访问危险或不良外部 URL 的一些问题。

多个构造函数​

将包含的一个功能是支持多个构造函数,一个很好的例子是 Sound 类,它有多个参数取决于声音是 2D 还是 3D:

-- 当前构造函数
Sound(location, asset, is_2D_sound, auto_destroy, sound_type, volume, pitch, inner_radius, falloff_distance, attenuation_function, keep_playig_when_silent, loop_mode)

-- 新 2D 声音构造函数
Sound(asset, auto_destroy, sound_type, volume, pitch, loop_mode)

-- 新 3D 声音构造函数
Sound(location, asset, auto_destroy, sound_type, volume, pitch, inner_radius, falloff_distance, attenuation_function, keep_playig_when_silent, loop_mode)

这样你只需选择正确的构造函数即可生成 2D 或 3D 声音!

静态类重命名​

这将是一个重大的组织变革!随着每次新更新,我们的一些静态类开始积累大量方法,其中许多彼此不相关。

考虑到这一点,我们将把一些静态类拆分为新的静态类,旨在最佳组织,尤其是轻松搜索和理解脚本 API 函数,下面列出的一些方法可能会被重命名以减少冗余(例如改为 Chat.SendMessage)。

我们将有几个新的静态类,仅举几例:

Chat、Console、Trace、Navigation、Debug、Viewport、Steam、Discord 等。

完整的所有更改列表将在更新发布时列出。所有这些更改,包括其事件,都将被警告为已弃用。

类重命名​

一些类也将为了更好的标准化而重命名。例如 Character 和 Vehicle 可以变成 CharacterMannequin 和 VehicleWheeled,这允许其他类型的新类,例如 VehicleWater 或 CharacterGeneric。

结语​

这是修复、改进和重新思考整个 API 的一个月,重构始终是一个挑战,因为我需要保持一切正常工作,同时还要重新安排其新接口,我不想仓促进行此更改。

我现在的主要目标是完成 API 重构的组织(请给我关于本博客中提到的更改的反馈!)。一旦这个完成,我会更自如地向其中添加新内容和类,我有很多新功能正在并行开发,尚未公布,其中一些来自你们在 Canny 上的建议(咳咳 投票! 咳咳)。

游戏测试的结果太棒了!我们几乎没有崩溃,服务器很好地处理了大量玩家!

我相信这些即将到来的改进,包括一些未宣布的改进,将把 nanos world 提升到另一个健壮性水平!

最后,感谢所有的支持!!下次见!