跳至正文

56 篇文章 篇带有标签“updates”

查看所有标签

8 月:模块、需求与安全性!

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

包需求、模块、安全性、文档++ 及更多!

来看看 8 月最新更新的汇总吧!

异步操作改进​

在 nanos world 中,我们有一堆在后台运行的操作和方法,包括核心/内部和脚本操作(如 HTTP.RequestAsync、File.ReadAsync、SceneCapture.EncodeToBase64Async 等),执行时,这些方法会启动一个新线程以异步执行。

最棘手的部分是控制它们,也就是说,在异步操作完成之前,我们无法完全销毁一个文件实体,这就是为什么如果我们试图销毁一个正在执行异步读取的文件(或重新加载一个包含大量此类文件的包),服务器可能会冻结几秒钟。

问题在于,在上次更新之前,我们对所有运行的线程有一个全局控制,也就是说,如果我们想销毁一个文件,我们需要等待所有异步操作完成,以确保没有与该文件相关的操作仍在运行。

但这次新更新改变了这一点!现在我们有一个新系统控制所有按实体运行的操作,这意味着一个实体不会因为需要等待它不需要的东西而受到影响(或影响)服务器的任何其他部分。

此改进还修复了我们遇到的许多死锁,并大大改善了处理异步方法时的整体卡顿。

Package.Require 缓存​

我们在 Package.Require 的内部工作方式上获得了一些改进,并且它获得了一个新参数:force_load。

现在它会缓存文件的返回值,以便在你尝试再次加载文件时返回。你可以通过向添加的新参数传递 true 来绕过此行为:Package.Require(file, force_load)。

新模块行为​

模块是可以在服务器上运行的外部原生代码(.dll 或 .so)。

目前它们的工作方式是在 Server/Modules/ 文件夹中查找你的二进制文件,然后你可以使用原生方法 require("module_name") 加载它们。

此工作流程在即将到来的更新中正在经历重大改进。未来,我们的目标是让模块像包一样工作——即创建一个模块类型的包,以独立方式加载二进制文件,这样我们就可以将其作为包在我们的商店/资源库中提供,并且可以以更标准的方式加载它们(使用包依赖项或 Package.Require())。

因此考虑到这一点,我们迈出了第一步:我们实现了自己的二进制加载器,可以控制加载 .dll 或 .so,而不再需要原生 require()。

这样,现在暂时* Package.Require() 可以加载 .dlls/.so,而 require() 现在只是 Package.Require() 的别名,使一切仍然向后兼容。

提示

这种别名也解决了与原生 require 相关的几个漏洞和问题,并使一切保持在我们的沙盒环境控制之下。

备注

*暂时,因为将来我们可能会改变使用新模块包类型加载二进制模块的方式。

在最高层面,没有任何变化,应该继续按预期工作,但在底层,现在一切工作方式都不同了,并允许我们扩展和推进到更新的实现!

脚本安全性​

我们正在服务器端实施新的安全层,以防止恶意代码在服务器创建者不知情的情况下运行。请让我知道你对这些更改的意见:

不安全的库​

现在,方法 os.execute、os.rename、os.remove、os.exit、os.getenv、os.tmpname、os.setlocale、dofile、loadfile 以及所有 io.* 只有在服务器使用新的命令行参数 --enable_unsafe_libs 启动时才能执行。

我们正在研究将其变为在 Package.toml 中定义的按包设置的可能性,而不是要求启动该命令行,这样如果包“可能不安全”,服务器所有者会收到警报(因为目前通过新游戏菜单启动时,使用这些方法的包将无法工作)。

文件访问​

这样,建议所有文件访问都通过 File 类(而不是 io.*)进行,拥有沙盒化和安全的文件访问方式。

此外,现在 File 不能再直接访问 Config.toml 文件,以防止恶意包例如窃取服务器令牌。

递归脚本表​

我们在将数据从 Lua 传递到原生方法(或脚本事件)时,对内部序列化/反序列化实现进行了重大改进。

之前我们有一个系统,如果递归表(对任何父表有引用的表)在反序列化堆栈中已经被引用,则抑制其传递(以避免无限循环),但现在我们改进了算法,可以传递递归表!

