跳至正文

2 月:愚人节游戏测试、Zenkai、ISM 与资产++!

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

愚人节游戏测试、Zenkai 公布、全新资产格式、官方 VSCode 扩展、实例化静态网格体实体、性能提升、沙盒更新等丰富内容!

欢迎阅读我们上个月最新更新的汇总!

愚人节狂欢游戏测试​

愚人节狂欢游戏测试横幅

我们很自豪地宣布下一个活动——nanos world 愚人节狂欢游戏测试!

主题为:恶搞、滑稽与玩乐!

从 4 月 1 日 至 4 月 5 日,nanos world 将再度开放游戏测试。我们将汇聚社区玩家,共同体验大家制作的各种搞笑 游戏模式、工具 和 实体!

如果你是开发者,只需为本次活动创建自己的游戏模式,或为沙盒制作工具与实体,即可获取专属的愚人节勋章!将包含工具/实体的包发布到资源库,以便在沙盒服务器中加载!

在 4 月 5 日,我们将以盛大最终游戏测试环节收尾,不仅会体验创作的各种游戏模式,还将带来包含大家所有工具/实体的沙盒大游戏测试!

届时不见不散 🤡

Zenkai:全新忍者 RP 服务器​

我们非常荣幸地宣布,nanos world 成为了 Zenkai 的家园!这是一个全新的忍者 RP 服务器,正由一支才华横溢的顶尖团队全力开发!

Zenkai 是受漫画世界观启发、极具野心的忍者角色扮演服务器。游戏以角色扮演为核心:玩家将扮演一名角色(更准确地说是忍者),在工作人员引导的故事线中体验忍者的生活。玩家可以晋升阶级、参与学院角色扮演、执行各种任务,并在战争期间保卫自己的村庄。

游戏中还存在由各村庄领袖的协议与决议所塑造的政治局势。你的目标是成为最强大的忍者,但最重要的是在其中享受乐趣,创造令人难忘的角色扮演时刻

—— Zenkai 团队

前往他们的 X 页面观看公布预告片:

我有幸参与了他们的内部测试,不得不说这个项目看起来棒极了!它拥有大量自定义资产、自定义系统和机制,前景非常值得期待!你绝对应该去了解一下,并加入他们的 Discord 社区!

全新反馈与漏洞中心​

我们正在从 GitHub Issues 和 Canny 迁移至这个全新的 反馈与漏洞中心 工具!

它将用于统一处理漏洞和反馈建议!由于 Canny 更改了定价方案导致我们无法继续使用,我们找到了这款非常契合需求的替代工具,并决定将漏洞报告也集中到这里!

一如既往,如果你有建议或发现了漏洞,请通过该平台向我们反馈! 😅

资产包多文件夹​

以往资产包存在的一个痛点,它们仅支持单个 Unreal 文件夹。因此,如果你创建的资产包含多个 Unreal 文件夹,就必须创建多个资产包,非常繁琐。更不用提逐个上传到资源库有多折磨了。

我们正在更改资产包的格式,以支持在单个包中包含多个 Unreal 文件夹。这样一来,即使你的整个项目包含多个 Unreal 文件夹,也只需创建一个资产包即可。

这是对 Assets.toml 格式以及内部资产挂载方式进行的微小技术调整。此前该文件包含一个 unreal_folder 字段,用于指定 nanos world 挂载资产的文件夹;现在改为 unreal_folders 字段,接受一个文件夹数组,方便指定多个挂载目录。

现在,你需要将虚幻项目烘焙后的 Content/ 目录下的所有文件夹原样复制,并在 Assets.toml 的 unreal_folders 字段中指定它们:

Assets.toml
# 虚幻引擎配置
[unreal]
unreal_folders = [
"GoodSFX",
"AwesomeProps",
"MyCustomWeapons"
]
# 虚幻引擎版本 - 这个资产包被编译的虚幻版本
unreal_version = "5.7.3"
# 这个资产包是否以插件内容创建
is_plugin_content = false

实际示例:​

如果你的资产位于 YourUnrealProject/Content/PolygonHouses/Props/SM_MyMesh,过去需要创建包含 unreal_folder = "PolygonHouses" 的资产包,资产引用配置为 SM_MyMesh = "Props/SM_MyMesh",资产包目录结构如下:

nanos-world-server/Assets/
my-asset-pack/
├── Props/
│ ├── SM_MyMesh.uasset
│ └── ...
└── Assets.toml

在全新格式下,同一个资产包将配置为 unreal_folders = [ "PolygonHouses" ],资产引用改为 SM_MyMesh = "PolygonHouses/Props/SM_MyMesh",目录结构如下:

nanos-world-server/Assets/
my-asset-pack/
├── PolygonHouses/
│ └── Props/
│ ├── SM_MyMesh.uasset
│ └── ...
└── Assets.toml

