跳至正文

5 月:FSR、全新事件格式、新表单与 UI++!

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

FSR 集成、全新事件格式、全新原生空间查询方法、项目与助手的新表单、UI 改进以及更多精彩内容!

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

全新宣传短片视频!​

本月初,我们发布了一段全新的宣传短片视频,展示了在 nanos world 中已经创建的数个服务器和游戏模式!如果你还没看过,快去一睹为快吧!

nanos world 游戏玩法宣传短片 #1(YouTube)
提示

直接在 YouTube 上观看最佳画质!

如果可以的话,也请在我们的社交媒体上帮我们分享、点赞和订阅! 💙

全新注册表单!​

为了帮助我们的社区成长并支持你们正在构建的所有项目,我们刚刚创建了两个新表单!我们的版主会仔细分析你们提交的内容! 🙏

项目注册​

如果你正在开发一个项目,并且需要为你的团队或玩家争取访问权限,请使用这个新表单向我们正式注册你的项目,并为你的开发团队申请开发者密钥,或者为你的社区测试申请玩家密钥。

备注

请注意,如果你目前仍然没有游戏访问权限,此表单并不能免除你登记常规测试者表单的必要。

📝 项目注册表单https://tally.so/r/lbVqvp

助手与版主​

如果你热爱帮助他人、喜欢保持聊天氛围友好,并想在服务器中扮演更活跃的角色,我们正在寻找敬业的助手来帮助我们 Discord 中的成员,并有可能进一步成为版主!

我们正在逐步扩大我们的助手团队,以便为每个人提供更好的支持和更友好的环境,所以如果你认为自己很合适,请提交申请! 🙏

🤝 助手与版主表单https://tally.so/r/44PBy5

账户 Discord 关联​

我们刚刚将 Discord 集成到了我们的账户系统中!

你现在可以直接在个人资料页面绑定你的 Discord 账户。如果你获得了游戏访问权限,你可以领取你的 @tester 或 @playtester Discord 身份组,以获得我们测试者专属频道的访问权限!

👤 关联你的 Discord 账户https://nanos-world.com/account/profile

FSR 集成与画面超分​

本月,我们将最新的 AMD FidelityFX™ 技术插件集成到了 nanos world 中!

它允许非 NVIDIA 用户在游戏中原生使用 FSR 帧生成、超分辨率和 Anti-Lag 等技术。你可以在改进后的视频设置区域启用这些功能:

全新的超分与帧生成设置区域
提示

请注意,FSR 适用于所有 GPU 品牌,不仅仅是 AMD!

DLSS 更新​

在 NVIDIA 方面,我们已将 DLSS 插件更新至最新的 8.6 版本,这带来了 DLSS 4.5,目前在支持的 NVIDIA GPU 上可提供高达 6X 帧生成的功能。

全新事件格式​

根据上个月我们在 Discord 上的讨论结果,并为了让脚本开发者能够更安全地控制性能,我们为 Events 和 Base Entity 实现了一种全新的 Call/BroadcastRemote 格式!

可靠性参数​

现在所有 Call/BroadcastRemote 方法都将拥有一个全新的参数 reliability(可靠性)。

你现在可以选择将其发送为 Reliability.Unreliable,用于可丢失的非关键消息;或者发送为 Reliability.Reliable,用于必须接收的重要消息,即我们到目前为止的默认行为。

提示

请注意,使用 Unreliable 的性能远高于 Reliable。因为发送方不需要为了防止丢失而对消息进行跟踪和重新传输,而接收方也不需要向发送方发回确认。在允许消息丢失的场景中,这可以显著降低延迟并提升性能。

这使你能够在不需要保证传达的场景下优化性能,例如声音、粒子或仅对游戏玩法非必需的视觉效果。

备注

请注意,这些更改需要你将包的兼容版本至少更新到 1.139。有关更多信息,请参阅文档页面公告。

半径内发送​

另一个新增功能是用于向指定 location 周围特定 radius 内的玩家广播远程事件的新方法。

提示

这比在 Lua 中遍历所有玩家来构建玩家列表要高效得多,因为我们在 C++ 内部进行了高效计算,并且只将事件发送给实际在半径范围内的玩家。

脚本改进​

半径内查询​

伴随着新的 BroadcastRemoteInRadius 方法,我们还添加了在指定位置周围特定半径内查询玩家和 Actor 的新方法(这也比在 Lua 中遍历所有实体高效得多):

新方法​

本月添加的其他新方法:

提高维度限制​

我们在内部重构了维度系统,以支持更多的维度索引。

以前它被限制在仅 65,535(16 位)个维度(这已经是一个非常高的数字了),但现在我们将其增加到了 4,294,967,295(32 位)个维度!

这样,在例如将玩家 ID 乘以某个值时,可以更轻松地进行每位玩家的独立计算。

UI 改进​

我们对用户界面进行了一些旨在提升使用体验的调整。

集成控制台​

现在,控制台直接集成到了主菜单和 Esc 菜单中!这使得它更容易被访问和使用,无需绑定按键或打开单独的窗口。

Esc 菜单中的集成控制台

现在,可以通过顶栏中全新的控制台按钮轻松访问它:

带有控制台按钮的顶栏

请注意,Console 的 Open/Close 事件将不再存在并已被移除。

全新隐藏 UI 快捷键​

我们添加了一个新的原生快捷键(默认为 Scroll Lock),允许你隐藏屏幕上的所有 UI。

这在禁用 UI 元素(如调试控件)以截取截图时非常有用。

个人资料账户标签页​