在内部它们被缓存,以防我们想要反序列化同一个表,其值只是被解引用回 Lua 堆栈!

新方法和参数​

向类添加了几个新方法和参数,仅举几例:

文档改进​

我们在文档中添加了新的基类页面和 API:Base Vehicle 和 Base Pawn,以统一 VehicleWater 与 VehicleWheeled 以及 Character 与 CharacterSimple 之间的所有共享方法。

这样我们在这些类之间维护的重复方法和事件就更少。

结语​

安全性是像 nanos world 这样的沙盒游戏的主要关注点之一,因为我们总是加载和运行第三方创建的脚本和包,我们认为服务器创建者能够完全信任并知道他们正在执行的内容非常重要。本月我们在这方面取得了巨大的改进进展,我们肯定会在接下来的更新中继续改进。

此外,模块升级对于 nanos world 变得更加健壮是一个非常重要的改进,在接下来的更新中,我们将继续巩固模块包并将一切联系在一起。

关于虚幻引擎 5.3 的一点小注:我们仍在等待其完全发布,在此之前我们不会推进游戏更新。

一如既往,如果你有建议或想法,请不要犹豫,在我们的反馈中心发表!感谢又一个月的支持!

7 月:Gizmo 与虚幻引擎 5.3!

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

新 Gizmo 类、改进的 HTTP 类、Lua 更新、虚幻引擎 5.3 及更多!

来看看 7 月最新更新的汇总吧!

新类:Gizmo​

我很高兴地介绍一个新的精彩类:Gizmo!

Gizmo

这是一个用于操作对象的自定义工具,提供通过简单的 3D 变换工具更改其位置、旋转和缩放的方法!

将 Gizmo 类与道具一起使用

它的使用非常简单容易! Gizmo 有一个 Transform 事件,当其更新、移动或更改时始终触发:

Client/Index.lua
local my_prop = Prop(Vector(), Rotator(), "nanos-world::SM_Cube")

local gizmo = Gizmo()

-- 要获取 Gizmo 的位置,我们只需订阅其 Transform 事件
gizmo:Subscribe("Transform", function(self, location, rotation, scale)
my_prop:TranslateTo(location, 0.02)
my_prop:RotateTo(rotation, 0.02)
my_prop:SetScale(scale)
end)

有关更多示例和完整文档,请参阅官方页面:

Gizmo 类scripting-reference/classes/gizmo

服务器重启​

我们有了一个新的内置服务器控制台命令:restart。这个新命令会重新连接所有玩家并重启所有正在运行的包!

此外,我们有了一个新方法 Server.Restart(),允许通过脚本以编程方式实现相同的功能。

客户端 HTTP​

HTTP 类已更新,现在也存在于客户端!允许脚本编写者在客户端也进行异步 HTTP 请求!

备注

在客户端只能进行异步 HTTP 请求,否则会冻结主游戏线程。

HTTP 枚举方法​

我们还在 HTTP 方法方面获得了改进。现在 HTTP.Request() 和 HTTP.RequestAsync() 的 method 参数已改为枚举:HTTPMethod(之前是字符串)。

这样我们更加有条理,也不容易传递无效值。

提示

这不会破坏更改,因为我实现了一种新方法来在你传递旧参数类型时警告你。

虚幻引擎 5.3​

在上次的新闻博客中,我宣布我将把游戏更新到虚幻引擎 5.2,但上周我们收到了公告,UE 5.3 刚作为预览版发布。通常进入预览版后,大约需要 1 到 2 个月才能正式发布。

虚幻引擎 5.2 更新已经准备就绪,但考虑到这一点,我决定推迟发布,改为等待 5.3。这样我们就不必经历两次更新所有资产的麻烦,只需在它完全发布时做一次!

目录/文件访问​

我们为 File 类添加了两个新的静态方法:File.GetDirectories() 和 File.GetFiles(),它们允许访问服务器(或客户端 .transient/)文件夹内的任何文件。

这是对其他方法 Package.GetDirectories()/GetFiles() 的改进,因为它不仅限于访问包文件。

VehicleWater 方法​

我仍在改进和调整我们最新的新类 VehicleWater。因此我添加了两个新方法来帮助自定义它:

更新 Lua 5.4.6​

我还将我们的 Lua 版本升级到了最新的 5.4.6 更新(我们之前是 5.4.3)。