现有的资产包仍可继续使用,但会收到弃用警告,应当尽快更新至新格式。

这一调整解决了此前的问题,使得向资源库上传复杂资产包变得切实可行,同时也避免了弄乱 Assets 目录或资源库 UI。

VSCode 官方扩展​

Visual Studio Code 官方扩展

我们正式发布了 nanos world Lua VSCode 扩展!

该项目是 Derpius 工作的延续,他在前期开发中做出了非常出色的贡献。由于他精力有限无法继续维护,便同意将其移交至我们的官方 GitHub 仓库!

该扩展与我们的公开 API 仓库集成,可基于最新的 API 版本自动为 Lua Language Server 生成桩。为 nanos world 编写代码提供极为便捷的代码片段与自动补全!

欢迎查看项目仓库并提交拉取请求!

安装 nanos world Lua VSCode 扩展vscode:extension/go-horse-studios.nanos-world

脚本与 API​

新类:InstancedStaticMesh​

由 Olivato 使用实例化静态网格体生成的 Minecraft 世界

隆重介绍……全新的 InstancedStaticMesh 类!

这个新类允许你通过单个实体生成并管理同一静态网格体的多个实例。当你需要生成大量相同的网格体时,能大幅提升性能并降低内存占用!

查看文档以了解更多信息及使用示例:

InstancedStaticMeshscripting-reference/classes/instancedstaticmesh

新增及改进的方法​

我们这个月实现了一系列全新的脚本方法:

新方法​

改进的方法​

持久化数据键支持通过 . 进行分隔。​

现在 Package.SetPersistentData() 支持传入以 . 分隔的键。

这允许直接覆盖现有表值中的子属性,例如:

-- 定义我的数据
local MyPersistentData = {
MyChild = 1,
MyAnotherData = {
Stuff = "Something",
MoreStuff = "Something else"
}
}

-- 设置初始数据
Package.SetPersistentData("MyPersistentData", MyPersistentData)

-- 然后你可以直接修改 MyPersistentData.MyAnotherData.Stuff
-- 无需每次都提交/编辑整个表
Package.SetPersistentData("MyPersistentData.MyAnotherData.Stuff", "New thing")

数学​

Rotator Rotate/UnrotateVector() 破坏性更改​

我们发现 Rotator:RotateVector()/Rotator:UnrotateVector() 方法存在颠倒的错误。

注意

由于我们修复了此问题,如果你在代码中使用了这些方法,将需要对代码进行相应修改!

新 Trace 类型​

为 Trace 的 TraceMode 添加了全新的返回值模式:ReturnItem。它会返回一个 Item 值,通常代表实例化图元的索引(例如来自实例化静态网格体)。当你想通过 Trace 判断击中了 InstancedStaticMesh 的具体哪一个实例时,该功能非常实用。

全新脚本防护​

由于包卸载时所有内容都在被清理,如果在包卸载过程中尝试生成实体,系统将直接抛出错误。此前这种操作会导致内部错误甚至崩溃,因为在该阶段生成的实体已无法再被妥善清理。

请在 Destroy 事件内部使用 Package.IsUnloading() 进行判断,以规避此类错误。

性能分析与调试​

网络统计信息,现已显示脚本事件网络占用及更详尽的性能分析列表

我们在性能分析列表和实体网络统计信息列表中添加了更丰富的信息。现在,实体生成(包含性能和网络占用)将被纳入分析,脚本事件拥有了专属行,性能分析列表中还展示了更多虚幻引擎内部耗时。

ADK 内置 Forge 插件​

Steam 上的 nanos world ADK

如果你还不知道,我们已将最新版本的资产开发工具包(ADK)作为工具上传到了 Steam(你仍需单独下载虚幻引擎)。

而现在,由 NegativeName 制作的 Forge 插件已默认集成在 Steam 的 ADK 中,让你能比以往更轻松地将资产导入游戏中!针对 Forge 插件的各项更新,都会在每次 nanos world 更新时,自动推送到 Steam ADK 的 bleeding-edge 版本中。

Performance Improvements​

刻​

我们通过跳过无需 Tick 的实体,大幅提升了服务器和客户端的性能。

当实体拥有需要逐帧更新的逻辑(例如外力、位移、Kill Z、生命周期、触发器等)时就会产生 Tick。但许多实体并不需要逐帧更新,此前它们被无谓地执行了 Tick,导致生成大量实体时占用极高 CPU。

这个新系统会自动检测实体是否需要 Tick。若不需要,则直接跳过该实体的 Tick 执行,在生成成千上万个(不需要 Tick 的,如 StaticMesh)实体时,带来了巨大的性能飞跃。

压缩库​

我们将压缩库更换为了 zlib-ng,对文件和网络数据的压缩/解压速度最高提升可达 4 倍。