我们正在不断改进游戏内与账户和商店 API 的集成。

对于账户管理,我们在个人资料弹窗中添加了一个新标签页,以便你可以轻松地在游戏内修改你的用户名和电子邮件地址:

账户管理标签页

设置​

我们在设置菜单中进行了大量改进!

重启弹窗​

现在,当保存某些设置(如 WebUI、RHI 或帧生成)时,会出现一个弹窗,通知你需要重启游戏才能使更改生效。

更改设置时的重启弹窗

视频设置布局​

我们还更改了视频设置菜单的布局,以支持为帧生成和超分辨率进行独立配置,使用户更容易理解和配置这些设置:

全新的视频设置布局

我们还改进了分辨率列表,修复了宽屏宽高比未在列表中显示的问题!

维护重做​

我们在内部完全重做了设置中的维护标签页,提高了清理旧缓存数据时的性能和稳定性。

如果你还没有用过,该标签页可以允许你清理日志、已下载的包、崩溃文件等随着时间推移不断累积并占用磁盘空间的缓存数据。

维护标签页

游戏内麦克风测试​

我们在音频设置中添加了一个全新的麦克风测试按钮,允许你在游戏内测试并聆听自己的麦克风输入,听到它在其他玩家听起来的真实效果:

麦克风测试按钮
备注

请注意,目前此功能仅在游戏内连接到服务器时可用。

其他改进​

全新 clear 服务器控制台命令​

我们添加了一个全新的 clear 控制台命令,允许你清空控制台的输出内容。

自动清理 CEF 缓存​

现在,在每次 CEF 更新时,游戏都会自动清除旧的 CEF 缓存数据,以防止与旧版本 CEF 缓存数据相关的异常和崩溃。

兼容版本警告​

为了防止日志刷屏,兼容版本警告现在只会在第一次出现时显示一次。

结语​

对于底层优化和体验升级来说,五月是一个极其重要的月份。让脚本开发者能够对网络可靠性拥有更多控制权,并将我们的内部系统推向性能极限,这正是我们所追求的技术基石!

我正在不断努力改进我们的工作流程,而扩大我们的 Discord 工作人员是保持我们社区健康和发展的最重要事情之一。所以,如果你认为自己能提供帮助,请申请成为助手或版主! 🙏

特别感谢所有通过 Crowdin 贡献翻译的人,你们让世界各地的玩家都能更轻松地接触这款游戏;同时也要感谢那些通过 Ko-fi 支持开发的人。

正是有了你们的支持,我才能继续全职投入到 nanos world 的工作中,并不断推动项目向前发展。 💙

下一次更新再见! 🚀

Ko-fiKo-fi

4 月:Tracy 分析器、本地化、同步与性能++!

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

Tracy 分析器、游戏本地化、更好的同步、性能提升以及更多精彩内容!

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

集成 Tracy 性能分析器​

Tracy 帧概览

我们集成了一个强大的新工具来帮助你分析服务器端的性能:Tracy。你现在可以直接将 Tracy 连接到你的服务器,并获得其性能的详细概览,包括 Lua 调用、计时器、事件、网络消息、加载时间等等!

这可以让你更好地了解服务器的性能,识别真正的瓶颈,并更高效地优化你的脚本和系统。

通过将鼠标悬停在时间线上的任何条上,你可以精确地检查当时是什么在消耗时间,包括关于 Lua 调用、计时器和回调函数的详细信息:

悬停时的 Tracy 详细视图

要使用 Tracy,请使用以下方法之一启动服务器:

./NanosWorldServerTracy.exe

然后使用 Tracy 性能分析器客户端进行连接。

欲知更多信息,请查看全新的性能分析指南:

性能分析指南core-concepts/scripting/profiling

本地化​

游戏本地化​

日语版主菜单

我们很高兴地宣布,nanos world 现在支持游戏内本地化了!你现在可以通过 设置 → 常规 来更改游戏语言。

语言设置

所有翻译均已开源,并可在 Crowdin 上查看。如果你想帮助将游戏翻译成你的语言,欢迎加入该项目并做出贡献!

我们目前支持以下语言:

语言已翻译已校对
德语de 翻译de 校对
西班牙语es-ES 翻译es-ES 校对
芬兰语fi 翻译fi 校对
法语fr 翻译fr 校对
意大利语it 翻译it 校对
日语ja 翻译ja 校对
葡萄牙语(巴西)pt-BR 翻译pt-BR 校对
俄语ru 翻译ru 校对
土耳其语tr 翻译tr 校对
简体中文zh-Hans 翻译zh-Hans 校对

我们对中文、俄语、意大利语、日语和波兰语使用了 AI 生成的翻译,因此如果你是这些语言的母语使用者,我们将非常感激你能帮助校对这些翻译!如果你想成为任何语言的校对员,请告诉我们!

如果你想为其他任何语言做出贡献,我们也很乐意添加对其的支持。只需给我们发送消息即可!

伴随着这一功能,我们还开放了新的方法和事件,以便资源包创作者可以实现他们自己的本地化系统:Client.GetLanguage() 和 LanguageChange (Client)。

文档本地化​

除了游戏本身,我们的文档也是开源的,并可在 Crowdin 上查看。

我们还对所有 API 方法和事件描述实现了本地化支持。你现在可以在 Crowdin 上的 src/api/.generated/ 文件夹中找到它们,完全开放以供翻译贡献。

如果你想帮助将文档翻译成你的语言,请加入 Crowdin 文档项目并开始贡献!如果你想帮助一种新语言,只需给我们发送消息,以便我们将其添加到项目中。