这些 Lua 小更新没有带来任何大的改进或变化,只是修复了小漏洞或安全问题,但保持最新总是好的!

结语​

这是一个简洁的月份,有一些非常有趣的补充,例如 Gizmo 类以及 File 和 HTTP 类的扩展,以及我们执行的几个修复的漏洞,详细信息可以在我们 Discord 的更新日志中找到。

新的 Gizmo 类是一个很棒的补充,它可能有助于创建自定义建造和编辑器模式,以帮助在游戏内创建和自定义地图!现在就看你的创造力来好好利用它了!我期待看到由此产生的建造模式!

虚幻引擎 5.2 更新已经准备就绪,所有需要的迁移代码都已更新,但考虑到虚幻引擎已经发布了下一个 UE 5.3,我认为我们可以利用这一点,稍等一段时间直接做一个大的 5.3 更新。

一如既往地感谢又一个月的支持和帮助!下个月见!

1 月:VehicleWater、平滑网络同步!

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

VehicleWater、平滑网络同步、CEF 更新、Assets.toml 生成器及更多!

来看看 6 月最新更新的汇总吧!

新类:VehicleWater​

我们很自豪地介绍我们的新类:VehicleWater!这仍然是一个最低限度的概念类,但主要功能可用:在水上驾驶,具有所有常规载具功能!

这个新的 VehicleWater 类的工作方式类似于 Vehicle 类,支持添加自定义门、调整其功率,以及让角色进入门并附着到每个门的特定位置。所有角色进入/离开的载具事件也正常工作!

VehicleWater 概念类驾驶

它会程序化生成在水面上正确漂浮所需的物理浮筒!

VehicleWater 概念类驾驶与波浪互动

我仍然想继续改进这个新类,并为角色添加新动画。我还做了一些集成虚幻引擎水泡沫的测试,但它需要很多不可扩展的 hacky 解决方案,这是我将继续努力的事情,以尽可能带来最佳的视觉效果!

请向我们提供反馈和建议,以便我们不断改进并为这个新类添加新功能!

提示

Wast3d,享受吧 🙏

重命名载具类​

随着新的 VehicleWater 类的加入,我们将旧的 Vehicle 类重命名为 VehicleWheeled,这样我们将为拥有多种类型的载具打开大门(未来也能够拥有空中、飞机、直升机载具类型)。

使用 Vehicle 的脚本在使用旧的 Vehicle 名称时只会收到警告。

ADK Assets.toml 生成器​

随着上个月的资产元数据更新,我们现在能够为资产包中的每个资产包含自定义数据。

因此我们改进了 ADK 的 Assets.toml 生成器,也可以选择包含所有静态网格体的边界信息:

[assets.static_meshes]
SM_Cube = { path = "Meshes/SM_Cube", bounds = { origin = "Vector(0.000, 0.000, 0.000)", box_extent = "Vector(50.000, 50.000, 50.000)", sphere_radius = 86.602539 } }

这可以通过脚本访问,如下所示(在服务器端!!):

for _, asset in pairs(Assets.GetStaticMeshes("nanos-world")) do
local bounds = asset.bounds
Console.Log(bounds.origin) -- Vector(0.000, 0.000, 0.000)
Console.Log(bounds.box_extent) -- Vector(50.000, 50.000, 50.000)
Console.Log(bounds.sphere_radius) -- 86.602539
end

默认资产类别​

我们的默认资产包也进行了分类!大多数内置资产都添加了一个新的元数据 category,可以这样获取:

for _, asset in pairs(Assets.GetStaticMeshes("nanos-world")) do
Console.Log(asset.category) -- 例如 "furniture"
end

这取代了沙盒以前对资产进行分类的方式,之前有一个硬编码的 Lua 文件,其中所有资产都在一个指向类别的表中,现在它支持你创建自定义资产包并向其中添加类别元数据,以与沙盒约定集成!

附加网格体边界​

我们对附加网格体方法做了一些更改,现在它们允许定义在附加时是否使用父级边界。它们有了一个新的最后一个参数:

character:AddStaticMeshAttached("hair", "nanos-world::SM_Hair_Long", "hair_male", true)
character:AddSkeletalMeshAttached("tie", "nanos-world::SK_Tie", false)

