跳至正文
Gabriel • SyedMuhammad
lead developer™

nanos world Lead Developer.

查看所有作者

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 提升到另一个健壮性水平!

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

9 月:维度!

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

维度!

维度 🌌​

我自豪地宣布 nanos world 最受请求集成的功能之一已实现:维度! 🥳

备注

在这个初始版本中,可能会出现漏洞、不同步和奇怪的事情,请立即告诉我!

维度是客户端中分开的世界,玩家和 Actor 在其中是分开的。默认情况下,所有玩家和实体都在维度 1 中。将玩家移到另一个维度后,所有不属于该维度的实体对该玩家来说都会被销毁,而新维度中的所有实体都会为他生成。

API 非常简单:

actor:SetDimension(number)

通过发送一个实体,它们的“子级”也会移动,例如:

  • 发送一个 Actor 时,所有其他附加的 Actor 也会随之移动。
  • 发送 Player 时,Character 会随之移动。
  • 发送 Character 时,Player 不会一起移动。 Weapon 或 Prop(以及附加物)会移动。
  • 发送 Vehicle 时,所有乘客也会被发送。

我还添加了一个新方法以便于使用事件:

Events.BroadcastRemoteDimension(dimension, event_name, params...)

此事件将发送给该维度中的所有玩家。

如果通过远程事件发送与玩家不在同一维度的实体,则参数将被替换为 nil,并显示警告。

新的瞄准阻挡动画​

我重做了武器在面向障碍物时被阻挡的方式。之前它会将 AimMode 切换为未瞄准,导致非常糟糕的效果,甚至使准星稍微移动。

现在武器会程序化弯曲,且 AimMode 不会改变,大大改善了游戏体验!

服务器同步值​

现在可以使用 Server.SetValue() 方法在服务器和客户端之间拥有全局同步值,新增了一个 bool 参数 sync_on_clients。这些值将像往常一样通过 Client.GetValue() 存在于所有客户端上。

蓝图改进​

我们的蓝图功能得到了增强!

事件调度器​

现在可以从 Lua 绑定到蓝图事件调度器了!使从蓝图到 Lua 的通信成为可能!

-- 生成蓝图
local blueprint = Blueprint(Vector(), Rotator(), "my-asset-pack::BP_AwesomeBlueprint",)

-- 订阅蓝图事件调度器
blueprint:BindBlueprintEventDispatcher("GorgeousDispatcher", function(self, arg1, arg2)
-- arg1 是字符串,arg2 是整数
Console.Log("从蓝图调用!", arg1, arg2)
end)

你可以在我们的新文档页面找到更多示例:蓝图通信!

函数返回值​

现在也可以从蓝图函数在 Lua 中获取返回值了!

传递 Actor​

我们可以通过参数在蓝图调用中传入和传出 Actor,在从 Lua 接收或发送时它们将被正确解析为对应的实体!例如你可以创建一个接收 Character 或 Actor 作为参数的蓝图事件,并通过 Lua 传递它,它将被自动解析并编组为正确的蓝图变量类型!

脚本事件变量​

现在我们的内部变量使用 8 字节传递浮点数和整数,允许通过事件(包括网络事件)传递更大的值!

Tick 性能提升​