加载屏幕改进​

我们实现了一个新系统,可以在本地缓存服务器的需求列表。这意味着如果你重新连接到一个你之前已经加入过且其需求没有发生变化的服务器,客户端将跳过重新下载,而是直接从本地缓存中加载它们。

这显著改善了大型服务器的加载时间,特别是在断开连接或被踢出后重连时。

我们还添加了几个新的加载步骤,以对连接过程中发生的事情提供更清晰的反馈,帮助玩家更好地理解加载的每个阶段。

此外,我们大幅提升了校验文件中步骤的性能,减少了拥有大量内容和需求的服务器的加载时间。

性能与优化​

网络​

我们通过引入一个新的内部系统,大幅提升了高玩家数量下的服务器性能,该系统会将所有待处理的网络消息打包在一起,并在每个服务器帧结束时统一刷新。这使我们能够优化消息排序并减少内部网络开销。

同样的优化也在客户端上实现,显著提高了内部网络 API 调用的性能。

另一个重大改进是我们处理瞬态同步数据(如语音通话、移动、旋转、速度和跳跃)的方式。这些更新现在被视为不可靠的,使其处理速度快了近 10 倍。

为了避免出现角色在视觉上“原地移动”等问题,我们还实现了一个客户端断连检测系统,当在一定时间内未收到更新时,该系统会自动停止角色移动。

API 事件​

我们通过在没有该事件的订阅者时完全跳过参数构建,为事件引入了另一个内部优化。

此前,即使没有人监听该事件,参数和中间表也总是会被复制和构建。现在,参数构建会被推迟,直到我们知道至少有一个订阅者为止。

这显著提升了频繁触发(但未被使用)的事件的性能。

缓存​

Server.SetValue​

现在,Server.SetValue() 同步的值在发送给正在加入的客户端之前,会自动进行缓存和压缩。

与玩家加入时通过 Events.CallRemote() 手动发送数据相比,这使得 Server.SetValue() 成为处理持久化同步数据时一个更高效的选择。

我们还为较大的 Server.SetValue() 有效载荷实现了一个分块系统,因为内部网络层有 512 KB 的最大数据包大小限制,这个新系统允许通过 Server.SetValue() 发送更大的数据而不会出现问题,它会自动将数据拆分为多个块并在客户端重新组装。

其他内部缓存​

我们为玩家、实体、角色和其他频繁访问的数据实现了几个新的内部缓存和查找列表。

这避免了重复的内部迭代,并提高了严重依赖这些集合的多个系统的性能。

API 方法调用​

我们还重构了几个内部 Lua API 调用,使它们明显更快、更高效,特别是对于没有参数或返回值的简单方法。

脚本改进​

延迟实体生成系统​

我们为实体实现了一个全新的延迟生成系统,允许你创建实体而不会立即在客户端上生成它们,直到你显式调用 Entity:FinishSpawn()。

这在创建后配置多个属性时非常有用,可以避免不必要的中间网络更新。

为此,我们向大多数实体构造函数添加了一个新的最后一个参数 defer_spawn,当将其设为 true 时,你必须在设置完该实体所需的所有值后调用 FinishSpawn(),才能在客户端上实际生成它。任何执行网络同步的 API 调用在完成该实体的生成之前都不会被传输。

使用示例:

Server/Index.lua
local mesh = "nanos-world::SK_Chicken"
local abp = "nanos-world::ABP_Chicken"

-- 将 'defer_spawn' 作为最后一个参数传为 'true' 给构造函数
local chicken = CharacterSimple(Vector(), Rotator(), mesh, abp, ColisionType.Auto, true, true)

-- 设置我们想要的一切
chicken:SetHealth(50)
chicken:SetMaxHealth(50)
chicken:SetAirControl(0.5)
chicken:SetJumpZVelocity(300)
chicken:SetGravityScale(0.5)
chicken:SetCapsuleSize(20, 20)
chicken:SetSpeedSettings(300, 150)
chicken:SetAIAvoidanceSettings(true, 30)
chicken:SetRotationSettings(Rotator(0, 500, 0), false, true)

-- 实际在客户端上生成它
chicken:FinishSpawn()

当使用继承类系统时,FinishSpawn() 会在离开继承类的构造函数后在内部自动调用,因此在这种情况下你无需手动调用它:

Server/Index.lua
function MyAK47:Constructor(loc, rot)
-- 将 'defer_spawn' 作为最后一个新的 Weapon 参数传为 'true'
self.Super:Constructor(loc, rot, "nanos-world::SK_AK47", CollisionType.Auto, true, true)

self:SetAmmoSettings(30, 1000)
self:SetDamage(30)
self:SetSpread(30)
self:SetRecoil(0.25)
self:SetBulletSettings(1, 30000, 30000, Color(100, 58, 0))
self:SetSightTransform(Vector(0, 0, -1), Rotator(-1.5, 0, 0))
self:SetLeftHandTransform(Vector(22, 0, 9), Rotator(0, 60, 90))
self:SetRightHandOffset(Vector(-10, 0, 0))
self:SetHandlingMode(HandlingMode.DoubleHandedWeapon)
self:SetCadence(0.1)
self:SetWallbangSettings(200, 0.75)

self:SetParticlesBulletTrail("nanos-world::P_Bullet_Trail")
self:SetSoundDry("nanos-world::A_Rifle_Dry")
self:SetAnimationCharacterFire("nanos-world::AM_Mannequin_Sight_Fire")
self:SetAnimationReload("nanos-world::AM_Mannequin_Reload_Rifle")
...