这修复了当附加网格体附加到具有较小/微小基础网格体的实体时不断闪烁的一些情况。

更平滑的网络同步​

我们在与动态 Actor 的位置/旋转快照同步相关的网络代码方面取得了巨大改进。

你可以注意到,当其他玩家驾驶或与道具、可拾取物和载具进行物理交互时,它们现在流畅得多!

更新的 CEF​

我们终于成功地将 CEF 版本更新到了最新的 CEF 构建(114),我们之前无法这样做,因为由于某些未知原因它在 Linux 构建上无法工作,但终于在近 1 年没有更新之后,最新的 CEF 版本再次对 Linux 用户生效了。我们现在已经更新到最新的优化和安全构建!

大量漏洞修复​

但除了新闻之外,我们还进行了 10 多个重要的漏洞修复和小改进。

仅举几例:

  • 服务器端可拾取物在被处理时未返回真实位置。
  • 服务器端崩溃。
  • 由于高负载导致服务器随机高 tick。
  • JSON 解析器未正确转换键
  • CEF JSON 解析器未正确转换为 Lua 数组。
  • 多次玩家生成事件。
  • 角色物理动画未重置。
  • 以及更多……

在我们 Discord 的更新日志频道查看完整列表!

结语​

这是一个比平常更短的新闻博客,因为上个月我搬到了新公寓,导致专注的时间更少,但现在事情又恢复正常了! 😎

这个 VehicleWater 更新是我已经以缓慢的速度工作了一段时间的事情,几个月前我重构了所有内部与载具和角色交互相关的系统,以允许更多的载具子类型,并让“角色”实体与所有“载具”的交互更加通用,这使我们能够以模块化的方式创建一个仅用于水上的新载具类!

此外,我将尝试投入一些时间将我们的虚幻引擎版本升级到最新的 UE 5.2,现在 Epic 发布了第一个热修复,我们可能更稳定地进行此操作!

感谢你又一个月的陪伴,你的支持一如既往地极其重要!

5 月:控件 3D、资产元数据!

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

Widget 3D、资产元数据、资源库上传、客户端触发器及更多!

来看看 5 月最新更新的汇总吧!

更轻松地上传到资源库​

我们很高兴地宣布,现在有更简单的新方法将你的包和资产包的新版本上传到资源库!

通过 CLI 上传​

我们添加了一个新的 CLI 命令 package upload 和 assets upload,允许你通过 CLI(命令行界面)轻松上传你的包或资产包的新版本。

该系统会校验、压缩并将你本地资源的新版本直接上传到资源库。它简化了流程,节省你的时间和精力。

Terminal
./NanosWorldServer.exe --cli upload package default-weapons

通过 UI 上传​

我们还使你可以直接从资源库管理标签页上传新的包或资产包版本。

这个新系统现在会自动检测你本地版本是否比远程版本更新,并显示上传按钮。

资源库管理标签页显示有新版本可上传

上传完成后,将出现一个弹窗,提醒你在商店中批准发布。这是一种无缝便捷的方式来管理和更新你的资源。

上传新版本后显示的弹窗

观看上传过程演示:

通过资源库上传包

新类:Widget3D​

我们很高兴地介绍新类:Widget3D。该类提供了现有 Widget 的 3D 表示!使我们能够让控件作为 Actor 在 3D 世界中渲染!

你可以通过新的 Widget 方法 SpawnWidget 生成 Widget3D 类:

Client/Index.lua
-- 生成并配置一个 Widget
local my_widget = Widget(NativeWidget.Image)
my_widget:CallBlueprintEvent("SetBrushFromTexture", "package://testing/Client/MyImage.jpg")

-- 从 Widget 生成 Widget3D
local my_widget_3d = my_widget:SpawnWidget3D(Vector(0, 0, 200), Rotator(0, 90, 0))

在世界中生成的 Widget3D
Widget 3D 类scripting-reference/classes/widget3d

地图包创建流程​

我们通过 UI 对地图包创建流程进行了重大改进。

现在,选择地图资产变得容易多了!系统会自动获取所选资产包中包含的所有地图资产,让你可以方便地选择所需的地图资产,简化了地图包的创建过程!

