9 月:万圣节、游戏测试与加密!
万圣节准备、游戏测试、客户端文件加密、大量性能改进及更多内容!

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

我们已正式进入创作万圣节游戏模式的季节!
如果你是测试员且尚未开始,还有大约 2 周的时间来进行创作!本次活动是展现创造力并协助我们在真实负载下对系统进行压力测试绝佳机会。
万圣节游戏测试将在 10 月 27 日至 11 月 3 日的 Steam 尖叫游戏节期间向所有人公开开放!在 Discord 帖子中查看完整详情。
除了社区创作的游戏模式外,我们还将游玩传统且 增强 的万圣节特别游戏模式,其中包含大量新机制、增益、无马无头骑士职业以及全新玩法。以下是几张预览图片:






你可以在 Discord 子区中找到有关此游戏模式的更多详细信息。此外,欢迎在 🚀|project-showcase 频道中分享你的进度!
加入游戏测试
如果你还不是测试员且希望作为玩家加入,请前往 nanos world™ Steam 页面并点击 请求访问权限 来参与游戏测试。在万圣节周期间,所有人都可以下载并游玩本游戏。
脚本文件加密

我们一直收到社区关于对发送给客户端的文件进行混淆的请求,现在我们迈出了第一步,对所有客户端 Lua 文件进行了加密处理!
所有客户端 Lua 文件在发给玩家时现已全部加密。在下载并存储至客户端磁盘时,我们使用运行时生成的密码来对每个 Lua 文件进行加密和解密。
当包引用 Lua 文件时,所有文件都会在运行时进行解密,这为不希望 Lua 文件被玩家轻易读取的创作者增加了一层安全保障。
触发器改进
我们对触发器的实现进行了重大改进,大幅提升了其效率!
- 针对球体和盒体检查的数学相交算法进行了深度优化。
- 触发器现在仅遍历白名单类中的 Actor,从而大幅降低循环开销。
- 仅对附近的 Actor 进行评估,较远的 Actor 将在触发器检查中被完全忽略!
这些改进在密集地图中节省了大量 CPU 资源。
核心改进
我们进行的一些内部框架改进如下:
服务器线程竞争
我们解决了导致服务器端频繁卡顿的若干线程竞争瓶颈问题(这些问题曾导致帧 tick 时间过高或性能分析警告),特别是在主线程上的内部互斥锁等待异步线程完成时。
这通常发生在玩家正在下载文件,或者生成了过多具有网络主控及触发器的 Actor 时。我们重构了所有异步线程及互斥锁的使用,极大地减少了对异步线程的依赖和相关锁竞争。
并行 Lua 文件加载
我们实现了一个多线程解决方案,用于在加载包时对其中的所有客户端文件进行加载、缓存和加密。现在它的运行方式类似于加载资产包,从而提升了多核处理器上的服务器性能。
网络主控改进
改进了网络主控和分发逻辑。我们重做了用于决定哪些实体可以分发网络主控的内部系统,修复了一些不应更改网络主控实体引发的罕见漏洞,并提升了性能。
我们还改变了 Translate/RotateTo 的工作方式。此前,这些调用仅由实体的网络主控方进行处理,从而导致同步问题和流畅度欠佳。现在,它们会在所有客户端上分别单独处理,从而消除了某些实体(如 StaticMesh)需要进行网络主控分发的限制,极大地降低了网络占用。
网络占用
我们通过减少附加实体(例如角色驾驶、拾取武器或附加 Actor)的同步频率,优化了网络占用。
我们还优化了内部网络获取机制,以批量处理网络数据,减少了所需的内部网络 API 调用。
新增默认资产
冒险角色
我们原生打包了新的免费 Fab 资产包 Adventure Characters。

官方沙盒游戏模式现已包含这些网格体及其已妥善配置的衣物。
Bossy Enemy Anims
我们还打包了 Fab 资产包 Bossy Animation Pack。

所有这些资产都经过妥善配置并针对运行时使用进行了优化,均可原生使用。你可以在 默认资产列表 页面中找到所有原生资产。
全新脚本 API 方法
本月我们实现了一系列新方法,例如:
控件插槽
控件新增了控制其在插槽中布局的新方法:
- Failed to load method SetSlotAlignment (控件) data.
- Failed to load method SetSlotPadding (控件) data.
- Failed to load method SetSlotSize (控件) data.
我们还重命名了旧的 Widget:SetSlotCanvasLayout() 以保持命名的一致性。
PostProcess
我们暴露了全新的方法,允许自定义全局后处理色彩:
-
PostProcess.SetGlobalGain() -
PostProcess.SetGlobalGamma() -
PostProcess.SetGlobalContrast() -
PostProcess.SetGlobalOffset()
其他新增方法
Server.GetEntityByID()/Client.GetEntityByID()-
Pawn:SetControlRotation() -
Character:SetCanUsePickables() -
Pickable:SetCanUse() Character:SetPhysicsAsset()/CharacterSimple:SetPhysicsAsset()
VOIP 改进
我们改进了内部 VOIP 捕获的处理方式。 VOIP 脚本事件现在仅在语音捕获真正开始或结束时触发,使其更加精准并防止意外的突发截断。
测试地图天气
Testing Map 现已改进了材质,以便更好地对动态天气做出响应。树木与草地现在受来自 Ultra Dynamic Sky 的潮湿 Wet 和积雪 Snow 效果影响。

外部依赖项
- 我们添加了 Kawaii Physics 插件。
- Ultra Dynamic Sky 已更新至
v9.1版本。
重要漏洞修复
我们本月修复的一些重要漏洞包括:
- 修复了 CharacterSimple 加速度、同步、后加入玩家的胶囊体大小以及
MoveComplete事件的问题。 - 修复了性能分析 UI 每次刷新时引发卡顿的问题。
- 修复了
JSON循环引用引发堆栈溢出的问题(现已安全置空)。 - 修复并改进了运行时
.ogg音频的加载。 - 修复了后处理 PostProcess 在被附身前未能应用效果的问题。
- 修复了旁观时相机无法正确附着到其他玩家身上的问题。
- 修复了触发器多次重复调用
Begin/EndOverlap事件的问题。 - 修复了客户端执行
package reload all时多次重复加载同一包的问题。
如需完整详尽的更新日志,请前往我们的 Discord 查阅。
商店开发

我们仍在努力开发商店的初始版本。我们已经完成了包部分的可运行原型,目前正在开发资产部分。
希望在月底之前能够准备妥当,供大家在测试期间进行测试和使用。
结语
除了所有这些改进和新功能之外,本月的工作重点主要集中在开发全新的万圣节特别游戏模式上。这个新的万圣节版本变得非常有趣,我非常期待大家能亲自体验它! 🎃
在宣告完成前,仍有一些漏洞需要修复以及小幅调整。但自己亲自开发游戏模式/包总是很棒的,因为我可以发现所有需要的功能或漏洞并立即予以修复。
此外,从零开始重制 City Park 地图真的非常痛苦。这张地图的优化极其糟糕,为了让它具备可玩性耗费了大量的工作。
这真的是非常赶进度的一个月,万圣节活动还有很多工作要做,我几乎每天工作近 10 个小时以确保一切按计划进行。对我来说,这确实是一场时间管理方面的挑战。 😅
一如既往,感谢大家对我的所有支持!这对我大有裨益!如果你有任何建议或漏洞反馈,请随时提出!
游戏测试中见! 👋