self:SetMagazineMesh("nanos-world::SM_AK47_Mag_Empty")
self:SetCrosshairMaterial("nanos-world::MI_Crosshair_Regular")

-- 这里不需要调用 FinishSpawn()
end

在优化性能和减少网络占用时,强烈建议使用延迟生成系统,因为最终的实体状态可以在单次压缩同步中发送,而不是进行多次更新。

弃用 VehicleWheeled 的 auto_create_physics 参数​

随着新延迟生成系统的引入,VehicleWheeled 的 auto_create_physics 参数已被弃用,因为现在可以在生成载具之前更高效地对其进行配置。

新方法与事件​

下面列出了与本月功能和改进相关的所有新方法和事件。

新方法​

新事件​

改进的 API​

  • 语音通话(例如 Player:SetVOIPGlobalChannelSetting())现在支持多达 63 个频道,而不是 31 个。
  • 大多数实体构造函数都获得了一个新的 defer_spawn 参数,以使用新的延迟生成工作流。

同步​

我们对 Actor 和角色的同步进行了多项改进,提升整体的一致性、稳定性和性能,同时修复了多个边缘情况下的同步问题。

主要的改进之一是增强了客户端的插值。强行对齐系统(当 Actor 距离其同步位置太远时将其传送)现在会根据 Actor 的速度进行动态调整,这使得快速移动的 Actor 突然发生对齐跳跃的可能性大大降低。

新的远距离修正系统​

由于使用 distance_optimization 优化的远距离 Actor 不会为遥远的玩家更新,我们实现了一个全新的远距离修正系统。

以前,远处的 Actor 只有在移动后才会再次更新。现在,客户端会跟踪哪些 Actor 被视为“睡眠”,并在玩家再次接近它们时自动向服务器请求更新的数据。

这确保了 Actor 在重新变得相关时始终拥有准确的位置和旋转。

新的水体浮力配置​

我们在地图的 Package.toml 中添加了一个新属性:enable_water_buoyancy。

使用虚幻的水体插件的地图现在如果打算在 Actor 上使用浮力组件,必须显式启用此选项。

这使得在不需要水模拟的地图上,Actor 可以跳过不必要的水体物理逻辑和 Pontoon 组件的创建。

欲知更多信息,请查看包指南:

地图 Package.tomlcore-concepts/packages/packages-guide

UI 改进​

我们在详细的帧时间调试信息中添加了一个新的 1% 最低帧 指标。该值显示过去一分钟内最慢的 1% 帧的平均帧率。

调试视图中新增的 1% 最低帧指标

在按下加入愿望单按钮后,游戏测试的退出弹窗也将不再出现:

游戏测试中的退出弹窗

我们还改进了 Windows 任务栏的加载进度显示,现在它会显示总体的加载进度,而非仅显示当前加载步骤的进度:

连接到服务器时的任务栏进度

服务器浏览器​

nanos world 查找服务器标签页

服务器浏览器现在会同时显示来自 主要 和 游戏测试 AppID 的服务器,从而更容易发现所有可用的服务器,无论你当前使用的是哪个分支。

请注意,不同 AppID 之间的连接仍然受到限制。例如,游戏测试客户端无法连接到主要服务器。

C:/Users/ 路径编码修复​

我们还终于解决了一个长期存在的问题,该问题会影响那些 Windows 用户名在 C:/Users/ 目录中包含重音符号或非 UTF8 字符的用户。

此问题以前可能会导致崩溃,并阻止包或 WebUI 内容正常加载。

路径现在已被正确编码,允许受影响的用户正常进行游戏而不会出现任何问题。

更新依赖项​

  • 更新 HTTP 库至 0.43
  • 更新 CEF 至版本 147
  • 更新 Sentry 至 1.11
  • 更新 SQLite 至 3.53
  • 更新了其他几个内部依赖项至其最新版本

结语​

4 月份的重点主要放在核心引擎改进、网络优化、加载性能、同步可靠性以及面向玩家和开发者的整体生活质量升级上。

从 Tracy 性能分析器的集成和新的本地化系统,到重大的网络重构以及像延迟生成这样的脚本优化,本次更新为 nanos world 的几乎每个领域都带来了实质性的提升。

我们还继续打磨了许多长期存在的问题和内部系统,提高了稳定性、可扩展性和整体开发体验。

一如既往,感谢所有为社区贡献反馈、翻译、错误报告和资源包的每一个人。你们的支持持续帮助着 nanos world 每月变得更好! 💙🩵

下一次更新再见!

Ko-fiKo-fi

3 月:大规模优化与 500 名玩家齐聚一堂!

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

海量性能优化、500 名玩家同屏、默认角色包、载具操控修复、全新脚本方法、游戏内服务器列表、团队改进、新配置项以及更多精彩内容!

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

Zenkai 突破 500+ 玩家!​

我们非常自豪地宣布,Zenkai(全新的法国 🇫🇷 忍者 RP 服务器)已实现 500 名玩家同时在线并在同一个服务器上!

这对我们和 Zenkai 团队而言都是一项巨大的成就!我们可以看到 nanos world 在地图上拥有数百名玩家和数千个实体时依然表现出色!网络占用非常稳定且低开销,服务器 CPU 使用率平稳运行,极少出现峰值!

数百名玩家在同一地图上的 Zenkai 总览