地图包创建工作流程

观看地图创建过程演示:

通过资源库创建地图包

资产元数据​

现在我们可以在 Asset.toml 中为单个资产定义元数据(自定义值)!之前我们只能通过路径定义资产:

Assets.toml
[assets.static_meshes]
SM_Flower_01 = "MyFolder/SM_Awesome_Flower_01"
SM_Rock_01 = "MyFolder/SM_Rock_01"
SM_MyAsset_01 = "MyFolder/SM_MyAsset_01"
# ...

现在我们可以将它们定义为表,允许为每个资产设置自定义值!

Assets.toml
[assets.static_meshes]
SM_Flower_01 = { path = "MyFolder/SM_Awesome_Flower_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Flower_01.jpg" }
SM_Rock_01 = { path = "MyFolder/SM_Rock_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_Rock_01.jpg" }
SM_MyAsset_01 = { path = "MyFolder/SM_MyAsset_01", my_tag = "Wonderful", something = 123, thumbnail = "Thumbnails/SM_MyAsset_01.jpg" }
# ...

在资产元数据文档部分了解更多:

资产元数据core-concepts/assets

客户端触发器​

现在,我们的 Trigger 类也可以在客户端生成!让脚本编写者可以在客户端以与服务器相同的方式使用触发器!

附加网格体功能​

我们在附加网格体功能方面获得了一系列改进和新方法!

我们引入了新方法,使你可以直接在附加网格体上自定义其材质:SetMaterialScalarParameterOnAttached() 和 SetMaterialVectorParameterOnAttached()。这消除了(并弃用了)使用常规方法设置材质参数时对 attachable:// 模式的需求。

此外,我们还添加了便捷的获取器,如 GetAll[Static/Skeletal]MeshAttached(),用于检索所有当前附加的网格体及其路径。

最后,我们有了 SetStaticMeshAttachedTransform(),允许脚本编写者在运行时更改附加网格体的变换(位置/旋转)!

P2P 改进​

我们解决了 P2P(非专用服务器)功能实现中的几个问题,特别是与连接到 P2P 本地主机服务器相关的问题。我们开发了一种新的混合解决方案,解决了其中大部分问题。

P2P 服务器使用 Steam 骨干网来实例化一个新的虚拟 IP,该 IP 提供给其他玩家以连接到你的服务器,而无需你在路由器中转发端口。

问题在于你只能通过这个新的虚拟 IP 连接,例如无法通过 localhost (127.0.0.1) 连接,所以我们有一个 hacky 实现,它会识别你正在连接到本地主机服务器,并尝试直接从其中检索这个虚拟 IP,这非常脏,并且存在许多缺陷和不可预见的后果/漏洞。

但最终幸运的是,我们成功实现了一种解决方案,通过现在采用混合方法解决了所有问题!现在所有 P2P 服务器也允许“专用”连接,使它们能够同时通过 localhost 和虚拟 IP 进行连接!

杂项改进​

兼容性版本 1.54​

最后,值得一提的是本月我们引入了一个新的兼容性版本 1.54,对 Level.CallLevelBlueprintEvent 进行了更改,通过启用可变参数使其与常规蓝图函数保持一致。还有 Client.GetPackages(),使其也像 Server.GetPackages() 一样工作!

多包重载​

现在可以使用控制台命令一次重载/加载/卸载多个包!例如:

package reload sandbox battlefield-kill-ui

更新的 CEF 和 Steam​

我们已将 CEF (114) 和 Steam SDK (1.57) 库更新到最新版本!由于 Linux (Proton) 的一些问题,我们的 CEF 已落后近 1 年,但现在它们似乎都已修复,我们再次保持最新状态!

UFont 和 UClass 参数​

现在蓝图支持从 Font TTF Path 接收 UFont,并从虚幻引擎常规路径(/Game/MyAsset/MyClass.MyClass_C)接收 UClass!

资源库刷新​

我们也在资源库物品屏幕中添加了刷新按钮!它位于导航栏的右侧:

结语​

本月的目标是更加鼓励脚本编写者/模组制作者将他们的资源上传到资源库。由于现在推送新版本只需点击几下,而且流程已高度自动化,许多障碍已被消除!