我成功大幅提升了生成数千个实体时的性能(大多数是由关卡 StaticMesh 引起的。我实现了智能算法,根据距离和实体的实际 tick 需求来改进某些实体的 Tick 计算执行时机。

在某些情况下,这将 CPU 使用率提升了近 10 倍!

客户端网络主控​

新增的一项实验性功能是,如果玩家是该实体的网络主控,则允许在客户端调用方法。

例如,现在可以从客户端调用 TranslateTo、RotateTo、SetForce、AddImpulse、SetWeaponAimMode 和 SetViewMode!例如,这可以大大改善 Sandbox 物理枪的行为!

WebUI 原生表​

现在你不再需要对表使用 JSON.stringify() 来传递给 WebUI 事件了!你可以直接将它们作为参数传递,它将被原生解析,这意味着传递大表时性能更高,而且你不再需要担心字符串化或解析它们,因为它们已经以原生表的形式作为参数传入!

File JSON 解析器​

我们的 File 实体获得了一个新方法,可以原生加载 JSON 文件并将其表获取到 Lua 中:

File.ReadJSONAsync()
File.ReadJSON()

与将其作为原始字符串读取并使用 Lua JSON 库相比,我们获得了巨大的性能提升:

加载一个大 JSON 文件(9.5 MB)的基准比较
使用 Lua JSON 库解析:耗时 9964ms。
使用原生 JSON 解析器解析:耗时 1057ms。

CEF 改进​

加载屏幕​

我完成了将 CEF 集成到加载屏幕的工作,现在 Ultralight 已完全从 nanos world 中移除。

我们还为加载屏幕添加了一项新功能:能够停止主菜单音乐!为此你需要从 JS 调用一个事件:

Events.Call("StopMenuMusic");

更好的错误处理​

错误处理也得到了改进,之前我们在加载无效文件时没有错误反馈,现在有了。

Character 混合空间​

现在可以将自定义运动混合空间导入到你的 Character 中。你可以覆盖站立、下蹲和卧倒动画。还可以设置它们之间的过渡动画!

我们为此添加了新的 API 方法:

Character.SetAnimationIdleWalkRunStanding(anim_path, enable_tip)
Character.SetAnimationIdleWalkRunCrouching(anim_path, enable_tip)
Character.SetAnimationIdleWalkRunProning(anim_path)

Character.SetAnimationsTransitionStandingCrouching(anim_standing_to_crouching, anim_crouching_to_standing)
Character.SetAnimationsTransitionCrouchingProning(anim_crouching_to_proning, anim_proning_to_crouching)

你可以在我们的新文档页面找到更多示例:Character 运动动画!

预缓存资产​

现在可以预缓存资产使其在加载屏幕中加载(避免游戏过程中的 FPS 峰值),为此你只需调用:

Assets.Precache(asset_path)
备注

所有资产在引用后都会自动预缓存,所以这个新方法在需要预缓存将来使用或动态加载的资产时很有用。

更好的穿墙射击​

我们的射击穿墙效果不能正常工作,我决定重做它。现在穿射水体的距离远达 10 倍,造成的伤害也更大(之前子弹无法穿透水体)。

我们还添加了一个新的调试设置来在世界中绘制武器的子弹轨迹,对调试非常有用:

帧率​

我们的主菜单得到了一些改进,FPS 限制被硬编码提升到 120(之前是 60),加载期间提升到 60(之前是 30),这仍然不够好,因为我想让它自动限制到显示器刷新率。

标签​

我们的标签页获得了新标签以改善用户体验,主要是在创建新游戏时。现在无需进入那些菜单就能知道你已经选择了多少依赖项:

新游戏​

此外,在新游戏菜单中,现在所有配置(包括依赖项)都从磁盘的 Config.toml 文件加载。所以我们不必每次启动服务器时都重新配置它!

调试设置​

我们获得了 3 个新的调试设置:

  • Visualize Bullet Traces
  • Visualize Vehicle Doors
  • Visualize Character Capsule

杂项改进​

本月我们还获得的其他一些改进和小型新功能:

  • 载具现在会接收 TakeDamage 事件!
  • 现在可以通过新的 SetShowFlags() 方法切换一系列 SceneCapture 渲染功能。
  • 我们的控制台在客户端侧获得了多项改进。
  • 现在可以将材质、WebUI 和 SceneCapture 绘制到 Canvas 中(实验性)!
  • 我在脚本 API 中实现了一种支持多个返回值的方式,因此一些方法将开始支持这一特性!
  • 现在如果发生任何失败,数据库将返回一个错误参数。
  • 所有角色交互(抓取道具、拾取武器、进入载具)都已重做,现在与大物体交互时的追踪是 100% 精确的。此外,我还移除了为此所需的额外组件,这将提升在生成过多可交互物体时的性能。

结语​

本月我们取得了许多重大进展!蓝图改进对我来说是一项巨大成就,因为我不得不对虚幻引擎进行庞大的逆向工程,并使用多种内存技巧来拦截事件。

维度的加入是一项呼声极高的功能,极大地扩展了游戏创作的限制!

性能改进总是非常受欢迎的,我也乐于进行这些改进,我们仍有很大的进一步提升空间!

此外,我投入了一些时间进行内部的大规模重构,部分代码开始变得臃肿混乱,并且没有使用最现代的 C++20 技术。有时候这些重构对于重新掌控我们自己的代码非常有帮助。 😄

在接下来的更新中,我计划重新组织 API(正如我们在上次 #poll 中讨论的那样),我们添加的方法开始在静态类中积累,而它们之间缺乏凝聚力。我打算将它们分开,并为每个创建新的静态类,使理解和搜索 API 中的方法变得更加容易。

我开始实现的另一项改进是实体支持多个构造函数。这将使我们能够以更精简的方式生成实体。例如,如果我们想生成 2D 或 3D 声音,这将非常有用(2D 声音不需要位置参数)。

这就是本月的全部内容,下个月我将带来更多改进和新闻!非常感谢! 💖

8 月:API、自动文档以及更多!

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

开源 API、自动生成文档及更多!

又一个月过去了,以下是期间发生的事情的总结!

开源 API​

本月,我们在整个社区的帮助下创建了官方 nanos world API,这是一个有组织的所有类、静态类、工具类、结构体及其所有函数和事件的集合。我们这样做是为了有一个官方的地方可以获取 nanos world 的所有脚本。

VSCode 扩展​

有了 API,就可以专业化 nanos world for VSCode 扩展,由 @Derpius 创建。现在它使用 API 生成所有 Lua 存根!

这样,API 中的所有更新直接反映在 VSCode 扩展上,始终保持更新!

别忘了给它评分 😉。

智能文档​

我们的文档在底层经历了完整的重构!现在所有脚本参考页面都使用我们的新 API 自动生成!这是向前迈出的一大步,因为之前我在每个页面中分别编写每个函数。现在我只需要更新一个 JSON,文档就会正确构建!

不仅是自动化,现在我们有一些交互式弹出窗口,当你悬停时显示类/结构体/函数的更多信息!这将极大地帮助新人理解 nanos world 的基础知识!

新 UI(控制台和聊天)​

我更新了我们剩余的控制台和聊天的旧设计 UI!现在它们与菜单风格相同!

新的性能分析统计信息​

我添加了一个实时性能分析视图,用于显示游戏和脚本的性能信息。它显示操作累积花费的时间以及最后一秒帧内的平均值。

它对于调试和查找核心游戏及你的包中的瓶颈非常有用!它显示每个包的单独事件以及它们执行所需的时间。

触发器白名单​

现在触发器可以在构造函数中传递一个列表,以便仅对特定类触发!这有助于脚本编写者更加关注性能,并减少在 Lua 端检查触发的实体是否为我们想要的类型所需的大量校验!

-- 仅触发角色和载具
local trigger = Trigger(
Vector(), -- 位置
Rotator(), -- 旋转
Vector(100), -- 范围
TriggerType.Sphere, -- 触发器类型
true, -- 是否可见
Color(1, 0, 0), -- 颜色
{ "Character", "Vehicle" } -- 仅重叠类
)

SceneCapture 仅渲染​

SceneCapture 获得了新方法,仅渲染通过参数手动设置的 Actor。这允许在仅渲染特定实体(例如角色)时使用透明背景。

SceneCapture.AddRenderActor(actor)
SceneCapture.RemoveRenderActor(actor)
SceneCapture.ClearRenderActors()

近战改进​

Melee 类获得了几项改进,包括新方法和事件,使其更加灵活。你现在可以根据击中的表面设置攻击动画和撞击声音列表!它还获得了一个新事件 Attack,在攻击发生时触发。更不用说近战上也进行了几个漏洞修复和改进!

Melee.AddAnimationCharacterUse(asset_path, play_rate, slot_Type)
Melee.SetImpactSound(surface_type, asset_path, volume, pitch)

新追踪​

我添加了两个新的追踪方法 Trace.LineSingle() 和 Trace.LineMulti(),取代旧的 Trace。这些新方法现在接收一个 trace_mode 参数,支持以按位标志传递多个参数,这种新的参数传递方式非常适合未来更新,因为它不会增加破坏性更改,并且还减少了方法中所需的参数数量。

例如,你可以这样传递:

-- 追踪复杂碰撞,将实体作为实体表值返回,并在世界中绘制调试线。
TraceMode.TraceComplex | TraceMode.ReturnEntity | TraceMode.DrawDebug

性能改进​

我一直在努力提高性能,这是我的主要优先事项之一。现在有了新的性能分析统计信息,我们能够更快地找到瓶颈!

我们在瞄准时以及血液贴花/粒子生成方面的性能有了很大改进。现在血液会考虑所有效果可扩展性设置级别,根据此生成更多/更少。

我意识到在生成数万个实体时(实体 Tick 时间)会导致性能下降的“问题”,我正在思考解决方案。问题出现是因为每个实体每帧都被“tick”,所以数千个实体意味着每帧数千个更多的 tick。

原生 LoadPackage​

我在 Package.LoadPackage() 方法上做了很大改进,实现了 Lua 代码的原生加载。因此你在加载文件中返回的任何内容都将在加载器侧正确接收!之前它对返回的数据进行丑陋而奇怪的序列化/反序列化,现在它的行为像原生操作符!

CEF 改进​

我仍在不断改进和调整与 CEF 集成的边缘问题。上个月我修复了几个漏洞和崩溃,并致力于性能改进,仍有一些点需要改进,还有一个我关注的漏洞需要纠正。

此外,我将始终使我们的 CEF 版本保持最新,它刚刚更新到 104.4.26,我们的版本也更新了!

新游戏设置​

我们的设置获得了可以更改的新选项:

  • 在世界中绘制网络调试
  • 在屏幕上显示网络统计信息
  • 自动重新对齐视角
  • 视场角可被玩法更改

认证网站重新设计​

@MegaThorx 对我们的认证网站进行了大规模重构,现在支持深色模式和新的 UI/UX 以获得更好的可用性!

大量漏洞修复​

值得一提的是我们本月获得的大量漏洞修复和改进,这些都写在我们 Discord 的更新日志中。

一些例子包括:使用触发器时导致服务器死锁的漏洞(服务器冻结)、使用协程时导致崩溃的漏洞、日志重复、UX 问题、服务器缓存不工作(加载需要数分钟)、主菜单崩溃等等!

社区亮点​

向法国 🇫🇷 社区大声致意,他们在服务器上发展了很多!特别是 Mouloud,他正在为 nanos world 创建令人惊叹的包!

结语​

许多事情正在改进,漏洞正在修复,API 的创建和文档的自生成正在改变生活(尤其是对我来说,现在用新内容更新文档要容易得多),对于所有脚本编写者也是如此,他们可以依赖 100% 基于官方 API 的 VSCode 扩展。

我再次强调在我们的反馈中心发布想法并投票的重要性。例如很明显,目前每个人最大的需求是维度 😜。

另外,也不要犹豫在我们的问题追踪器中发表漏洞。如果你在那里发布你的漏洞,它被修复的几率增加 10000%。

这个月就到这里,再次感谢大家的支持!!!

7 月:CEF、设置菜单与改进!

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

CEF、设置菜单及多项改进!

经过漫长的时间和无数的请求(以及死亡威胁),我终于宣布与 CEF(Chromium 嵌入式框架) 集成的重大惊喜!

Chromium 嵌入式框架​

对于不熟悉的人来说,CEF 是一个用于在其他应用程序中嵌入基于 Chromium 的浏览器的框架。大致相当于我们的 WebUI。

在此之前我们一直使用我们亲爱的 Ultralight,它起初非常有前途,但由于它是一个专有库,而且不幸的是开发者最终投入项目的时间越来越少,我们开始因缺少功能或未解决的漏洞而受损。

由于我们不能依赖于此,我决定尝试集成更加成熟的框架 CEF。但实现起来一点也不容易。 CEF 使用各种子进程来工作,我发现我必须自己实现。想起大学时的操作系统课程,我打了好几个寒颤。 😜

最终,我成功创建了一个完全合适的集成,包括一个构建自动化,以便在 D+1 总是获取最新的 CEF 安全更新!

进程​

但由于并非一切都是美好的,使用 CEF 既有优点也有缺点。由于其多进程特性,一方面一切都在并行运行(+++性能),另一方面我们有一个缺点,即渲染总是延迟 1 或 2 帧,这可能会导致“输入延迟”效果,但在实践中这不是大问题,几乎察觉不到。

CEF 使用子进程,这意味着每个 WebUI 将完全独立于游戏和其他 WebUI 运行,以极高的效率使用 100% 的计算能力!

这意味着现在所有通信都是异步的。因此,Lua <-> WebUI 之间的所有事件也是异步的,这是一个已经改变的范式,在大多数情况下应该不是问题。但这是并行性带来的“效果”。

另一个变化是,在玩 nanos world 时我们会有多个子进程启动和关闭(就像 Chrome 😝)。这取决于生成的 WebUI 数量,由 CEF 自动管理。

声音​

我们获得的另一个好处是声音!我为 WebUI 类添加了一个新方法:WebUI:SpawnSound(),它会生成一个 Sound 对象(一如既往地 100% 可自定义)。换句话说,你可以生成任意数量的 3D 声音实体,甚至可以用它们搭建一个 7:1 影院! 😆

性能​

如前所述,我们获得了大量性能提升。当然,我会继续改进实现并随着时间的推移进一步提升,但我们已经能看到巨大的改进!看看这段视频,我同时生成了几十个 WebUI 并将它们渲染到世界中的 3D 物体上,没有一丝卡顿:

它能同时处理多少个视频?可以。

调试工具​

现在可以通过第三方工具直接检查你的 WebUI,例如 Chrome 开发者工具! 🥳

迁移​

另外,还有一个好消息:这次迁移将实现 0% 的破坏性更改!没有任何脚本需要更新就能继续与 CEF 配合工作! 💃

显然有些东西已经改变,尤其是与 CSS 相关的部分。在 WebKit 浏览器中(就像之前那样),某些样式的表现与 Chromium 不同。现在某些布局 可能 看起来不太协调(例如不同的滚动条)。

设置菜单​

终于,我们的设置菜单也获得了 UI 更新!我从头重新创建了它,以适应新的界面风格!

视频设置:​

按键绑定设置:​

我们有了一个新的维护设置标签页,可以在那里清理安装中的缓存文件、日志和其他文件:

我们还添加了一个新设置:强制不使用自定义加载屏幕,用于禁用服务器的自定义加载屏幕。

统计信息与成就​

这个月我花时间调整了我们的统计信息和成就。新的个人资料统计信息标签页已经实现:

我创建了一些新的统计信息,如游泳或驾驶,并且我创建了“成就等级”的概念,为它们添加了青铜、白银和黄金级别。让我们看看这个模型的效果如何。 😉

成就通知方面做出了重大改进:现在达成时会立即显示!(之前它们每分钟只同步一次,延迟了通知)。

新成就创意​

我在 Canny 上创建了一个新页面来接收新的 Steam 成就建议!请看一看,投票并添加新的!我会一直将新的成就整合到游戏中!

https://nanos-world.com/feedback/ideas

资源库更新日志​

在资源库方面,我为项目实现了更新标签页,你可以在那里看到它们更新中的所有变更!

缓存与加载​

我做的一个重大改进是重构了缓存系统。我们已经有一个缓存系统,在客户端缓存已加载的资产,这样在重新连接到服务器时文件校验是即时的。

我重构了这个系统,现在所有缓存文件都在一个外部文件夹中(在 Packages/ 和 Assets/ 内,名为 .cache/),这甚至方便了它们的清理。

此外,在打开服务器时,每次资产都被加载并缓存在内存中,这非常慢。有了这个新系统,它们仍然会被加载但快得多,系统会智能地识别变更,并且只重新缓存自上次加载以来变脏的文件。

这将极大地提高服务器的开启速度。

文档改进​

我花了一些时间更新了文档中的一些页面。

我将继续改进文档,以减少冗余,让模组制作者和脚本编写者更容易上手!我发现文档开始变得有点混乱,因为有一些重复内容和一些教程放在奇怪的位置,这些也会得到改进!

显著更改​

一些较小但显著的更改。

WebUI 3D 交互​

这与 CEF 并不完全相关,但我借此机会集成了允许向 WebUI 注入事件并为其创建遥控器的方法:😜

它使用追踪从电视网格体上的命中点获取 UV 位置,然后将其作为 WebUI 事件重定向。

包地图​

我为包添加了一个新设置:compatible_maps,与地图设置 compatible_game_modes 配对。两个设置联合起来,在启动新服务器时在新游戏弹出窗口中显示兼容的地图。

Discord 常见问题频道​

我们的 Discord 新增了一个常见问题频道,包含关于 nanos world 的最常见问题。随着时间的推移会添加更多!

Unreal 5.0.3​

我将游戏的虚幻引擎版本更新到了最新的补丁 5.0.3,包含大量引擎漏洞修复。此更新没有破坏性更改。

结语​

这是 nanos world 取得巨大进步、多项漏洞修复和结构改进的一个月。我们进一步改进了 UI,并解决了长期困扰我们的 WebUI 问题。

我强调在 https://nanos-world.com/feedback/ideas 上创建和支持想法的重要性。将它们正式化非常重要,这样才能了解你们最迫切的需求!以下是 7 月反馈摘要:

非常感谢!你们是最棒的!

6 月:生日、品牌重塑与 UI 重新设计!

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

生日、品牌重塑与 UI 重新设计!

nanos world 生日 🥳​

首先,我们想宣布上周是 nanos world 高强度开发的 3 周年生日!当然,创建它的想法比这更早。

从我们开始着手它以来已经过了很长时间,对我来说这是一段学习很多的时期,对 nanos world 来说则是取得了大量进展!

我想(再次)感谢大家一直以来给予的巨大支持!我真的很喜欢开发 nanos world,也喜欢看到你们在上面游玩、使用和创作!制作 nanos world 已成为我人生中最大的热爱之一 😍!

品牌重塑​

nanos world 一直关乎多个世界,更具体地说,是你的世界,在这里你可以表达自我,创造你一直想要的宇宙。

随着游戏开发的推进,在某些方面进行进化变得必要。在营销方面,主要目标是将 nanos world 传递给合适的潜在玩家,为实现这一点,我们必须重新思考一些事情,其中之一就是重建我们的视觉身份!

我们的旧身份在可发现性和专业性方面有所欠缺,所以我们决定是时候制作一个新版本了!我们知道这可能还不是最终版本,会随着时间推移不断改进,但它已经朝着我们的中短期目标迈出了一大步!

对于徽标,我们的目标是更简约而不失专业。

由于 nanos world 代表着广泛的游戏模式和多样化的世界,我们决定创建当前徽标的新版本,具有:

  • 😮 扁平轮廓风格。
  • 🤯 全新标题和副标题设计及字体。
  • 😶‍🌫️ 圆环变成了无限符号,带来无限的感觉。

新封面图​

为了表达多样性的理念,我们正在创作新的封面图,将用于 Steam 上的胶囊图,当然也为视觉标识做出贡献!

因此我们构思创作一个生机勃勃的星球,上面发生着许多事情,代表 nanos world 中游戏模式的多样性,就像沙盒游戏应有的样子。

这将是一张巨大的图像(8-16K),每次放大你都会发现新东西(完整尺寸图像将在游戏内和网站™上提供 😉)!

备注

封面图尚未最终确定,仍由艺术家™开发中,最终版本还会有一些调整!

一些开发中的胶囊图草图:

提示

感谢 Pablo (PG Ninja) 创作此艺术图。

动机​

即使在 Steam 内部,一个非常重要的因素是游戏如何自我推广。这主要取决于两个因素:胶囊图与 Steam 标签。

Steam 标签决定你的游戏是否会展示给浏览 Steam 商店的用户。而胶囊图质量决定他们是否会点击你的游戏,胶囊图是购物者看到的第一样东西,它们出现在商店浏览列表或打开游戏页面时。

我们当前的胶囊图是这张乏味的截图加简单文字叠加 😅:

这甚至是极其不可取的,因为它显示出业余感,让浏览 Steam 的人无意识地忽略它,此外图像没有传达游戏类型,使对沙盒游戏感兴趣的人也不会点击页面。

因此对于封面图的第一个版本,我们希望让它更专业一些,至少能最低限度地传达“沙盒”类型。

灵感来源​

我们的想法是创作一张生机勃勃的星球图像,上面发生着各种事情,代表沙盒游戏的多样性,所以我们从代表这一理念的游戏艺术和图像中汲取了一些灵感,比如游戏 Universim 和一些找到的图库图片:

草图​

我们的创作过程经历了一些在画图软件中制作的草图,直到达到当前进行中的版本:😜

除了品牌重塑,我们还努力重新设计了 nanos world 的主菜单!

首先,我们要感谢所有为新设计提供想法和建议的人,特别是 Falaxir,他创建了多个相关想法帖,为我们开发这个新版本提供了极大的灵感!

动机​

主菜单是所有玩家的门户,也是游玩时的第一印象,它需要直观并鼓励玩家选择正确的操作。

我们考虑了以下支柱:

  • 🎮 玩家优先:必须首先考虑普通玩家,那些将选择游戏模式或只是连接到服务器游玩和娱乐的人。
  • 🐣 新手友好:开始新游戏或添加自定义插件应该极其简单直观。即使对服务器一无所知的人也应该能轻松开始游戏与朋友一起玩。
  • 🤏 少即是多:用户体验必须尽可能最佳。按钮和导航必须直观,无需明确的教程或文字。
  • 🍃 流畅性:新页面必须立即打开,不应发生卡顿,筛选器应立即应用更改,页面与数据之间不应发生不同步。
  • 🥰 温馨之地:它必须热情友好,玩家必须想花时间在游戏里,他们必须想打开游戏看看发生了什么。
  • 🤩 激励模组制作者与脚本编写者:它必须鼓励内容创作者创作并上传到资源库。
  • 📰 新闻应该激动人心:资源库物品甚至游戏的更新应该令人愉悦且激动地阅读和更新。
  • 🔍 便于发现:新游戏模式和内容应易于找到,最好的内容也应得到赞扬。
  • 🆕 扩展可能性:新菜单应允许新的视野,应易于集成通知系统、大厅、收藏等。

主屏幕​

在旧主页中,我们将好友、成就和新闻分为单独的标签页:

不久之后我们推出了新的主页:一个中心枢纽,你可以查看好友摘要、成就、收藏服务器、资源库新闻和游戏更新!

备注

一些按钮和功能尚未启用,将很快™推出。这个初始版本旨在包含所有旧功能以及一些更多功能 😉。

资源库​

我们的资源库基本上只用于下载/管理附加内容,可以浏览商店/远程和你的本地内容并查看其简要信息:

现在它已重新设计,提供全新的用户体验,提供筛选器和全新布局:

新的资源库导航除了继续提供快速安装/更新/卸载按钮外,现在还提供快速全部更新按钮,可一次更新所有已安装的过时项目。更不用说性能改进以及与其他页面和系统的互联!

提示

这个新版本有多项优化改进,例如磁盘图像缓存或虚拟化列表显示 😁!

资源库详情​

我们彻底重新思考了资源库概念,并创建了新的详情屏幕,当打开资源库(或新游戏)项目时将打开:

此屏幕的目的是提供关于包或资产包所有可能的信息:描述、截图、更新、版本、大小、评价、依赖项,现在还可以评分,并很快™能通过界面进行配置。

你可以在右侧管理你的评价、安装和更新!

选择游戏模式时,右下角会出现主持新游戏按钮,本博客下方将更好地解释这一点。

新游戏屏幕​

在旧的新游戏页面中,游戏模式分为两个不同的列表:已安装和本地,可以选择其中一个游戏模式(或“无”)来启动服务器。

在新设计中,新游戏 -> 选择游戏模式 -> 开始游戏 的流程保持不变。但现在我们有了新界面和筛选器,还可以按热门、最近更新或最高评分游戏模式排序,并且可以按名称或筛选开关进行筛选。

此外,此流程现在允许你在未安装包的情况下开始新游戏,无需事先从资源库浏览并安装!

选择游戏模式时,将出现相同的详情页面(就像资源库一样)。按下主持新游戏后,将出现服务器设置弹窗:

我们创建了“单人”游戏的概念,实际上底层是同一个服务器,但配置为只允许一个人且不在服务器列表中公布。

我们还改进了附加包/资产包的选择,使选择更具功能性和直观性,现在你可以在关闭选择弹窗前一次选择多个。

这个新流程的主要思想是允许快速创建新游戏,立即所需的信息更少。

备注

很快™我们计划整合新的“游戏模式”配置概念,每个游戏模式都可以在开始前设置自己的配置!

查找服务器​

查找服务器的旧界面相当简单:

新版本在美学上有所改进,现在我们有自定义筛选器和按钮显示的改进(它们只在悬停时出现):

现在可以收藏 ⭐ 服务器了!

加载屏幕​

加载屏幕也没有被遗漏!我们重新设计了它,让你能真正了解加载进度。现在除了加载接近结束时背景色变亮外,左下角还有 4 个条显示完成加载所需的每个步骤!

备注

计划对加载屏幕进行进一步改进,因为现在开始新游戏时我们仍然没有“很多”关于服务器启动进度的信息。

个人资料与好友​

我们还为你的个人资料和查看好友设置了专用屏幕。在此屏幕中,你可以查看某人的信息或跟随他进入服务器。

点击你自己的个人资料,你将™能够访问额外标签页,如成就、统计信息以及很快还有账户配置!

结语​

而这仅仅是开始!你知道我们的进化一直非常有机,采纳和调整建议及新想法,让 nanos world 成为有史以来最好的现代沙盒体验!而这正是对我们最重要的!

如果你对徽标和界面有改进的想法或建议,欢迎在我们的 Discord 中提出,我们将洗耳恭听!

此外,如果你有内容上传到 nanos world 商店,请更新其描述、截图以及你的团队信息(现在支持图片 😉),让它在游戏内更漂亮!

我们将在接下来几天尽快将此博客更新推送到游戏和所有官方页面,敬请关注!

感谢这个月的支持与奉献! 🥰