Zenkai 的成功证明了 nanos world 是一个强大且可靠的平台,足以承载宏大的游戏模式项目。 Zenkai 团队致力于打造沉浸式忍者 RP 体验的努力得到了回报,我们非常期待继续突破极限!

如果你还没有加入,快去 Zenkai 的 Discord 看看吧! 🥷

Zenkai 完整类

我截取的一些幕后截图:

Zenkai 幕后截图

全新 default-characters 包​

我们创建了一个全新的 default-characters 包,其中包含了所有实现为 Class 的原生角色,可轻松生成并用于你的项目中。

每个角色都已经配置了各自的材质、自定义网格体或衣物。

使用示例:

Server/Index.lua
local adventure_male_b = AdventureMaleB(Vector(0, 0, 100), Rotator())
local male = Male(Vector(0, 0, 100), Rotator())
local post_apocalyptic = PostApocalyptic(Vector(0, 0, 100), Rotator())
local chicken = Chicken(Vector(0, 0, 100), Rotator())
...

它们包含基础的 NPC 行为,可以四处移动并在受到伤害时逃跑。

鸡​

我们还使用 CharacterSimple 在该包中添加了一个全新的 Chicken 类,你甚至可以附身操控它!

鸡

服务器性能全面革新​

Zenkai 在地图上拥有数百名玩家和数千个实体,正不断推高 nanos world 的极限,这是一次绝佳的压力测试,也让我们找到了若干瓶颈与改进空间。因此,本月我们在服务器性能与优化方面做出了重大改进。

距离优化​

我们实现了一套全新的距离优化系统,可大幅减少远距离 Actor 的网络流量。服务器不再为每位玩家持续同步所有 Actor 快照(位置/旋转/速度),而是根据距离智能降低同步频率。

该系统可通过 Config.toml 中的 distance_optimization 设置或控制台命令进行配置:

Config.toml
# 通过减少来自远距离 Actor 的同步来提高网络利用率的距离优化级别 (0 - 9)
# (0) 禁用,(4) 是一个不错的中间值,(9) 最激进
distance_optimization = 4

随着 Actor 距离玩家越来越远,其同步率会线性降低,直到达到最大距离后完全停止同步。在包含大量实体的大型地图上,这能将网络占用最高降低 80%,同时依然保证附近玩家拥有良好的体验!

快照同步批处理​

我们重做了服务器向客户端同步 Actor 位置/旋转/速度的方式。

此前,我们总是针对每个更新的 Actor 发送独立的网络数据包来同步快照,这可能导致繁忙的服务器每秒产生数千个数据包。

现在我们将所有快照更新打包在一起,并在每个 Tick 中通过单次网络调用发送,从而大幅降低开销并提升性能。

角色性能​

我们对 Character 和 CharacterSimple 的实现进行了多项改进,以降低它们的 CPU 及网络开销,尤其是对于不需要完整模拟或同步的远处角色。

我们根据距离和网络主控动态启用/禁用多个组件和功能,这为包含大量角色的服务器带来了显著的性能提升;例如移动组件、相机组件以及多个 Tick 函数,现在都会根据需要自动激活。

语音通话重做​

我们重构了 VOIP 系统,以提升性能、减少网络占用并降低语音卡顿/断音现象。

现在 VOIP 音频数据的发送更加快速高效,能更好地应对网络状况并降低服务器端的 CPU 使用率,同时确保不会阻塞其他更关键的网络调用。

此外,我们通过在客户端语音传输中添加缓冲区,改善了微卡顿/断音问题。

文件传输系统​

我们降低了文件传输的优先级,以防止其干扰关键的游戏数据。此外,借助全新的 max_file_transfer_rate 设置,你现在可以控制用于文件传输的最大带宽,确保即使在玩家下载大型资产或脚本文件时,服务器依然能保持快速响应。

劣质连接​

我们新增了一套系统,可自动检测劣质连接并踢出触及最大挂起网络缓冲区的玩家,因为这此前会导致服务器不同步和不稳定。

Steam 维护​

现在当 Steam 因维护而宕机时,玩家将不再会被踢出服务器,允许他们在 Steam 服务中断期间依然保持连接并继续游玩。

更小的数据包​

此外,我们成功缩减了所有网络数据包的大小,改善了体积占用并降低了每次网络调用的整体网络开销。

脚本与 API​

我们为脚本 API 添置了大量全新方法、事件与改进:

新方法​

改进的方法​

新事件​

新枚举​

  • 新增枚举 SoundType:Ambient(受新增的 ** Ambient Sound** 音频设置影响)。

载具操控修复​

我们终于修复了一个困扰已久的载具操控和驾驶问题;此前该功能完全损坏,导致手感极差且非常打滑。

现在配置载具设置可以正确地影响其手感和操控性能。

已修复的载具操控

此外,我们添加了用于配置载具转向和传动设置的新方法,从而大幅提升对驾驶操控手感的控制力:

线程池系统​

我们实现了一套全新的线程池系统来处理所有异步操作:

新增命令行参数 --thread_pool_count,用于配置为异步操作初始化的线程数量。默认情况下,它将初始化 8 个线程或当前可用的 CPU 核心数(取二者中较大值)。

这通过按需复用工作线程,避免了为每个新异步操作重新分配线程,从而提升了服务器性能。

身份验证排队系统​

当大量玩家同时加入时,Steam 身份验证有时会对服务器实施速率限制。我们添加了身份验证队列来优雅地应对此问题:

玩家将排队并以平稳的速率进行验证,防止触发 Steam 速率限制错误,即使在海量并发连接时也能顺利加入。

全新光线追踪设置​