创建地图包的新工作流程也旨在鼓励脚本编写者/模组制作者以更简单、更快速的方式从其资产包创建地图包!

我下一步想做的是能够直接通过资源库 UI 创建包/资产包并在商店批准发布(目前我们仍需要使用网站来完成),然后我们将拥有在游戏内完成创建和上传资产的完整流程!

我认为资源共享是沙盒游戏的关键因素,我想尽可能改进我们在这方面的设计,使其更加容易!

总之,本月我们在模块化和脚本能力的各个方面都取得了重大改进!

Widget3D 将在 3D UI 创建方面带来许多改进(例如名称标签或简单的自定义 3D 文本/标志)。

而资产元数据是改进资产分类这一略显模糊领域的巨大一步。很快我将更新所有标准资产,添加标签、类别,并更新沙盒包以更标准化的方式使用这些!

感谢又一个月的支持和帮助!下个月见! 🤗🤗

4 月:载具生命值、文档++!

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

载具生命值、文档++、精简资产、工具类及更多!

来看看 4 月最新更新的汇总吧!

载具损坏系统​

这次更新是我们即将获得的最酷的新增内容之一!现在 VehicleWheeled 有了新的损坏与生命值系统,它们可以受到损坏,如果生命值归零,载具会爆炸,失去轮胎并变成烧毁状态!

此行为可以通过新方法配置:Vehicle.SetExplosionSettings()。

信息

我们仍将继续改进并为该系统添加新功能,例如允许更多自定义和破坏阶段。

载具轮胎爆胎​

除了生命值系统外,载具现在在受损时轮胎可以爆炸!

也可以通过新方法手动编写脚本:Vehicle.SetTireFlat(index, true)。

提示

为了使其生效,每个车轮骨骼必须在载具骨骼资产中具有物理体碰撞。

文档改进​

我们的文档这个月经历了许多改进和修复,它正变得越来越自动化和健壮!

另外值得一提的是,我们成功修复了最大的问题,即链接指向页面中错误锚点的问题。

基础概念​

我们创建了新的基础指南概念,涵盖了 nanos world 所有重要的基本概念,帮助新手更好地入门开始编写脚本和制作模组!

这是每个人应该首先阅读的新初始指南!

基础概念getting-started/essential-concepts

更好的示例​

我们实现了新的示例格式,自动显示在每个函数/事件下方的下拉菜单中,并分组在每个页面的 # 示例 部分中:

标准 Lua 类​

我们在文档中新增了一个部分,列出所有标准 Lua 库 string、math 和 table,记录了其方法和示例!帮助新手学习 Lua 基础知识!

函数提示格式​

现在函数类型将有一个工具提示,告诉此函数将使用哪些参数调用,并详细描述每个参数!

表格提示格式​

此外,表格现在也有工具提示,描述预期/返回的表格格式!

枚举用法​

我们开发了一项功能,自动识别 API 中使用枚举的所有位置,并将它们全部列在每个枚举定义下:

日志文件​

日志文件现在按文件夹组织并按日期分隔,每次会话创建一个新的日志文件,以便更好地组织。

在服务器上,根目录下存在一个名为 .logs/ 的新文件夹来包含所有文件:

服务器精简资产​

这可能是我们为服务器所有者引入的最好的东西之一!现在可以在不需要在服务器上安装资产包的情况下启动服务器!

服务器端从来不需要资产文件,但直到上次更新我们仍然需要从资源库下载它,因为里面可能有地图包。

但由于我们有了新的地图包系统,服务器完全不需要资产文件,我们正在添加一个新的命令行标志 --use_vault_assets_lean!

此标志将告诉服务器不下载任何资产包(如果尚未安装),而是仅下载其 .toml 文件并以精简模式加载资产包!玩家仍将像往常一样从资源库下载所有资产。

工具与原生表格​

我们重组了工具类,并新增了 NanosTable 工具类!此类将包含处理 Lua 表格的实用方法!

我们还扩展了一些原生类,例如 string,为其添加了自定义辅助方法,如 StartsWith()、Trim() 和 EndsWith(),可以像这样在字符串上原生调用:

local my_string = "Hello Mom!"
local starts = my_string:StartsWith("Hello")
提示

添加到原生类的所有自定义方法都将使用 PascalCase。在文档中可以通过图标 或 来区分。