服务器可通过 compression 配置设置启用或禁用压缩,设置范围为 0-9,其中 0 代表不压缩,9 代表最大压缩(速度较慢)。默认值为 1(比 9 快约 10 倍,且已能提供相当可观的压缩比)。

压缩同时应用于脚本文件压缩与网络数据压缩。开启后将显著降低网络带宽占用,尤其是当项目中包含大量脚本文件时。

构造函数缓存系统​

我们实现了一套全新的内部构造函数缓存系统。现在,实体的构造数据会在修改前被持续缓存。通过避免在每次有玩家连接或切换维度时重复序列化/压缩所有实体,(大幅)降低了 CPU 占用。

此外,构造数据现在也会被压缩(在服务器启用压缩的情况下),从而极大减少了网络占用。

内存占用​

我们在内部对多个关键路径进行了重大重构,从脚本方法调用到网络序列化与调用,显著改善了游戏的内存占用。

我们大量精简了冗余使用的额外容器,并大幅改善了不必要的内存分配。

现在,调用脚本方法、执行异步方法以及设置实体属性值将消耗更少的内存和 CPU,从而提升服务器/游戏的整体性能和稳定性。

稳定性​

本月我们修复了几十个漏洞、崩溃问题以及潜在的脆弱性,进一步巩固了游戏的整体稳定性。

更多沙盒更新​

本周,我们已正式将沙盒更新推送至资源库以及官方沙盒服务器!欢迎大家前来游玩测试,寻找漏洞并提出改进!

车轮枪​

沙盒模式终于迎来了动态且可自定义的车轮!得益于我们近期对缆绳与物理的更新,车轮的运行效果非常出色!

车轮指尖陀螺

输入系统​

我们还实现了输入系统的初始版本。该系统允许将按键绑定至实体,从而通过敲击键盘按键来触发实体的相应动作!

车轮绑定输入

查看文档页面以了解更多信息:

沙盒实体输入系统explore/sandbox-game-mode/extra-features

持久化配置系统​

气球枪上下文菜单中的自定义配置,可自动实现持久化

我们实现了全新的持久化配置系统。工具可以利用该系统,保存玩家在调整工具枪时更改的配置。其原理是将修改后的配置写入磁盘,使得玩家下次进入沙盒时,能自动读取并应用上次的设置!

例如在 WheelGun 中,我们就通过该系统来加载和存储 start_activated 设置:

Client/WheelGun.lua
WheelGun.configs = {
...
start_activated = PersistentConfigSystem.GetConfig("WheelGun", "start_activated") or true,
...
}

...

{
label = "start activated",
type = "checkbox",
callback = function(value)
WheelGun.configs.start_activated = value
PersistentConfigSystem.SaveConfig("WheelGun", "start_activated", value)
end,
value = function()
return WheelGun.configs.start_activated
end,
}

查看文档页面以了解更多信息:

沙盒持久化配置系统explore/sandbox-game-mode/extra-features

全新的呕吐枪​

我们还新增了一把呕吐枪(由 Veggie 枪与 Bouncy Ball 枪合并而来),现在可以通过一把枪以不同方式生成多种物品!

全新的呕吐枪

Steam 页面本地化​

我们抽出时间将Steam 页面翻译成了多种语言,包括法语、西班牙语、葡萄牙语以及德语!

如果你母语是未列出的其他语言,并乐意帮助我们将其翻译为更多语言,请随时联系我们!能将页面翻译成更多语言,让全球更多玩家无障碍了解游戏,我们将不胜荣幸!

Updated Dependencies​

  • 已将 CEF 升级至版本 145。
  • 已将 Sentry 升级至版本 1.7。

结语​

2 月是我们迄今为止产出最丰硕的月份之一。虽然这个月只有 3 周的工作时间,但我们依然完成了大量新功能、改进与修复!

最重磅的事件莫过于公布了 Zenkai——能够让这个项目在 nanos world 上运行,我们深感自豪,迫不及待想看到它正式上线的英姿!

改进后的刻、压缩以及构造函数缓存系统带来了巨大的性能飞跃。同时游戏整体稳定性也得到了极大提升,崩溃和漏洞更少了!服务器现在能够毫无压力地同时处理数千个实体,游戏运行流畅度达到了前所未有的高度!

资产包的重构使得向资源库创建和上传复杂资产包变得轻而易举,全新的 VSCode 扩展也让 nanos world 的代码编写更加得心应手!

我也非常期待看到大家利用新的 InstancedStaticMesh 类构建出怎样的惊艳作品,以及如何借助全新的工具与系统不断突破沙盒模式的极限。

最后,愚人节狂欢的倒计时已正式开启!赶快动手打造各种搞笑古怪的工具和游戏模式,为 4 月 1 日的到来做好准备吧。我迫不及待想看到大家的奇思妙想了!

我们下月再见,感谢大家成为这个了不起的社区的一员!没有你们,我们就无法取得今天的成就! ❤️

Ko-fiKo-fi