全新光线追踪设置

我们在视频设置中添加了全新的光线追踪设置!你现在可以独立开启或关闭全局光线追踪、硬件光线追踪或超量光源系统。

加载屏幕增强​

具备全新阶段显示的改进版加载屏幕

加载屏幕现在可以更清晰地展示初始阶段的状态,目前会显示:

  • 正在发送客户端信息
  • 正在等待 Steam 认证
  • 正在获取服务器需求

Windows 任务栏进度条​

现在 Windows 任务栏 将只显示一个从 0 到 100% 的连续进度条,而不会在每个阶段重复在 0 到 100% 之间来回跳动,从而提供更好的进度直观感受。

全新原生资产​

我们在默认资产包中新增了两个 Fab 资产包:

查看所有默认资产assets-modding/default-asset-pack/default-assets-list

新配置与命令​

新配置​

我们在 Config.toml 中新增了若干服务器配置项:

Config.toml
# 语言(国家/地区代码)
language = "br"
# 最大同步率(Hz,即每秒同步次数)(1 - 30)- 控制玩家之间以及与玩家相关的
# 位置/旋转/速度等 Actor 的同步速率 - 固然受到刻速率的限制
max_sync_rate = 30
# 每个客户端的最大文件传输速率(KB/s)(128 - max_send_rate)- 限制每个已连接玩家的
# 文件传输带宽 - 这将受到 'max_send_rate' 设置的限制
max_file_transfer_rate = 1024
# 距离优化级别,通过减少远距离 Actor 的同步来优化网络占用(0 - 9)
# (0) 禁用,(4) 是折中的推荐值,(9) 最激进
distance_optimization = 4

新增服务器语言国旗​

服务器列表中的服务器语言国旗

全新的 language 设置允许指定服务器的语言,并会在服务器列表中显示对应的国旗。

max_send_rate 变更​

破坏性更改

我们将 max_send_rate 的单位定义从 MB/s 改为 KB/s,并将默认值设置为 1024 KB/s。

如果你配置了自定义的 max_send_rate 设置,可能需要进行相应调整(乘以 1024)。

全新控制台命令​

以及全新的控制台命令,允许你在无需重启服务器的情况下实时修改这些设置:

  • profiling
  • log_level
  • max_send_rate
  • max_file_transfer_rate
查看所有服务器配置core-concepts/server-manual/server-configuration

Esc 菜单中的服务器列表​

可从 Esc 菜单直接访问的服务器列表

现在,即使你已经连接到了某个服务器,也可以直接浏览并连接至其他 nanos world 服务器!

再也不需要先断开连接再通过启动器重新连接了!

资源库改进​

Markdown 支持​

资源库中的资源描述和更新日志现在支持简化的 Markdown 语法:

# 标题
## 标题
### 标题
**粗体文本**
*斜体文本*
- 列表项

“管理”标签页中的沙盒描述

这能让创作者们将自己的资源库资源排版得更加美观且易于阅读!

“信息”标签页中的沙盒描述

团队身份组​

资源库团队现在拥有一套完善的身份组系统:

  • 管理员 (Admin):管理团队成员、编辑团队信息、管理所有资源
  • 维护者 (Maintainer):管理资源与更新
  • 开发者 (Developer):可以推送资源更新
  • 成员 (Member):拥有受限权限的团队成员

你可以在游戏内的 管理 标签页中点击你的团队,从而管理团队身份组和信息:

游戏内团队管理

更新的依赖项​

我们更新了若干关键依赖项:

  • 虚幻引擎 5.7.4:
  • DLSS 8.5
  • Steam SDK 1.64
  • Sentry 1.9.1

漏洞修复与稳定性​

本月我们修复了 40 多个漏洞、致命错误和崩溃。请在我们的 Changelog Discord 频道查看完整变更:

Changelog Discord 频道https://discord.com/channels/124107916432113666/680526360015274047

结语​

三月又是成果丰硕的一个月! Zenkai 服务器在 nanos world 上运行并突破 500+ 玩家,证明了 nanos world 已经为承载大型项目做好了准备。

距离优化系统和 Actor 同步效率的改进为服务器性能带来了颠覆性的提升。我们现在看到服务器可以在网络开销和 CPU 占用极低的情况下处理数千个实体。

这些改进共同使 nanos world 成为一个更具可扩展性的平台,能够支持更有野心和规模的项目。无论你是运行一个小型角色扮演服务器还是大型沙盒,nanos world 现在都能更好地从容应对!

我们仍在持续迭代和优化服务器性能,并在未来几个月规划了大量改进,敬请期待更多更新!

感谢大家在优化 nanos world 期间给予的耐心与支持。我们致力于将其打造成支持多玩家游戏模式的最佳平台! 💙

下一次更新再见!

Ko-fiKo-fi

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 版本中。

性能改进​

刻​

我们通过跳过无需 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 页面翻译成了多种语言,包括法语、西班牙语、葡萄牙语以及德语!

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

更新的依赖项​

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

结语​

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

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

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

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

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

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

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

Ko-fiKo-fi

1 月:沙盒 3.0、约束、工具提示与 API++!

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

沙盒 3.0、缆绳物理约束、交互工具提示、文档改进以及脚本 API++!

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

沙盒 3.0​

我们很高兴地宣布最新的沙盒更新!

沙盒封面

本次更新为沙盒游戏模式带来了许多改进:新特性、新实体、新工具,并对 UI 及现有系统进行了全面润色。它重点关注提升用户体验,并让创作内容、实体和工具变得更有趣(也更简单)。