改进的 Esc 菜单​

我们继续改进 Esc 菜单,现在它与资源库集成,显示当前游玩的地图和游戏模式,还显示服务器徽标!

蓝图参数​

我们进一步改进了蓝图集成的实现,现在允许将任何虚幻结构体作为参数传递给它!

它通过动态迭代和解析所有结构体属性,并从作为参数传递的 Lua 表格中检索这些值来工作。

反之亦然。将虚幻结构体作为参数传递给 Lua 会将其解析为 Lua 表格!适用于原生和自定义结构体!

备注

一些虚幻结构体如 FTransform 或 FSlateBrush 具有一些复杂参数以及“假的” Setter/Getter,不允许正确解析。

对于其他类似的结构体,我们仍然需要实现自定义的与 Lua 之间的解析。如果你遇到更多类似的结构体并希望集成,请告诉我们!

新的调试设置​

我们在调试设置中新增了一个部分,允许我们使用模拟网络条件进行测试,这有助于我们(开发者)以及脚本编写者测试游戏在连接不良的玩家那里的表现!

我们可以用它模拟高延迟、有限带宽甚至丢包!

多客户端​

我们终于解决了启动多客户端实例的所有问题!现在你可以启动多个游戏实例来测试脚本的多人游戏方面,没有任何障碍,也不会因文件传输问题而被断开/踢出!

新的缓存系统​

我们实现了新的缓存系统!与旧系统相比它超级快,这意味着加载时间将大大减少!

缓存系统通过本地缓存资产哈希来加速加载时间,这样客户端/服务器只需验证它,而无需每次加入或打开服务器时重新计算整个文件的哈希(哈希文件是一个非常慢的操作)。

旧的缓存系统通过在 Assets/.cache/ 文件夹下为每个资产创建一个文件来存储缓存信息。但这导致了很多问题,因为访问操作系统文件系统来访问每个文件很慢,而且由于存在大量 .cache 文件,压缩资产文件夹也非常慢。

但现在我们改进了这个系统,每个资产包只有一个 .cache 文件!这使一切都超级快,加载时间现在大大提升!

客户端文件​

现在 File 类也是客户端的了!允许脚本编写者在客户端也创建和访问持久文件!

客户端的文件访问是沙盒化的,仅允许在 Packages/127.0.0.1/.transient/ 文件夹内,出于安全考虑不允许访问任何外部文件或文件夹。

这个小改动通过在客户端本地存储缓存和自定义保存文件,带来了许多其他可能性!

杂项改进​

我们还获得了一堆较小的杂项改进!

文件字符限制​

我们成功重构了内部对文件系统的访问,修复了 Windows 上不允许文件/资产超过 240 个字符的问题,该问题在尝试加载时会导致错误!

角色交互​

Character 现在始终计算交互对象,即使是在瞄准时。改善整体游戏手感。

加载屏幕时间​

这个月整体游戏加载时间极大改善!随着新缓存系统的加入以及我们做出的多项内部改进,我们将最低硬编码耗时从 3-5 秒降至 0.5 秒!现在加入服务器超级快!

鼠标事件​

现在鼠标事件将始终触发,即使 WebUI/控件在前方拥有焦点!

画布屏幕位置​

我们的 Canvas 类获得了多项改进,允许使用新的 screen_position 在屏幕上定位。构造函数参数,以及新方法 Resize()、SetScreenPosition() 和 SetAutoResize()。

这使得画布渲染到屏幕可以更加自定义!

结语​

总之,4 月对 nanos world 来说是激动人心的一个月,在改善新手入门体验方面取得了重大进展。文档的各种改进和新指南将对初学者产生巨大影响。

允许服务器无需下载资产即可启动的新功能也是一个改变游戏规则的功能,使自动化服务器安装和启动变得更简单。

此外,我们还解决了几个一直困扰大家的问题,包括同时连接多个客户端实例以及一个阻止游戏/服务器在 Windows 上加载长路径资产的漏洞。更不用说 WebUI 获得焦点时鼠标输入事件不触发的问题,这是一个反复出现的投诉,现在已完全解决!

总的来说,这是充满巨大可能性和新功能加入的一个月,再次非常感谢大家的支持!下个月见! 😁