生成菜单​

我们的生成菜单获得了大幅改进。它现在会在统一列表中展示所有物品,并按类别划分。当类别在屏幕上可见时会高亮显示。并且新增了一个搜索栏!

沙盒游戏模式生成菜单

上下文菜单​

上下文菜单是本次更新中最大的变更!

选择实体​

现在,当上下文菜单打开时,你可以通过点击实体来选择和修改它们。

沙盒游戏模式上下文菜单选择实体

每个实体都有其自己的一组属性,可通过上下文菜单进行修改。你可以在自定义类中通过定义 selected_context_menu_items 属性,以编程方式进行配置。

现在,在使用生成器工具枪时将出现全新的“预览网格体”,显示你即将生成的实体的虚影预览:

沙盒游戏模式自定义推进器
向推进器实体添加属性

例如,推进器的自定义粒子可以像这样设置以显示在上下文菜单中:

Client/Thruster.lua
Thruster.selected_context_menu_items = {
{
id = "thruster_particle_asset",
type = "select",
label = "particle",
options = Thruster.assets_list,
callback = function(value)
ContextMenu.selected_entity:CallRemoteEvent("SetParticleAsset", value)
end,
value = function()
return ContextMenu.selected_entity:GetValue("Particle")
end,
},
...
}

实体归属​

我们还添加了一项新功能,悬停在实体上时会显示谁生成/编辑了该实体,方便管理和知晓创建者。

显示谁生成/编辑了实体的实体归属标签

教程​

教程 UI 已升级,现在可以显示工具的简短描述以及工具枪使用的所有按键。

沙盒教程改进后的 UI,展示了描述和按键
为工具添加描述和教程

你可以像这样轻松添加自定义描述和教程,它们会被教程系统自动识别:

Client/ColorGun.lua
-- 工具描述
ColorGun.description = "Paint props and objects with a selected color"

-- 工具教程
ColorGun.tutorials = {
{ key = "LeftClick", text = "paint object" },
{ key = "ContextMenu", text = "color gun settings" },
}

新实体​

我们在沙盒中引入了许多有趣的新实体,后续还会推出更多!

复古相机​

RetroCamera 是一款宝丽来拍立得相机,可以让你进行实时拍摄。

沙盒游戏模式全新复古相机实体

它使用 SceneCapture 并输出 Base64 图像,照片会立即打印在相片底片上,并在服务器端同步和持久化保存!

按钮与连接线​

Button 是一个新的可按下实体,能够激活和停用其他实体:

沙盒游戏模式全新按钮实体和接线工具枪

你可以使用全新的 Wire Tool Gun 将按钮连接到其他实体。

沙盒游戏模式新按钮实体激活多个设备

它的实现原理是维护一份“已连接”实体的列表,并在这些实体实现了相应的方法时对其调用 :Activate() 和 :Deactivate()。

由于部分沙盒实体已经实现了这些方法,你可以将按钮用线连接至它们,打造出酷炫的集成。

你可以创建自己的实体并实现这两个方法以使其生效:

Server/MyEntity.lua
function MyEntity:Activate()
-- 开启!
end

function MyEntity:Deactivate()
-- 关闭!
end

相框​

PhotoFrame 是可以显示自定义图像的新实体。它同时支持 Base64 和 URL。

沙盒游戏模式选择实体与全新相框实体

Sign 与 FloatingText​

我们创建了两个新实体:Sign 和 FloatingText。两者都使用新的 TextRender 类在场景中渲染文本,并且可以通过上下文菜单对文本内容进行自定义。

沙盒游戏模式全新文本实体

新工具​

除了新的 Wire Gun 工具之外,我们还将在接下来的更新中添加更多工具,比如用不同物理约束来连接两端的 Ball Socket Gun、Spring Gun 和 Elastic Gun。

松紧带工具枪装置

重构的 API​

现在,所有沙盒系统都被整合并导出到一个单一的全局变量中:Sandbox。你可以从脚本中通过它访问所有沙盒系统和方法,例如 Sandbox.ContextMenu 或 Sandbox.SpawnMenu。

我们还创建并暴露了多个新的子系统,例如 Tutorials、Notifications、SpawnHistory,甚至将 WebUI 暴露为 Sandbox.WebUI。

更新的文档页面​

我们更新了所有沙盒文档页面,详细说明了如何使用和集成这些新系统,快来看看吧:

沙盒游戏模式explore/sandbox-game-mode/

即将推出​

这只是我们沙盒 3.0 更新的开始,我们仍在开发许多新功能和改进,包括更多实体、工具与系统。

我们想要补充缺失的“输入系统”,这样玩家就能通过按键与实体进行交互了。

抢先预览一下我们正在实验的另一个工具:

实验性车轮工具枪

交互工具提示​

我们为 Prop、Weapon(Base Pickable)和 Base Vehicle 引入了全新的交互工具提示系统。当你注视这些可交互物体时,屏幕上会出现工具提示(文本 + 图片):

悬停在可交互物体上时屏幕上显示的工具提示

对于道具,你现在可以使用 Prop:SetInteractionToolTipText() 来修改工具提示的文本。这允许你为仅支持交互的道具设置自定义消息,如“打开”、“关闭”或“按下”。

你可以使用新的静态方法 Viewport.SetInteractionToolTipEnabled() 禁用此系统。

脚本与 API​

新类:TextRender​

我们以前也有一个 TextRender 类,但它实际上是一个 Text3D 组件(来自 Unreal Text3D 插件)。

因此我们决定创建一个全新的 TextRender 类,并将旧的 TextRender 重命名为 Text3D。这为我们提供了一个新的轻量类,用于配合字体渲染简单的 2D 文本,同时保持 Text3D 独立并拥有其专属方法(与以前相同)。

这个全新的 TextRender 类还支持通过 TextRender:SetFont() 使用自定义字体。

为了本次升级,我们引入了新的兼容性版本 1.103,从而不会对任何使用旧 TextRender 类的现有脚本造成破坏。

纹理参数​

纹理参数灵活性得到了极大提升:任何纹理参数现在均支持加载 Base64、URL 图像(实验性)以及烘焙过的纹理资产。

运行时加载为纹理的自定义网络图像

你可以使用 Paintable:SetMaterialTextureParameter() 直接给材质设置 URL 或 Base64!

缆绳与约束​

Cable 得到了大幅改进。创建“锁定”约束时将不再附带自动计算的偏移量。 Cable.AttachEndTo() 中新增了 constraint_offset 参数,因此你可以直接通过脚本来自定义偏移,更好地掌控约束。

我们还添加了一系列新方法来自定义物理约束和马达设置,比如 :SetLinearMotorPositionSettings() 以及 :SetAngularMotorSLERPOrientationSettings()。请在博客的下一节中查看全部内容。

缆绳的生成性能也得到了提升:如果你使用全自由约束,物理约束现在会保持停用(非常适合只需要视觉效果的场景)。我们还做了细微改进,以稳定并减少物理抖动现象。

新增及改进的方法​

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

角冲量/力​

你现在可以在任意 Actor 上施加和设置角冲量与角力:

覆盖道具质量​

缆绳马达与物理约束​

可涂色物 Getter​

Actor 渲染剔除距离​

你现在可以设置任意 Actor 的渲染剔除距离(即 Actor 停止渲染的距离):

Actor 阴影​

你现在可以启用/禁用任意 Actor 的阴影:

其他新增方法​

改进的方法​

Hit 事件 other_actor 参数​

现在 Hit 事件包含一个新的 other_actor 参数,代表造成碰撞的另一个 Actor。

文档​

我们对文档进行了多项改进。

效率标签​

我们为所有方法添加了全新的 efficiency 标签:

所有方法上的效率标签/弹窗

例如,如果你悬停在 HTTP.Request() 上,你会在右上角看到一个“blocking”标签,意味着这是一个阻塞操作,会冻结主线程。

所有方法和事件的锚点链接现已修复:你可以悬停并从任何 API 页面复制链接。并且当点击锚点时,页面现在会以正确的偏移量进行滚动。

改进的搜索结果​

我们还改进了文档搜索,现在可以返回更精确的结果。

返回精准结果的文档搜索

Docker 教程​

我们新增了一篇由社区撰写的教程,介绍如何在 nanos world 服务器上使用 Docker,欢迎前往 Docker 安装页面查看。

生活质量改进​

WebUI 输入​

除了新增的 WebUI:HasNodeFocus() 方法外,现在当某个 WebUI 节点拥有焦点时按下 Esc 键,会让该节点取消焦点(而不是打开 Esc 菜单)。

同时,当 WebUI 节点拥有焦点时,所有游戏输入都将被忽略。这使得游戏内表单和文本输入体验更加“自然”,并避免了玩家在 UI 中打字时意外触发游戏按键绑定的烦人情况。

文件传输速度​

我们再次对下载系统进行了迭代,高延迟玩家的文件传输速度得到了提升,使在较差网络条件下加入服务器的过程更加顺畅。

语音通话网络使用情况​

在语音通话方面,使用本地频道时,数据现在仅传输给方圆约 30 米内的玩家,从而减少不必要的带宽占用。

丢弃输入​

按下丢弃输入(G)现在也会丢弃已抓取的道具。

新增默认资产​

我们在默认资产包中添加了若干新资产,包括新的静态网格体(SM_RetroCamera、SM_PhotoFrame、SM_LightSwitch、SM_PushButton)、音效(按钮、开关和推进器声音),以及来自 Fab 的完整 火箭推进器排气 粒子包。

我们还改进了载具侧滑粒子,修复了一些闪烁问题并提升了视觉效果。

更不用说还改进了多个资产的碰撞,修复了它们的物理行为。

首次基准测试​

首次启动时询问寻找最佳设置的弹窗

我们新增了一个弹窗,在首次启动游戏时询问是否运行首次基准测试(它不会再自动运行)。

依赖项​

更新的依赖项:

  • 虚幻引擎已更新至 5.7.3。
  • CEF 已更新至 144。
  • Sentry 已更新至 1.6。

结语​

沙盒游戏模式终于呈现出了我期望的形态,非常接近给我带来灵感的 Garry's Mod 版本。虽然我还有很多工作要做和拓展,但我们比以往任何时候都更接近目标。

我对沙盒模式的目标是让它成为一个充满乐趣的游戏模式,并能方便地成为新集成和实体的来源。同时,它也是如何为 nanos world 实现自定义实体、工具和系统的优秀示例来源。

每当我抽时间编写脚本和游戏模式时体验都很棒。除了超级有趣之外,我总能发现缺失的方法和问题,并最终在这段时间里完成整合与修补工作。

我一直专注于改进现有的功能并解决长期存在的问题。这个月,我们为游戏和脚本 API 添加了许多非常酷的新特性!

一如既往,感谢大家参与测试、提交漏洞和编写脚本!请保持关注,后续还有更多内容!下一次更新再见! 💙